Compilação condicional do procedimento armazenado do SQL Server

8

Versão curta: Existe alguma maneira de compilar condicionalmente partes do código TSQL em um Projeto de Dados do SQL Server usando o SQL Server Data Tools para Visual Studio 2010?

Estou usando o SQL Server Data Tools no Visual Studio 2010 para trabalhar em um banco de dados experimental do SQL Server Express. O destino final, se as coisas funcionarem bem, seria uma plataforma corporativa do SQL Server. Eu tenho uma instância de 2008 em uma caixa e uma instância de 2012 em outra, porque minha empresa está migrando de 2008 para 2012 para os muitos bancos de dados corporativos.

Em outras linguagens de programação que usei, as diretivas de pré-processador facilitam a compilação condicional de partes de uma base de código. Os usos mais comuns para isso são ter códigos diferentes para plataformas diferentes em seções restritas ou excluir o código de saída de depuração das compilações de versão .

Ambos podem ser muito úteis em alguns procedimentos de armazenamento em que estou trabalhando. Existe algo assim disponível? Sei que posso usar sqlcmdvariáveis ​​para trocar valores específicos durante a implantação, mas não consigo descobrir como usá-lo para incluir ou excluir trechos de código subsequentes.

Exemplo:

#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
Joshua Honig
fonte

Respostas:

6

Infelizmente, não sei que isso é possível com o SSDT.

Dependendo do tamanho do projeto e de quantos procedimentos você pretende aprimorar com os presentes de 2012, ele pode ser gerenciado com os Projetos compostos .

O SSDT pode combinar um projeto de banco de dados com um ou mais projetos ou dacpacs de banco de dados referenciados para descrever um único esquema de banco de dados composto. O uso de um projeto composto permite que um grande banco de dados seja dividido em partes mais gerenciáveis, permite que diferentes pessoas ou equipes tenham responsabilidade por diferentes partes do esquema geral e permite a reutilização de definições de objeto de banco de dados em vários bancos de dados.

A noção seria ter um projeto base, contendo as definições de objetos comuns e projetos específicos da versão para procedimentos que usavam novos recursos. O projeto de 2012 faria referência ao projeto base e uma compilação / construção combinaria objetos de ambos.

A PITA seria que você não pode substituir um objeto no projeto base por um objeto em um composto, portanto, você deve manter os projetos base, 2008 e 2012. Quando você queria uma versão 2012 de um procedimento específico, seria necessário removê-la da base e criar uma versão nos projetos de 2008 e 2012.

Mark Storey-Smith
fonte
2

Eu tive uma discussão aberta no MSDN sobre essa necessidade. Não fizeram muito progresso. A situação ideal permitiria sinalizar objetos db como "herdáveis" nos projetos ssdt de base, para que outros projetos que fazem referência ao projeto base ou ao DAC não se queixem do objeto duplicado e só criem o objeto base ou "stub" se não existia. Isso permitiria ter "camadas" de modelos de banco de dados. Veja meu post no msdn Estendendo as soluções compostas SSDT com procedimentos armazenados substituídos

user2624727
fonte
2

Consegui algo próximo ao que está sendo solicitado usando eventos de pré-construção. No meu caso, eu queria que usuários e logons diferentes fossem incluídos em uma implantação, de acordo com a qual a configuração estava sendo criada.

Para fazer isso, criei um arquivo .sql para cada configuração de compilação, para cada usuário. Eu as sinalizei como Ação de compilação 'Nenhuma': (coloquei em uma subpasta do projeto)

  • Debug_SomeUser.sql
  • Release_SomeUser.sql

Criei um arquivo vazio SomeUser.sql (com Build Action = 'Build').

Na linha de comando do evento Pre-build:

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

Era um incômodo que uma equipe de codificadores estivesse constantemente criando conflitos no git, então eu também adicionei à linha de comando de pré-compilação

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

Foi bastante complicado fazer isso funcionar, pois eu tinha um número muito maior de usuários e configurações a considerar, mas funciona.

Hugh Jones
fonte