Хранимая процедура Dynamic SQL сохраняет результат в переменной - PullRequest
1 голос
/ 20 октября 2011

У меня есть хранимая процедура, написанная

DECLARE @AreaID AS INT
DECLARE @DayPrior AS INT
DECLARE @TableName AS VARCHAR(50)
DECLARE @StoreQuery AS NVARCHAR(MAX)
DECLARE @SQL_ExtractDlSql AS NVARCHAR(MAX)
DECLARE @ParameterDefinition AS NVARCHAR(2000)

SET @AreaID = 1
SET @DayPrior = 1
SET @TableName = 'Tbl_Lube'

SET @SQL_ExtractDlSql = 'SELECT Download_SQL From
                         HDDDataPackage.dbo.tbl_HDD_DataDownloadSetting
                         Where AreaId=@AreaID AND TableName=@TableName'

SET @ParameterDefinition = '@AreaID INT,@DayPrior INT,@TableName VARCHAR(50)'

EXECUTE sp_executesql @SQL_ExtractDlSql,
                      @ParameterDefinition,
                      @AreaID,
                      @DayPrior,
                      @TableName

PRINT @SQL_ExtractDlSql

Я выше Хранимая процедура, я получаю на печать то, что хотел, но вместо этого я хотел, чтобы выбранные хранилища данных были переменными.Затем я объявил переменную @StoreSql и внес некоторые изменения в выражение SQL, показанное ниже:

Объявление переменной:

DECLARE @StoreSql AS NVARCHAR(MAX)

Изменение кода:

SET @SQL_ExtractDlSql = 'SELECT @StoreSql = Download_SQL From
                         HDDDataPackage.dbo.tbl_HDD_DataDownloadSetting
                         Where AreaId=@AreaID AND TableName=@TableName'

Я выполнил код, я получил ошибку Должен объявить скалярную переменную "@StoreSql".

Я совершенно не знаю, как с этим справиться. Любой может помочь.Я новичок в sqlserver, плохо знаком с хранимыми процедурами.

Пожалуйста, не стесняйтесь указывать на мою ошибку, любую ... такую, как логику и т. Д. Я учусь на ошибках.

С уважением, LiangCk

1 Ответ

1 голос
/ 20 октября 2011

Динамическая строка SQL не может ссылаться на переменные из внешней области видимости. Вы должны объявить его как output параметр

SET @ParameterDefinition = '@AreaID INT,
                            @DayPrior INT,
                            @TableName VARCHAR(50), 
                            @StoreSql NVARCHAR(MAX) OUTPUT'

EXECUTE sp_executesql @SQL_ExtractDlSql,
                      @ParameterDefinition,
                      @AreaID,
                      @DayPrior,
                      @TableName,
                      @StoreSql OUTPUT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...