Как запустить сгенерированный SQL из переменной? - PullRequest
4 голосов
/ 24 октября 2011

Я попытался запустить свой SQL (в T-SQL) (я просто сгенерировал переменную), но я не могу заставить его работать.Что я хочу сделать: 1. Запустить большой SQL из программы 2. Большой SQL генерирует selct-SQL 3. Запустить сгенерированный sql как обычный выбор и получать данные как обычно.Я думал, что это можно сделать с помощью sp_executesql , но, похоже, в моем случае это неправильно.

То, что я пытаюсь сделать, выглядит следующим образом:

declare @sql varchar(max)

set @sql = 'select x, y from z'

exec @sql --this is the point where im stuck.

Я знаю, что это, должно быть, довольно простой вопрос, но я не смог найти то, что соответствует моей проблеме в Google.

Спасибо за вашу помощь!

Обновление Iрешил мою проблему с помощью sp_sqlexec (который больше не поддерживается, но работает так, как я хотел).

declare @sql varchar(max)

set @sql = 'select x, y from z'

exec sp_sqlexec @sql 

Правильное решение - sp_executesql!(см. sp_sqlexec против sp_executesql ). Для моей проблемы было бы довольно много времени, если бы я "перестроил" все, что мог бы ее использовать.

Спасибо за вашу помощь, ребята!

Ответы [ 2 ]

7 голосов
/ 24 октября 2011

Вам нужны скобки exec (@sql)

SQL Server будет искать хранимую процедуру имени в переменной @sql без этого и жаловаться Could not find stored procedure 'select x, y from z'.

Если вы используете динамический SQL, см. Проклятие и благословения динамического SQL для хорошей статьи по этой теме.

5 голосов
/ 24 октября 2011

Вы также можете использовать sp_executesql, но учтите, что для этого требуется NVARCHAR (Unicode)

Кроме того, если вы создаете динамические фильтры, вы можете передавать параметры, как указано ниже

declare @SQL nvarchar(max)
set @SQL = N'select x, y from z where x = @someFilter'
exec sp_executesql @SQL, N'@someFilter bigint', @someFilter = 6034280
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...