Вопрос по sql-server, ssms – Как остановить SSMS 2012 от сценариев SP с помощью sp_executesql

21

Я понимаю, что это очень похожий вопросОстановить SSMS от сценариев SP с помощью sp_executesql?

Однако, похоже, что они изменили поведение с SSMS 2012.

Если у вас есть «Проверка на наличие» выбран вариант, как в:

enter image description here

... теперь генерирует IF NOT EXISTS для создаваемого процесса,as well в качестве IF EXISTS для предыдущего выпадающего процесса, если, как обычно, я выбираю опции DROP and CREATE:

enter image description here

Это заставляет его создавать сценарий CREATE, используя sp_executesql. Это бессмысленно, поскольку вам не нужна проверка «ЕСЛИ НЕ СУЩЕСТВУЕТ» на CREATE, если DROP только что ее отбросил.

Кажется невозможным иметь одно без другого.

Есть идеи?

Ваш Ответ

5   ответов
5

Самое близкое к этой функциональности вы можете получить, выбрав инструменты, параметры, Обозреватель объектов SQL Server, Сценарии, а затем установите для параметра Проверка наличия объекта значение false.

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

/****** Object:  View [dbo].[vEmployees]    Script Date: 9/14/2012 9:18:57 AM ******/
IF  EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vEmployees]'))
DROP VIEW [dbo].[vEmployees]
GO

CREATE VIEW [dbo].[vEmployees]
AS
    SELECT DISTINCT
        Employees.EmployeeID,
        FirstName,
        LastName
    from
        Employees
            JOIN Sales on Employees.EmployeeID=Sales.EmployeeID
GO

Короче говоря, если механизм сценариев думает о отбрасывании и создании вместе при проверке существования объекта, ему не нужно ставить условие создания.

0

Наконец, после поиска много статей, я нашел решение, которое

 Вы должны сделать"two passes" когдаscripting, В течениеfirst pass,

  • select the options to Check for Existence AND for only the DROP script.
  • Then, on the second pass, de-select the option for Check for Existence and ,select the CREATE script.
    • In addition, use the option Append To File. Then when running the generate scripts on the second pass, uncheck the option for "Overwrite File". This will only work if you are generating a separate file for each object.
Error: User Rate Limit Exceeded
1

Я нашел хорошее решение этой проблемы. Вы должны сделать «два прохода» когда скриптинг. Во время первого прохода выберите параметры для проверки наличия и только для сценария DROP. Затем, на втором проходе, отмените выбор параметра «Проверить наличие» и выберите сценарий CREATE. Кроме того, используйте опцию «Добавить в файл». Затем при запуске сценариев создания на втором проходе снимите флажок «Перезаписать файл». Это будет работать, только если вы генерируете отдельный файл для каждого объекта.

9

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

IF <some condition>
  <start a new batch>

Единственный способ сохранить это в той же партии - это использоватьsp_executesql.

Если вы собираетесь написать сценарийDROP а такжеCREATE одновременно, просто сделайте это без проверки существования объекта. Это даст вам:

DROP PROCEDURE ...;
GO
CREATE PROCEDURE ...;
GO

Кого волнует, еслиDROP потерпит неудачу? (Это не должно быть, потому что вы только что написали сценарий!)

Если вы пишете сценарий для другой системы, котораяmight получить объект, вы получите сообщение об ошибке дляDROP когда это не так, ноCREATE все равно произойдет, так что вы можете игнорироватьDROP ошибки. Если вы действительно хотите, вы можете вручную обернутьDROP заявления вTRY/CATCH но я не думаю, что это необходимо.

Если вам нужно сделать это для большого количества процедур или если вам действительно нужен процесс, чтобы не генерировать доброкачественных ошибок, я предлагаю вам отказаться от примитивных вариантов сценариев Management Studio и использовать для этого сторонний инструмент. Они уже рассмотрели многие из проблем, с которыми вы еще не сталкивались, но решите их. Я написал об этом в блоге:

http://bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/

Error: User Rate Limit Exceeded ChrisA
Error: User Rate Limit Exceededmssqltips.com/sqlservertip/1833/…
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceedednotError: User Rate Limit Exceeded ChrisA
0

Я тоже боролся с той же проблемой. Если вам нужно написать сценарий для объектов для всей базы данных, вы можете рассмотреть ApexSQL Script. Я попробовал несколько инструментов, и ApexSQL создавал сценарии для объектов именно так, как мне было нужно. (если объект существует, тогда отбросьте. создайте объект). Я считаю, что это также работает из командной строки. Обратите внимание, это условно-бесплатная программа; Я использовал только ознакомительную версию, потому что она мне понадобилась всего несколько раз.

Ниже приведен пример вывода процедуры после некоторой конфигурации.

IF (EXISTS(SELECT * FROM sys.objects WHERE [object_id] = OBJECT_ID(N'[dbo].[myProcedure]') AND [type]='P'))
DROP PROCEDURE [dbo].[myProcedure]
GO

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE dbo.myProcedure
AS
    select 1 as a
GO

Похожие вопросы