Question

Environment: SQL Server 2008 R2. No access to correct tools (sql server management studio, etc). Having to create in an advanced sql tab of a campaign management GUI (so can only see what is wrong by looking at logs!).

Problem: I am trying to create a dynamic sql view that references numerous temporary tables that have their tablenames listed within a system table. My background is in oracle and VBA, I don't have a lot of knowledge in SQL Server. The reason that I need to do this dynamically is because every time the segments are updated in the GUI the back-end temporary table name changes. So I need an on-demand routine that will allow me to know what their point-in-time temporary table names are.

View that I would like to create in Procedure (can change based on number of tables with prefix "%EX_MBR%')

    Create view dbo.VW_Exclusions_Matrix as select a.durable_mbr_acc_id
,case when TB_EX_MBR_COMPLAINTS.durable_mbr_acc_id is null then 'N' ELSE 'Y' END AS EX_MBR_COMPLAINTS
,case when TB_EX_MBR_DECEASED.durable_mbr_acc_id is null then 'N' ELSE 'Y' END AS EX_MBR_DECEASED
,case when TB_EX_MBR_DO_NOT_EMAIL.durable_mbr_acc_id is null then 'N' ELSE 'Y' END AS EX_MBR_DO_NOT_EMAIL
,case when TB_EX_MBR_DO_NOT_MAIL.durable_mbr_acc_id is null then 'N' ELSE 'Y' END AS EX_MBR_DO_NOT_MAIL
,case when TB_EX_MBR_DO_NOT_MARKET_ALL.durable_mbr_acc_id is null then 'N' ELSE 'Y' END AS EX_MBR_DO_NOT_MARKET_ALL
,case when TB_EX_MBR_DO_NOT_PHONE.durable_mbr_acc_id is null then 'N' ELSE 'Y' END AS EX_MBR_DO_NOT_PHONE
,case when TB_EX_MBR_DO_NOT_SMS.durable_mbr_acc_id is null then 'N' ELSE 'Y' END AS EX_MBR_DO_NOT_SMS
,case when TB_EX_MBR_EMAIL_BOUNCE_HARD.durable_mbr_acc_id is null then 'N' ELSE 'Y' END AS EX_MBR_EMAIL_BOUNCE_HARD
,case when TB_EX_MBR_EMAIL_BOUNCE_SOFT.durable_mbr_acc_id is null then 'N' ELSE 'Y' END AS EX_MBR_EMAIL_BOUNCE_SOFT
,case when TB_EX_MBR_FIN_PLAN_REFERRAL.durable_mbr_acc_id is null then 'N' ELSE 'Y' END AS EX_MBR_FIN_PLAN_REFERRAL
,case when TB_EX_MBR_NO_CONTRIBS_12MTHS.durable_mbr_acc_id is null then 'N' ELSE 'Y' END AS EX_MBR_NO_CONTRIBS_12MTHS
,case when TB_EX_MBR_INVALID_TFN.durable_mbr_acc_id is null then 'N' ELSE 'Y' END AS EX_MBR_INVALID_TFN
,case when TB_EX_MBR_OVERSEAS.durable_mbr_acc_id is null then 'N' ELSE 'Y' END AS EX_MBR_OVERSEAS
,case when TB_EX_MBR_STAFF.durable_mbr_acc_id is null then 'N' ELSE 'Y' END AS EX_MBR_STAFF
,case when TB_EX_MBR_RESEARCH_OPT_OUT.durable_mbr_acc_id is null then 'N' ELSE 'Y' END AS EX_MBR_RESEARCH_OPT_OUT
from (dbo.UACS_1843_y a LEFT JOIN dbo.uacs_1799_1m TB_EX_MBR_COMPLAINTS on a.durable_mbr_acc_id = TB_EX_MBR_COMPLAINTS.durable_mbr_acc_id)
LEFT JOIN dbo.uacs_1799_1n TB_EX_MBR_DECEASED on (a.durable_mbr_acc_id = TB_EX_MBR_DECEASED.durable_mbr_acc_id)
LEFT JOIN dbo.uacs_1799_1o TB_EX_MBR_DO_NOT_EMAIL on (a.durable_mbr_acc_id = TB_EX_MBR_DO_NOT_EMAIL.durable_mbr_acc_id)
LEFT JOIN dbo.uacs_1799_1p TB_EX_MBR_DO_NOT_MAIL on (a.durable_mbr_acc_id = TB_EX_MBR_DO_NOT_MAIL.durable_mbr_acc_id)
LEFT JOIN dbo.uacs_1799_1q TB_EX_MBR_DO_NOT_MARKET_ALL on (a.durable_mbr_acc_id = TB_EX_MBR_DO_NOT_MARKET_ALL.durable_mbr_acc_id)
LEFT JOIN dbo.uacs_1799_1r TB_EX_MBR_DO_NOT_PHONE on (a.durable_mbr_acc_id = TB_EX_MBR_DO_NOT_PHONE.durable_mbr_acc_id)
LEFT JOIN dbo.uacs_1799_1t TB_EX_MBR_DO_NOT_SMS on (a.durable_mbr_acc_id = TB_EX_MBR_DO_NOT_SMS.durable_mbr_acc_id)
LEFT JOIN dbo.uacs_1799_1u TB_EX_MBR_EMAIL_BOUNCE_HARD on (a.durable_mbr_acc_id = TB_EX_MBR_EMAIL_BOUNCE_HARD.durable_mbr_acc_id)
LEFT JOIN dbo.uacs_1799_1v TB_EX_MBR_EMAIL_BOUNCE_SOFT on (a.durable_mbr_acc_id = TB_EX_MBR_EMAIL_BOUNCE_SOFT.durable_mbr_acc_id)
LEFT JOIN dbo.uacs_1799_1w TB_EX_MBR_FIN_PLAN_REFERRAL on (a.durable_mbr_acc_id = TB_EX_MBR_FIN_PLAN_REFERRAL.durable_mbr_acc_id)
LEFT JOIN dbo.uacs_1799_1j TB_EX_MBR_NO_CONTRIBS_12MTHS on (a.durable_mbr_acc_id = TB_EX_MBR_NO_CONTRIBS_12MTHS.durable_mbr_acc_id)
LEFT JOIN dbo.uacs_1799_1s TB_EX_MBR_INVALID_TFN on (a.durable_mbr_acc_id = TB_EX_MBR_INVALID_TFN.durable_mbr_acc_id)
LEFT JOIN dbo.uacs_1799_1x TB_EX_MBR_OVERSEAS on (a.durable_mbr_acc_id = TB_EX_MBR_OVERSEAS.durable_mbr_acc_id)
LEFT JOIN dbo.uacs_1799_1y TB_EX_MBR_STAFF on (a.durable_mbr_acc_id = TB_EX_MBR_STAFF.durable_mbr_acc_id)
LEFT JOIN dbo.uacs_1861_c TB_EX_MBR_RESEARCH_OPT_OUT on (a.durable_mbr_acc_id = TB_EX_MBR_RESEARCH_OPT_OUT.durable_mbr_acc_id)

The view has currently been created using Excel formulas and it works. I'm trying to recreate the formula logic in the procedure below... but I don't know what I'm doing.

First go at the Procedure (do I even need a procedure?)

CREATE PROCEDURE GenerateExclusionMatrix
AS
SET NOCOUNT ON;

Declare @sqAll nvarchar(8000), @sq1 nvarchar(1000), @sq2 nvarchar(1000), @UnicaBase varchar(100), @UnicaFieldName nvarchar(100), @UnicaTempTable nvarchar(100), @TableAlias nvarchar(100), @cnt int := 0;
Declare curP cursor For select Name as Var_FieldName, TempTableName as Var_UnicaTempTable, Name as Var_TableAlias FROM dbo.UA_Segment WHERE dbo.UA_Segment.name like '%EX_MBR%' and activeflag = 1;

SET @sq1 = ''
SET @sq2 = ''

@sq1 = 'CREATE VIEW dbo.VW_EXCLUSIONS_MATRIX AS SELECT a.durable_mbr_acc_id '

OPEN curP 
Fetch Next From curP Into @UnicaFieldName, @UnicaTempTable, @TableAlias

While @@Fetch_Status = 0 Begin

SET @UnicaBase = (select distinct TempTableName as Var_UnicaBase FROM dbo.UA_Segment a WHERE a.name = 'IN_MBR_ACTIVE_OR_DEEMED' and ActiveFlag = 1)

open cursor

@cnt := @cnt + 1;
@sq1 := @sq1 + ',case when TB_' + @TableAlias + '.durable_mbr_acc_id is null then '''N''' ELSE '''Y''' END AS ' + @UnicaFieldName                       

IF (@cnt = 1)      
    @sq2 := @sq2 + ' from (dbo.UACS' + @UnicaBase + ' a LEFT JOIN dbo.UACS' + @UnicaTempTable + ' TB_' + @TableAlias + ' on a.durable_mbr_acc_id = TB_' + @TableAlias + '.durable_mbr_acc_id)'
ELSE
    @sq2 := @sq2 + ' LEFT JOIN dbo.UACS' + @UnicaTempTable + ' TB_' + @TableAlias + ' on (a.durable_mbr_acc_id = TB_' + @TableAlias + '.durable_mbr_acc_id)'
END IF

Fetch Next From curP Into  @UnicaFieldName, @UnicaTempTable, @TableAlias
End 

@sq1 = @sq1 + @sq2 

Close curP

Deallocate curP

    exec sp_executesql @sq1

END;

I hope that this makes sense. Any help greatly appreciated.

Cheers,

James


syntax updated after feedback - 3:11pm 14/2/2014


Was it helpful?

Solution

I could not test the code, but you could try something that doesn't use cursors (they are not required here)

CREATE PROCEDURE GenerateExclusionMatrix 
AS  

   DECLARE @UnicaBase nvarchar(100) 
   SET @UnicaBase = (select TempTableName as Var_UnicaBase FROM dbo.UA_Segment a WHERE a.name = 'IN_MBR_ACTIVE_OR_DEEMED' and ActiveFlag = 1)

   DECLARE @SQL1 NVARCHAR(MAX) = 'CREATE VIEW dbo.VW_EXCLUSIONS_MATRIX AS SELECT a.durable_mbr_acc_id '
   select @SQL1 = @SQL1 + ',case when TB_' + Name + '.durable_mbr_acc_id is null then ''N'' ELSE ''Y'' END AS ' + Name
   FROM dbo.UA_Segment 
   WHERE dbo.UA_Segment.name like '%EX_MBR%' and activeflag = 1;


   DECLARE @SQL2 NVARCHAR(MAX) = 'from (dbo.UACS' + @UnicaBase + ' a '
   select @SQL2 = @SQL2 + ' LEFT JOIN dbo.UACS' + TempTableName + ' TB_' + Name + ' on a.durable_mbr_acc_id = TB_' + Name + '.durable_mbr_acc_id'
   FROM dbo.UA_Segment 
   WHERE dbo.UA_Segment.name like '%EX_MBR%' and activeflag = 1;

   DECLARE @SQL NVARCHAR(MAX)
   SET @SQL = @SQL1 + @SQL2 


   exec sp_executesql @sq1

END;

UPDATE: I could not run, but the generate dynamic sql to create can be viewed in http://sqlfiddle.com/#!3/bc9a9/1/0

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top