存储过程动态SQL存储结果变量

时间:2011-10-20 10:04:22

标签: sql-server-2008 variables stored-procedures scope dynamic-sql

我写了一个存储过程

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 个答案:

答案 0 :(得分:1)

动态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