如何在执行 sp_executesql 中获取输出参数的值?
Posted
技术标签:
【中文标题】如何在执行 sp_executesql 中获取输出参数的值?【英文标题】:How to grab the value of the output parameter in execute sp_executesql? 【发布时间】:2011-10-07 09:38:03 【问题描述】:请原谅新手的无知!
如何在execute sp_executesql中获取输出参数的值?
我可以看到输出但无法访问它:
DECLARE @LastActivity nvarchar(100)
DECLARE @LastActivityDate datetime
DECLARE @sql nvarchar(MAX)
DECLARE @RowsToProcess int
DECLARE @CurrentRow int
DECLARE @SelectCol1 nvarchar(100)
DECLARE @SelectCol2 nvarchar(100)
DECLARE @SelectCol3 nvarchar(100)
DECLARE @LastDate TABLE (RowID int not null primary key identity(1,1), col4 nvarchar(MAX), col5 sql_variant)
DECLARE @table1 TABLE (RowID int not null primary key identity(1,1), col1 nvarchar(100),col2 nvarchar(100),col3 nvarchar(100))
INSERT into @table1 (col1,col2,col3)(SELECT t.name AS col1, c.name AS col2, m.Field1 as col3
FROM sys.columns c INNER JOIN
sys.tables t ON c.object_id = t.object_id INNER JOIN
sys.schemas s ON t.schema_id = s.schema_id INNER JOIN
dbo.MERGE_TABLES m ON m.Table_Name=t.name
WHERE c.name LIKE '%[_]DATE%' and m.[Enabled]='Y')
SET @RowsToProcess=@@ROWCOUNT
SET @CurrentRow=0
WHILE @CurrentRow<@RowsToProcess
BEGIN
SET @CurrentRow=@CurrentRow+1
SELECT @SelectCol1=col1,@SelectCol2=col2,@SelectCol3=col3 FROM @table1 WHERE RowID=@CurrentRow
SET @sql='SELECT ' + '[dbo].[ConvertToDatetime](MAX(' + @SelectCol2 + '))' + ' FROM ' + @SelectCol1 + ' Where ' + @SelectCol3 + ' = ' + '''0722607QZ'''
Declare @params as nvarchar(MAX)
Set @params = '@date sql_variant output'
Declare @date as sql_variant;
execute sp_executesql
@sql
,@params
,@date output
Select @date
INSERT into @LastDate VALUES (@sql, @date)
end
select col4,col5 from @LastDate
select col4,col5 from @LastDate 给了我 clo4 中的 SQL 脚本,但 col5 是空的!我需要存储@date,因为我仍然需要获取 Max(@date)
感谢一百万。
SET @sql='set @date =('SELECT ' + '[dbo].[ConvertToDatetime](MAX(' + @SelectCol2 + '))' + ' FROM ' + @SelectCol1 + ' 哪里 ' + @SelectCol3 + ' = ' + '''0722607QZ''' ) '
上面的 sql 给了我错误:'.' 附近的语法不正确
SET @sql='set @date =(SELECT [dbo].[ConvertToDatetime](MAX( + @SelectCol2 + )) FROM @SelectCol1 where @SelectCol3 ''=0722607QZ'' ) '
上面的sql给出错误:必须声明标量变量“@SelectCol2”
SET @sql='SELECT ' + @date + '=convert(nvarchar(100), [dbo].[ConvertToDatetime](MAX(' + @SelectCol2 + ')))' + ' FROM ' + @SelectCol1 + ' Where ' + @SelectCol3 + ' = ' + '''0722607QZ'''
以上产生错误:从数据类型 sql_variant 到 nvarchar 的隐式转换不是 允许。使用 CONVERT 函数运行此查询。
SET @sql='SELECT ' + @date + '=convert(nvarchar(MAX),(MAX(' + @SelectCol2 + '))' + ' FROM ' + @SelectCol1 + ' Where ' + @SelectCol3 + ' = ' + '''0722607QZ'''
上面没有产生错误,但所有输出都是 NULL,没有值。
【问题讨论】:
【参考方案1】:您的语法看起来不错,但您从未分配给输出变量@date,因此没有值。
代替;
SET @sql='SELECT ...'
你需要;
SET @sql='set @date = (SELECT ...'
你不能使用比sql_variant
更好的类型吗?
【讨论】:
你是一个非常善良的天才!但是我收到一个错误:'.' 附近的语法不正确尽管。有什么想法吗? 在哪里? @sql 的值是什么样的? 它不运行。我将其标记为答案,因为我确信它会修复它,但现在它给了我错误 评论不允许sql,所以我把它作为最后一行粘贴在问题上 @SelectCol 变量中的名称是否包含无效字符?如果是这样,请使用 []...(MAX([' + @SelectCol2 + ']))' ...
逃避它们以上是关于如何在执行 sp_executesql 中获取输出参数的值?的主要内容,如果未能解决你的问题,请参考以下文章