ОК, ниже приведен некоторый полуработающий код, т.е. он выполняется, но не знаю, выполняет ли он то, что вам нужно.
Это должен быть шаблон для любых дальнейших вопросов SQL, которые вы публикуете, где вынастройте данные, попробуйте выполнить запрос, а затем опубликуйте ожидаемые результаты. В 90% случаев вы сами решите проблему. И за последние 10% вы сделали действительно легким для любого, кто пытается помочь в настройке и воспроизведении проблемы.
Я прокомментировал каждую проблему, которую мне пришлось решить, чтобы заставить этот код работать.
/* FIRST SETUP TEST DATA TO DEMONSTRATE THE ISSUE*/
create table #remove (id varchar(12), month int)
create table #member1 (memberid varchar(12))
create table #member12 (memberid varchar(12))
create table #calendar (year int, month int)
/* Add enough sample data here to demonstrate the issue */
insert into #calendar (month, year) select 1, 2019;
insert into #member1 (memberid) select 'A5513538670';
insert into #member12 (memberid) select 'A5513538670';
/* NOW FOR THE CODE WHICH DOESN"T YET WORK */
/*Months need to be refreshed*/
DECLARE @Month NVARCHAR(2);
DECLARE @Year NVARCHAR(4);
DECLARE @Row NVARCHAR(1);
SELECT @MONTH=1, @YEAR=2019
FROM #calendar; -- calendar
-- Missing column svmonth as required in the dynamic SQL
--select month, year, 1 as row into #period from (select 1 month, 2019 year) x;
select month, month svmonth, year, 1 as row into #period from #calendar;
-- Missing column svmonth as required in the dynamic SQL
--insert into #period (month, year, row)
-- values (CASE WHEN @MONTH=1 THEN 12 ELSE @MONTH-1 END, CASE WHEN @MONTH=1 THEN @YEAR-1 ELSE @YEAR END,2)
--insert into #period (month, year, row)
-- values (CASE WHEN @MONTH=2 THEN 12 ELSE @MONTH-2 END, CASE WHEN @MONTH=2 THEN @YEAR-1 ELSE @YEAR END,3)
insert into #period (month, svmonth, year, row)
values (CASE WHEN @MONTH=1 THEN 12 ELSE @MONTH-1 END, CASE WHEN @MONTH=1 THEN 12 ELSE @MONTH-1 END, CASE WHEN @MONTH=1 THEN @YEAR-1 ELSE @YEAR END,2)
-- Can't use with this data because it causes a month of -1 which breaks the last dynamic code
--insert into #period (month, svmonth, year, row)
-- values (CASE WHEN @MONTH=2 THEN 12 ELSE @MONTH-2 END, CASE WHEN @MONTH=2 THEN 12 ELSE @MONTH-2 END, CASE WHEN @MONTH=2 THEN @YEAR-1 ELSE @YEAR END,3)
/* Refresh latest month */
DECLARE @Updstm NVARCHAR(MAX);
DECLARE @Month1 NVARCHAR(MAX);
DECLARE @Month2 VARCHAR(2);
DECLARE @Year1 NVARCHAR(4);
DECLARE @ROW1 VARCHAR(25);
DECLARE @MAX_ROW1 VARCHAR(25);
-- Missing variable
DECLARE @SVMonth2 VARCHAR(2);
SET @MAX_ROW1 = (SELECT MAX([ROW]) FROM #period);
SET @ROW1 = 1;
WHILE @ROW1<=@MAX_ROW1 BEGIN
SELECT @Month1 = N'SELECT @SVMonth2 = SVMonth FROM #period WHERE [ROW] = ' + @ROW1;
-- select the dynamic SQL in order to work out what is wrong with it.
-- select @Month1;
-- Passed in @Month2 but internally used @SVMonth2
--EXEC sp_executesql @Month1, N'@Month2 VARCHAR(2) OUTPUT', @Month2 OUTPUT;
EXEC sp_executesql @Month1, N'@SVMonth2 VARCHAR(2) OUTPUT', @SVMonth2 OUTPUT;
SET @Updstm= '';
-- Used @Month1 instead of @SVMonth2, and doubled quoted ID's instead of using 2 single quotes
--SET @Updstm= '
--INSERT INTO #remove (id, month)
-- select memberid, ' + @SVMonth2 + ' as month
-- from #member' + @SVMonth2 + ' where memberid in ("A2019358219",
-- "A3012467679",
-- "A5513538670")';
SET @Updstm= '
INSERT INTO #remove (id, month)
select memberid, ' + @SVMonth2 + ' as month
from #member' + @SVMonth2 + ' where memberid in (''A2019358219'',
''A3012467679'',
''A5513538670'')';
-- select the dynamic SQL in order to work out what is wrong with it.
--select @Updstm;
EXECUTE sp_executesql @Updstm;
SET @ROW1=@ROW1+1;
END
/* CLEAN UP */
drop table #calendar;
drop table #period;
drop table #remove;
drop table #member1;
drop table #member12;