Что упущено в объявлении скалярной переменной - PullRequest
0 голосов
/ 09 октября 2019

У меня есть сообщения об ошибках для этой части кода ниже:

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

Сообщения об ошибках были:

Неверный синтаксис рядом с ключевым словом «SELECT»
Необходимо объявитьскалярная переменная "@ Месяц2".

Что я пропустил?

Образец данных календаря:

Month | Year
9     | 2019

Образец данных члена:

MemberId    | Sales  | Qty
A2019358219 | 166703 | 90
A3012467679 | 170489 | 34
A5513538670 | 38689  | 18

Ответы [ 3 ]

1 голос
/ 09 октября 2019

ОК, ниже приведен некоторый полуработающий код, т.е. он выполняется, но не знаю, выполняет ли он то, что вам нужно.

Это должен быть шаблон для любых дальнейших вопросов 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;
1 голос
/ 09 октября 2019

Ваш КОНЕЦ отсутствует в цикле 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
0 голосов
/ 09 октября 2019

Это должно быть

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

См. ссылку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...