2017-07-25 1 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宣言の前に一時テーブルを作成し、SELECTの代わりに一時テーブルにINSERTを実行してください。 execコマンドの後にtempテーブルの内容を読みます(編集: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

Hello 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 
関連する問題