Почему сервер 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 - это просто не так безопасно.