Почему сервер sql генерирует хранимые процедуры, используя оператор sp_executesql со строкой? - PullRequest
14 голосов
/ 08 мая 2009

Когда я генерирую сценарии создания sql-схемы вручную, я обычно просто вызываю «Создать процедуру ...», однако я замечаю, что когда вы генерируете сценарий с помощью параметра «Задачи / Создать сценарии», он использует «spexecutesql @statement = ..», например

    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
'

Почему это? Это что-то о сохранении комментариев? Спасибо

Ответы [ 5 ]

20 голосов
/ 08 мая 2009

Это не имеет ничего общего с комментариями. Он делает это таким образом, только когда вы говорите «включить, если не существует». Причина в том, что он может программно включать или исключать объекты, только если они выполняются динамически.

Вы можете отключить эту хранимую процедуру, выбрав «False» в Options \ SQL Server Object Explorer \ Scripting - Проверка существования объекта.

4 голосов
/ 05 ноября 2012

Я понимаю, что это старая версия, но это исправление довольно глубоко спрятано в Sql 2012. Майкл Харен прав, метод рендеринга sprocs меняется, когда в Options требуется проверка наличия объекта. Чтобы изменить это, перейдите в Options, Sql Server Object Explorer, Scripting, Object Scripting Options и установите для «Проверка существования объекта» значение false. Sprocs теперь рендерится "нормально", без использования sp_executesql.

3 голосов
/ 29 августа 2013

sql server 2012, установите Tools => Options => SQL Server Object Explore => Сценарии, проверьте существование объекта = false

может решить эту проблему.

0 голосов
/ 14 июля 2011

Использование spexecutesql является лучшей практикой. Имеет отношение к предотвращению SQL-инъекций и т. Д. Путем выделения / ограничения области действия переменных и т. Д. Подробнее здесь: http://msdn.microsoft.com/en-us/library/ms188001.aspx

Вы НЕ ДОЛЖНЫ использовать spexecutesql - EXEC тоже работает - многие просто используют старый добрый EXEC - это просто не так безопасно.

0 голосов
/ 08 мая 2009

Полагаю, это связано с возможностью создания нескольких sprocs в одном файле сценария без GO? Если вы делаете создание sproc ... напрямую, вы должны завершить его в пакете (закончите с GO). С sp_executesql вы не должны испытывать сгенерированные скрипты между объектами. Хотя я не помню, может быть, там есть кто-нибудь ... (передо мной нет БД).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...