2017-07-25 43 views
0

我试图从动态SELECT如何从动态SQL结果中提取值?

弄几个值这是我的代码:

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' 

它运作良好,但我需要使用该数据。

在此先感谢。

+0

为什么你需要创建@sqlCommand,然后用exec()执行它? – DontThinkJustGo

+0

@DontThinkJustGo。 。 。表名是动态的。 –

+0

在sqlCommand声明之前创建一个临时表,并尝试将INSERT插入临时表而不是SELECT。在exec命令之后读取临时表的内容(编辑:用sp_executesql提供的解答提供了一个更好的解决方案) – Cristian

回答

0

您应该使用“insert exec”将变量从动态sql中取出。或者使用“双重哈希”表。

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 

我希望你明白了。

+0

谢谢,它正是我想要的。 –

+0

您好Moran - 您也可以使用sp_executesql的输出参数将值传递给调用过程。但这不适用于旧版本(2012年之前?)。 Insert ... exec将与每个过程一起工作。缺点:您需要知道过程返回的表的数据类型/结构。 – Christian4145

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

简单...使用变量传递功能,使识别最后的变量

列表中的输出变量

粗糙的签名,但应该让你开始动态的外部声明@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