Я получаю сообщение об ошибке, используя целое число в качестве параметра - PullRequest
0 голосов
/ 17 июня 2019

/ * Я передаю целое число в качестве параметра в хранимой процедуре SQL, но получаю сообщение об ошибке, несмотря на объявление входного значения.

Целью является использование значения, переданного параметру в динамическом SQL в цикле WHILE.

Этот метод отлично работает при передаче строковых значений через параметр в динамический SQL, но с целочисленными значениями возвращается сообщение об ошибке:

Сообщение 137, Уровень 15, Состояние 2, Строка 16 Необходимо объявить скалярную переменную "@BUILDING_ID"

Ниже приведен код, который я использую:

* /

CREATE OR ALTER PROCEDURE dbo.USP_History_Building

     @BUILDING int

AS 

DECLARE @quarterStart int = 2
DECLARE @quarterEnd int = 1
DECLARE @yearStart int = 17
DECLARE @yearEnd int = 19

DECLARE @BUILDING_ID int

DECLARE @year int
DECLARE @quarter int

DECLARE @quarterForDbName nvarchar(4)
DECLARE @sqlStatement nvarchar(max)

SET @year = @yearStart
SET @quarter = @quarterStart
SET @sqlStatement = ''

SET  @BUILDING_ID = @BUILDING

WHILE @year <= @yearEnd
BEGIN
   WHILE ((@year < @yearEnd AND @quarter <= 4) OR (@year = @yearEnd AND @quarter <= @quarterEnd))
   BEGIN
    SET @quarterForDbName = 'Q' + CAST(@quarter AS nvarchar(1)) + CAST(@year AS nvarchar(2))
--  

        SET @sqlStatement = @sqlStatement + '


        SELECT '''+@quarterForDbName+''' AS Quarter, ADDRESS_POINT_ID, BUILDING_ID, ADDR_LINE_1, ADDR_LINE_2, ADDR_LINE_3, ADDR_LINE_4, ADDR_LINE_5, ADDR_LINE_6 FROM EDB_'+ @quarterForDbName +'.dbo.POSTAL_ADDRESS PA WHERE PA.BUILDING_ID = @BUILDING_ID'

      SET @quarter = @quarter + 1

   END
   SET @quarter = 1
   SET @year = @year + 1

END

PRINT @sqlStatement
EXEC (@sqlStatement)

/ Ожидаемый результат - около 8 строк с 6 адресными полями за предыдущие 8 кварталов. /

Ответы [ 2 ]

1 голос
/ 17 июня 2019
'WHERE PA.BUILDING_ID =' + @BUILDING_ID

@ BUILDING_ID потому что это переменная должна быть другой стороной кавычки.

0 голосов
/ 17 июня 2019

вместо

'WHERE PA.BUILDING_ID = @BUILDING_ID'

Вам нужно

'WHERE PA.BUILDING_ID =' + @BUILDING_ID

Вы также можете использовать такой параметр, как this

EXECUTE ('SELECT ProductID, Name   
    FROM AdventureWorks2012.Production.Product  
    WHERE ProductID = ? ', 952) AT SeattleSales;  
GO  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...