Проблема оператора SELECT SQL хранимой процедуры - PullRequest
1 голос
/ 15 июля 2010

Я использую SQL Server 2008 Enterprise на Windows Server 2008 Enterprise.В хранимой процедуре мы можем выполнить инструкцию SELECT напрямую.И это также может быть выполнено этим новым способом, мне интересно, какой метод лучше и почему?

Новый метод,

declare @teststatement varchar(500)

set @teststatement = 'SELECT * from sometable'

print @teststatement

exec (@teststatement)

Традиционный метод,

SELECT * from sometable

привет, Джордж

Ответы [ 3 ]

2 голосов
/ 15 июля 2010

К вашему сведению: это не новый метод, он известен как динамический SQL.

Динамический SQL предпочтительнее, когда нам нужно установить или объединить определенные значения в операторы SQL.

Рекомендуется использовать SQL-операторы традиционным или обычным способом, поскольку хранимые процедуры выполняются. Выполняется при первом запуске «Хранимая процедура компилируется при первом запуске» , план выполнения операторов создается во время компиляции.

Динамические sqls игнорируются при создании планов выполнения, поскольку они принимаются в виде строки (VARCHAR или NVARCHAR, как объявлено).

См. Следующие статьи для получения более подробной информации о динамическом запросе и хранимых процессах
Введение в динамический SQL, часть 1
Введение в динамический SQL, часть 2
Все, что вы хотели знать о хранимых процедурах

1 голос
/ 15 июля 2010

Традиционный метод безопаснее, потому что запрос анализируется при его сохранении. Запрос в методе exec не анализируется и может содержать ошибки.

0 голосов
/ 15 июля 2010

«Новый» способ, как уже упоминалось, не имеет ничего общего с SQL 2008. EXEC был доступен довольно давно.Это также - в большинстве случаев - очень плохая идея.

Вы теряете параметризацию - это означает, что вы теперь уязвимы для SQL-инъекции .Это некрасиво и подвержено ошибкам.Это менее эффективно.И он создает новую область выполнения - то есть не может совместно использовать переменные, временные таблицы и т. Д. - из своего вызываемого хранимого процесса.

sp_executesql - другой (и предпочтительный) метод выполнениядинамический SQL.Это то, что ваши клиентские приложения используют, и он поддерживает параметры - что решает наиболее очевидную проблему EXEC.Тем не менее, он также имеет очень ограниченные варианты использования в хранимой процедуре.О единственном искупительном использовании, когда вам нужно динамическое имя таблицы или столбца.T-SQL не поддерживает переменную для этого - поэтому вам нужно использовать sp_executesql.Количество раз, которое вам нужно или нужно делать, это очень низкое .

Итог - вам лучше забыть, что вы когда-либо слышали об этом.

...