SMO - Как написать скрипт в стиле динамического SQL? (ЕСЛИ НЕ СУЩЕСТВУЕТ) - PullRequest
0 голосов
/ 07 июня 2019

Когда я использую SMO для сценария процедуры с параметром IncludeIfNotExists, установленным в значение true, она сначала создает процедуру, а затем изменяет ее. Есть ли способ просто создать процедуру в динамическом стиле SQL? (как в SSMS)

Вот что я получаю от SMO:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[proc_a]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[proc_a] AS' 
END
GO
ALTER PROCEDURE [dbo].[proc_a] 
AS
BEGIN 
-- etc..
END
GO

Я хочу что-то вроде этого:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[proc_a]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'
CREATE PROCEDURE [dbo].[proc_a] 
AS
BEGIN
-- etc..

END
' 
END
GO

1 Ответ

0 голосов
/ 10 июня 2019

Для всех, кто интересуется, использование SMO-сборки SQL 2008 создает код с использованием стиля Dynamic-SQL, а при использовании SQL 2017 - код с оператором ALTER.

[System.Reflection.Assembly]::Load("Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")
[System.Reflection.Assembly]::Load("Microsoft.SqlServer.SmoExtended, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")
[System.Reflection.Assembly]::Load("Microsoft.SqlServer.Smo, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")
[System.Reflection.Assembly]::Load("Microsoft.SqlServer.SmoExtended, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")
...