Sql server declare标量变量遗漏了什么

Sql server declare标量变量遗漏了什么,sql-server,tsql,Sql Server,Tsql,我有以下这部分编码的错误消息: /*Months need to be refreshed*/ DECLARE @Month NVARCHAR(2) DECLARE @Year NVARCHAR(4) DECLARE @Row NVARCHAR(1) SELECT @MONTH=MONTH, @YEAR=YEAR FROM calendar select month, year, 1 as row into #period from calendar; insert into #perio

我有以下这部分编码的错误消息:

/*Months need to be refreshed*/
DECLARE @Month NVARCHAR(2)
DECLARE @Year NVARCHAR(4)
DECLARE @Row NVARCHAR(1)

SELECT @MONTH=MONTH, @YEAR=YEAR
FROM calendar

select month, year, 1 as row into #period from calendar;

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)

/*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)  

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
EXEC sp_executesql @Month1, N'@Month2 VARCHAR(2) OUTPUT', @Month2 OUTPUT

SET @Updstm= ''
SET @Updstm= '
INSERT INTO #remove
select memberid, '+@Month1+' as month
from member'+@Month1+' where memberid in ("A2019358219",
"A3012467679",
"A5513538670")';

EXECUTE sp_executesql @Updstm

SET @ROW1=@ROW1+1

END
成员样本数据:

Month | Year
9     | 2019
MemberId    | Sales  | Qty
A2019358219 | 166703 | 90
A3012467679 | 170489 | 34
A5513538670 | 38689  | 18

WHILE循环缺少您的端点:

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)  

SET @MAX_ROW1=(SELECT MAX([ROW]) FROM #curr_period)
SET @ROW1=1 WHILE @ROW1<=@MAX_ROW1


BEGIN
    SELECT @Month1 = N'SELECT @Month2 = Month FROM #curr_period WHERE [ROW]=' + @ROW1
    EXEC sp_executesql @Month1, N'@Month2 VARCHAR(2) OUTPUT', @Month2 OUTPUT
END
这应该是

EXEC sp_executesql @Month1, N'@Month2 VARCHAR(2) OUTPUT', @SomeProcVar = @Month2 OUTPUT

请看此

好的,下面是一些半工作代码,即is运行,但我不知道它是否符合您的要求

这应该是您发布的任何其他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;

这可能是一个错误,但它不是被问到的问题。我可以知道你试图用这个查询做什么吗??是存储的procedure@DaleBurrell我已经在完整脚本中添加了该脚本仍然不是完整脚本-它应该包括实际执行它所需的所有临时表创建。我们应该能够在SSMS中打开一个新窗口。执行其中的脚本并查看您询问的错误about@user5193498你没有a-人们试图为你解决问题,这是在浪费很多人的时间,但问题并不存在于发布的代码中。@DaleBurrell,对此我真的很抱歉。我已经附上了完整的代码应该是@Month2=@SomeProcVar输出