Условная компиляция хранимой процедуры SQL Server

8

Краткая версия: есть ли способ условно компилировать фрагменты кода TSQL в проекте данных SQL Server с использованием средств данных SQL Server для Visual Studio 2010?

Я использую инструменты данных SQL Server в Visual Studio 2010 для работы с экспериментальной базой данных SQL Server Express. Конечным пунктом назначения, если все будет работать хорошо, будет корпоративная платформа SQL Server. У меня есть экземпляр 2008 года на одном компьютере и экземпляр 2012 года на другом, потому что моя компания также находится в процессе перехода с 2008 на 2012 год для многих корпоративных баз данных.

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

Оба из них могут быть очень полезны в некоторых процедурах магазина, над которыми я работаю. Есть ли что-нибудь подобное? Я знаю, что могу использовать sqlcmdпеременные для замены определенных значений во время развертывания, но я не могу понять, как использовать это для включения или исключения последующих фрагментов кода.

Пример:

#IF $(DebugVersion) = 'True'
    -- A bunch of useful PRINTs and what not
#ELSE
    SET NOCOUNT ON
#ENDIF

#IF $(SSVersion) = '2012'
    SET @pretty_date = FORMAT(@some_date, 'dddd, MMM dd, yyyy')
#ELSE
    SET @pretty_date = CAST(@some_date AS nvarchar(12))
#ENDIF
Джошуа Хониг
источник

Ответы:

6

Я не знаю, что это возможно с SSDT, к сожалению.

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

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

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

PITA может заключаться в том, что вы не можете переопределить объект в базовом проекте объектом в композитном виде, поэтому вам придется поддерживать базовые проекты на 2008 и 2012 годы. Если вам нужна версия конкретной процедуры 2012 года, вам придется удалить ее из базы и создать версию в проектах как 2008, так и 2012 года.

Марк Стори-Смит
источник
2

У меня было открытое обсуждение на MSDN об этой необходимости. Не достигли большого прогресса. Идеальная ситуация позволила бы вам пометить объекты db как «наследуемые» в базовых проектах ssdt, чтобы другие проекты, которые ссылаются на базовый проект или DAC, не жаловались на дублированный объект и создавали только базовый объект или «заглушку», если его не было Это позволит вам иметь «слои» моделей баз данных. См. Мое сообщение о расширении составных решений SSDT с помощью переопределенных хранимых процедур.

user2624727
источник
2

Я достиг чего-то близкого к тому, что спрашивают, используя события предварительной сборки. В моем случае я хотел, чтобы в развертывании были включены разные пользователи и логины, в зависимости от того, какая конфигурация создавалась.

Для этого я создал файл .sql для каждой конфигурации сборки, для каждого пользователя. Я пометил их как Build Action 'None': (Я поместил их в подпапку проекта)

  • Debug_SomeUser.sql
  • Release_SomeUser.sql

Затем я создал пустой файл SomeUser.sql (с Build Action = 'Build').

В командной строке события Pre-build:

Copy $(ProjectDir)subfolder\$(Configuration)_Someuser.sql $(ProjectDir)Someuser.sql

Было неприятно, что команда кодеров постоянно создавала конфликты в git, поэтому я также добавил в командную строку перед сборкой

git update-index --assume-unchanged $(ProjectDir)Someuser.sql 

Было довольно трудно заставить это работать, так как у меня было гораздо большее количество пользователей и конфигураций, но это работает.

Хью Джонс
источник