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