Почему сервер sql генерирует хранимые процедуры, используя оператор sp_executesql со строкой?
Когда я генерирую скрипты создания sql-схемы вручную, я обычно просто вызываю "Create Procedure...", однако я замечаю, что при создании script с использованием параметра "Задачи/Генерация скриптов" он использует "spexecutesql @statement =.. 'eg
EXEC dbo.sp_executesql @statement = N'-- =============================================
-- Author: Me
-- Create date: 20/03/2009
-- Description: Does stuff
-- =============================================
CREATE PROCEDURE [dbo].[MyProc]
-- Add the parameters for the stored procedure here
@StartDate datetime
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
...
END
'
Почему это? Это что-то вроде сохранения комментариев?
Благодаря
Ответы
Ответ 1
Это не имеет никакого отношения к комментариям. Это делается только тогда, когда вы говорите ему "включить IF NOT EXISTS". Причина в том, что он может программно включать или исключать объекты, если они выполняются динамически.
Вы можете отключить это хранимые процедуры, выбрав "False" в Options\SQL Server Object Explorer\Scripting - проверить существование объекта.
Ответ 2
Я понимаю, что это старо, но исправление довольно глубоко заложено в Sql 2012. Майкл Харен прав, метод рендеринга изменений sprocs, когда в "Параметры" требуются проверки существования объекта. Чтобы изменить это, перейдите в раздел "Параметры", "Обозреватель объектов SQL", "Сценарии", "Параметры сценария объекта" и установите "Проверить наличие объекта" на false. Sprocs теперь отображают "обычно", не используя sp_executesql.
Ответ 3
sql server 2012, установите Tools = > Options = > SQL Server Object Explore = > Scripting, проверьте существование объекта = false
может решить эту проблему.
Ответ 4
Я бы предположил, что это связано с возможностью создания нескольких sprocs в том же файле script без GO? Если вы создаете sproc... прямо, вы должны завершить его в партии (закончить с GO). С sp_executesql вам не нужно будет запускать созданные сценарии между объектами. Хотя я не помню, может быть, там есть кто-то... (не имею db передо мной).
Ответ 5
Использование spexecutesql - лучшая практика. Имеет отношение к предотвращению внедрения sql и т.д. Путем выделения/ограничения объема переменных и т.д. Подробнее здесь: http://msdn.microsoft.com/en-us/library/ms188001.aspx
Вам не нужно использовать spexecutesql - EXEC работает тоже - многие люди просто используют простой старый EXEC - это просто не так безопасно.