Как передать значения параметров в запрос T-SQL - PullRequest
6 голосов
/ 27 февраля 2009

Я использую следующий запрос T-SQL в SQL Server 2005 (Management Studio IDE):

DECLARE @id int;
DECLARE @countVal int;
DECLARE @sql nvarchar(max);
SET @id = 1000;
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = @id';
EXEC (@sql) AT oracleServer -- oracleServer is a lined server to Oracle

Я не уверен, как передать входной параметр @id в запрос EXEC и передать результат подсчета в @countVal. Я видел несколько примеров для сервера Microsoft SQL, таких как:

EXEC (@sql, @id = @id)

Я пробовал это для Oracle, но получил ошибку оператора:

OLE DB provider "OraOLEDB.Oracle" for linked server "oracleServer" 
returned message "ORA-00936: missing expression"

Ответы [ 3 ]

17 голосов
/ 27 февраля 2009

Попробуйте это:

EXEC sp_executesql @sql, N'@id int', @id

Больше информации в этой замечательной статье: http://www.sommarskog.se/dynamic_sql.html


Что касается вывода, ваш SELECT должен выглядеть примерно так:

SELECT @countVal = COUNT(id) FROM owner.myTable WHERE id = @id

Я выбираю 'id' вместо '*', чтобы избежать извлечения ненужных данных ...

Тогда ваш динамический sql должен выглядеть примерно так:

EXEC sp_executesql @sql, 
                   N'@id int, @countVal int OUTPUT', 
                   @id, 
                   @countVal OUTPUT

Этот пример взят из той же статьи, на которую есть ссылки в разделе sp_executesql .


Что касается вашей ошибки Oracle, вам необходимо выяснить точный SQL, который sp_executesql отправляет в Oracle. Если в Oracle есть профилировщик или журнал запросов, это может помочь. У меня ограниченный опыт работы с Oracle, но это будет следующим логическим шагом для устранения проблемы.

0 голосов
/ 27 февраля 2009

Быстрый и грязный способ - просто построить строку перед использованием оператора EXEC, однако это не рекомендуемая практика, поскольку вы можете открыть себя для SQL-инъекции.

DECLARE @id int;
DECLARE @countVal int;
DECLARE @sql nvarchar(max);
SET @id = 1000;
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = ' + @id 
EXEC (@sql) AT oracleServer -- oracleServer is a lined server to Oracle

Правильный способ сделать это - использовать системную хранимую процедуру sp_executesql, как описано в Magnifico и рекомендовано Microsoft в Books Online:

EXEC sp_executesql @sql, N'@id int', @id
0 голосов
/ 27 февраля 2009

Я не знаю, почему вы проходите отдельно.

Вы можете сделать следующее
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = ' + @id

...