如何从动态SQL结果中提取值?

时间:2017-07-25 13:46:44

标签: sql tsql dynamicquery

我试图从动态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时,我收到此错误:

  

必须声明标量变量" @ myTime"。

如果我这样做:

SET @sqlCommand = 'SELECT top 1 mytime, ' + @colName + ' FROM ' + @tableName + ' WHERE mytime>=''' + @varDate + ''' ORDER BY mytime'

效果很好,但我需要使用这些数据。

提前致谢。

3 个答案:

答案 0 :(得分:1)

使用sp_executesql

exec sp_executesql @sqlCommand,
                   N'@myNum int output, @myTime datetime2 output, @vardate datetime2',
                   @myNum = @myNum output,
                   @myTime = @myTime output,
                   @vardate = @vardate;

这是运行SQL代码的一种更好的方法,因为处理参数是内置的。

答案 1 :(得分:1)

简单...使用变量传递特征,make来识别变量列表中最后的输出变量

粗略的签名但应该让你开始@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

答案 2 :(得分:0)

你应该使用"插入exec"从动态sql中获取变量。或者使用"双哈希" -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

我希望你明白了。