2017-01-19 9 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

Почему вы думаете, что динамический SQL будет решить любую проблему вообще? Единственное, что он мог бы сделать, это увеличить вероятность проблем. Представьте, если кто-то сохранил «Таблицы Бобби» в этой таблице «Server_Switch» ... –

ответ

4

Одним из способов решения является использование sp_executesql с выходным параметром:

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 с выходом, как сказал Зохар Пелед – Juozas