2016-03-24 9 views
1

私はいくつかの集約されたデータがあります。それは私が何をしようとしているたくさんの列動的に生成された列名を使用してローカルテーブル変数を更新するにはどうすればよいですか?

を持って

name asd colA ColB ColC  X  Y 
----------------------------------------------- 
... 
George PJ Sp  P  B  14.8 56 
George PJ Sp  P  C  11.4 43 
... 
----------------------------------------------- 

と地元結果テーブル

declare @result table(
    Name nvarchar(255), 
    SP_E_A int null, 
    SP_E_B int null, 
    SP_E_C int null, 
    SP_E_D int null, 
    SP_E_viso decimal(5,1) null, 
    ... 
    --LOTS MORE COLUMN GOES AFTER 
    ... 
) 

は次のとおりです。 更新文を動的に生成して実行する
例:

UPDATE TABLE @table SET SP_P_B = 56 

は、だから私はこの

open cursor for *that result set* 
declare @sql varchar(255) = 'UPDATE @table SET '[email protected]+'_'[email protected]+'_'[email protected]+'='+CONVERT(varchar,@Y); 
exec (@sql) 

を書いた私は

を得ているエラーは、 "@table" テーブル変数を宣言する必要があります。

execのように、@resultテーブルが存在しない別のセッションが開始されます。

どうすれば回避できますか?

+1

だけで一時テーブルを使用するように変更します。 – Squirrel

+0

@Squirrel @ local、globalまたはtempDbを使用する必要がありますか? – evictednoise

+1

動的SQL文の内外でテーブル変数を渡すのは難しい場合があります。ここでの問題は、動的SQLが別のコンテキスト内で実行されることです。この[質問](http://stackoverflow.com/questions/4258798/pass-a-table-variable-to-sp-executesql)は、その問題を回避する方法を示しています。 –

答えて

0

次のコードに示すようにグローバルな一時テーブルを使用して試すことができます:

CREATE TABLE ##globalSession (column1 int null, column2 varchar(45) null); 

INSERT INTO ##globalSession (column1, column2) Values (2, 'initial data'); 

declare @sql VARCHAR(255) = 'UPDATE ##globalSession set column1 = 1, column2 = ''test'' ; '; 

exec (@sql) 

SELECT * FROM ##globalSession 

DROP TABLE ##globalSession; 
+0

申し訳ありませんが、テーブルを@tableとして宣言する必要はありませんでした – ErnestoDeLucia

+0

これは必須ではありません、それは私が試した方法です。グローバルテンポラリテーブルが私のために動作するように見える – evictednoise

+0

と@Squirrelによって指摘されているローカルの '#result' – evictednoise

関連する問題