2017-01-19 10 views
0

テーブルからリンクサーバー変数を読み込むように変換する必要があるストアドプロシージャがあります。私が知っているから、そうする唯一の方法は動的SQLを使うことです。問題は、私のクエリを変換することに失敗していることです。リンクサーバー変数を使用してクエリを動的SQLに変換する

オリジナルクエリ:

SET @var1 = '' 
SELECT @var1 = RECEIVER   
FROM databse1.dbo.table1 
WHERE SAPNUMBER = @var2 

変換されたクエリ:

SET @srv = (SELECT server_name 
      FROM Configuration.dbo.Server_Switch) 

SET @var1 = '' 
exec ( 
'SELECT ' + @var1 + '= RECEIVER 
FROM ' + @srv + '.databse1.dbo.table1 
WHERE SAPNUMBER =' + @var2 
) 

私は取得していますエラーは次のとおりです。

Incorrect syntax near '=' 

VAR1と@ VAR2 @は、事前に宣言された変数です。私はかなり動的SQLのこれらの変数に値を割り当てることに問題があると確信しているので、 '='エラーです。このクエリの変換に何か助けてもらえますか?

+0

?それができる唯一のことは、問題の可能性を高めることでした。誰かが 'Server_Switch'テーブルに' Bobby Tables'を保存したとしたらどうでしょう...。 –

答えて

4

一つの方法は、出力パラメータでsp_executesqlをを使用することです:

あなたは、動的SQLは全く問題を解決するだろうと思いますなぜ
SET @srv = (SELECT server_name 
      FROM Configuration.dbo.Server_Switch) 

DECLARE @sql nvarchar(500), 
     @ParmDefinition nvarchar(500); 

SET @sql = 
'SELECT @output = RECEIVER 
FROM ' + @srv + '.databse1.dbo.table1 
WHERE SAPNUMBER =' + @var2 

SET @ParmDefinition = N'@var1 varchar(100) OUTPUT'; 

EXEC sp_executesql @Sql, @ParmDefinition, @[email protected] OUTPUT; 
0

詳細を入力してください。変数@ var2、@ var1宣言、変数の型が必要です。 @ VAR2がvarchar型である場合には、道をfollowoingでクエリを更新してください:

declare @sql nvarchar(4000) = 
'SELECT ' + @var1 + '= RECEIVER 
FROM ' + @srv + '.databse1.dbo.table1 
WHERE SAPNUMBER =' + char(39) + @var2 + char(39); 

exec(@sql); 

P.S.もし@数値VAR2:それを解決するために

declare @sql nvarchar(4000) = 
'SELECT ' + @var1 + '= RECEIVER 
FROM ' + @srv + '.databse1.dbo.table1 
WHERE SAPNUMBER =' + @var2; 
exec(@sql); 
+0

最後に、あなたの目標はレコードセットを取得せずに@ var1で値を取得することでした。この場合、出力を伴うsp_executesqlを使用する必要があります。Zohar Peled – Juozas

関連する問題