Как я могу устранить ошибку с помощью динамического SQL - PullRequest
0 голосов
/ 18 июня 2019

Когда я выполняю хранимую процедуру, я получаю следующее сообщение об ошибке.

Сообщение 245, Уровень 16, Состояние 1, Процедура USP_History_Building, Строка 35 [Стартовая Строка 8] Ошибка преобразования при преобразовании значения nvarchar 'SELECT * FROM EDB_Q217.dbo.POSTAL_ADDRESS PA WHERE PA.BUILDING_ID =' в тип данных int.

Я пробовал небольшие изменения в коде, но ни одна из них не работает.

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 * 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 кварталов возвращается несколько полей адреса.

1 Ответ

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

Используйте sp_executesql для передачи параметров в код:

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 *
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 sp_executesql @sqlStatement,
                   N'@BuildingId int',
                   @BuildingId=@BuildingId;

Вы не можете передать имя таблицы в качестве параметра, но вы должны передавать постоянные значения, используя параметры.

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