如何从动态 SQL 结果中提取值?
How to extract a value from Dynamic SQL result?
我正在尝试从动态 SELECT
中获取一些值
这是我的代码:
DECLARE @sqlCommand varchar(1000)
DECLARE @colName varchar(20)
DECLARE @tableName varchar(20)
DECLARE @myNum int
DECLARE @varDate varchar(19)
DECLARE @myTime datetime2
set @varDate = getdate()
SET @colName = 'col1'
SET @tableName = 'table'
SET @sqlCommand = 'SELECT top 1 @myTime=mytime, @myNum=' + @colName + ' FROM ' + @tableName + ' WHERE mytime>=''' + @varDate + ''' ORDER BY mytime'
PRINT @sqlCommand
EXEC(@sqlCommand)
当我打印 SQL 命令时,这是我得到的:
SELECT top 1 @myTime=mytime, @myNum=col1
FROM table
WHERE mytime>='Jul 25 2017 4:40PM'
ORDER BY mytime
当我尝试 EXEC
它时,我得到这个错误:
Must declare the scalar variable "@myTime".
如果我这样做:
SET @sqlCommand = 'SELECT top 1 mytime, ' + @colName + ' FROM ' + @tableName + ' WHERE mytime>=''' + @varDate + ''' ORDER BY mytime'
它运行良好,但我需要使用该数据。
提前致谢。
使用sp_executesql
:
exec sp_executesql @sqlCommand,
N'@myNum int output, @myTime datetime2 output, @vardate datetime2',
@myNum = @myNum output,
@myTime = @myTime output,
@vardate = @vardate;
这是 运行 SQL 代码的更好方法,因为处理参数是内置的。
简单...使用变量传递功能,确定变量列表中最后的输出变量
粗略的签名,但应该可以帮助您入门 @o_sdate
、@o_edate
和 @o_resp
是在动态 sql
之外声明的变量
exec sp_executesql @sql
, N'@sdate date, @edate date, @resp smallint OUTPUT'
, @sdate = @o_sdate, @edate = @o_edate, @resp = @o_resp OUTPUT
您应该使用 "insert exec" 使您的变量脱离动态 sql。或者使用 "double-hash"-table.
DECLARE @sqlCommand varchar(1000)
DECLARE @colName varchar(20)
DECLARE @tableName varchar(20)
DECLARE @myNum int
DECLARE @varDate varchar(19)
DECLARE @myTime datetime2
set @varDate = getdate()
SET @colName = 'col1'
SET @tableName = 'table'
SET @sqlCommand = 'SELECT top 1 mytime, ' + @colName + ' FROM ' + @tableName + ' WHERE mytime>=''' + @varDate + ''' ORDER BY mytime'
PRINT @sqlCommand
create table #t1 (mytime datetime, col1 varchar(20))
insert #t1 (mytime, col1) EXEC(@sqlCommand)
select @mytime=mytime, @col1=col1 from #t1
希望你明白了。
我正在尝试从动态 SELECT
这是我的代码:
DECLARE @sqlCommand varchar(1000)
DECLARE @colName varchar(20)
DECLARE @tableName varchar(20)
DECLARE @myNum int
DECLARE @varDate varchar(19)
DECLARE @myTime datetime2
set @varDate = getdate()
SET @colName = 'col1'
SET @tableName = 'table'
SET @sqlCommand = 'SELECT top 1 @myTime=mytime, @myNum=' + @colName + ' FROM ' + @tableName + ' WHERE mytime>=''' + @varDate + ''' ORDER BY mytime'
PRINT @sqlCommand
EXEC(@sqlCommand)
当我打印 SQL 命令时,这是我得到的:
SELECT top 1 @myTime=mytime, @myNum=col1
FROM table
WHERE mytime>='Jul 25 2017 4:40PM'
ORDER BY mytime
当我尝试 EXEC
它时,我得到这个错误:
Must declare the scalar variable "@myTime".
如果我这样做:
SET @sqlCommand = 'SELECT top 1 mytime, ' + @colName + ' FROM ' + @tableName + ' WHERE mytime>=''' + @varDate + ''' ORDER BY mytime'
它运行良好,但我需要使用该数据。
提前致谢。
使用sp_executesql
:
exec sp_executesql @sqlCommand,
N'@myNum int output, @myTime datetime2 output, @vardate datetime2',
@myNum = @myNum output,
@myTime = @myTime output,
@vardate = @vardate;
这是 运行 SQL 代码的更好方法,因为处理参数是内置的。
简单...使用变量传递功能,确定变量列表中最后的输出变量
粗略的签名,但应该可以帮助您入门 @o_sdate
、@o_edate
和 @o_resp
是在动态 sql
exec sp_executesql @sql
, N'@sdate date, @edate date, @resp smallint OUTPUT'
, @sdate = @o_sdate, @edate = @o_edate, @resp = @o_resp OUTPUT
您应该使用 "insert exec" 使您的变量脱离动态 sql。或者使用 "double-hash"-table.
DECLARE @sqlCommand varchar(1000)
DECLARE @colName varchar(20)
DECLARE @tableName varchar(20)
DECLARE @myNum int
DECLARE @varDate varchar(19)
DECLARE @myTime datetime2
set @varDate = getdate()
SET @colName = 'col1'
SET @tableName = 'table'
SET @sqlCommand = 'SELECT top 1 mytime, ' + @colName + ' FROM ' + @tableName + ' WHERE mytime>=''' + @varDate + ''' ORDER BY mytime'
PRINT @sqlCommand
create table #t1 (mytime datetime, col1 varchar(20))
insert #t1 (mytime, col1) EXEC(@sqlCommand)
select @mytime=mytime, @col1=col1 from #t1
希望你明白了。