Compilation conditionnelle de la procédure stockée SQL Server

8

Version courte: existe-t-il un moyen de compiler conditionnellement des morceaux de code TSQL dans un projet de données SQL Server à l'aide des outils de données SQL Server pour Visual Studio 2010?

J'utilise SQL Server Data Tools dans Visual Studio 2010 pour travailler sur une base de données expérimentale SQL Server Express. La destination finale si les choses fonctionnent bien serait une plate-forme d'entreprise SQL Server. J'ai à la fois une instance 2008 sur une boîte et une instance 2012 sur une autre, car mon entreprise est également en train de migrer de 2008 à 2012 pour les nombreuses bases de données d'entreprise.

Dans d'autres langages de programmation que j'ai utilisés, les directives de préprocesseur facilitent la compilation conditionnelle de parties d'une base de code. Les utilisations les plus courantes pour cela sont d'avoir un code différent pour différentes plates-formes dans des sections restreintes ou d' exclure le code de sortie de débogage des versions .

Ces deux éléments pourraient être très utiles dans certaines procédures de magasin sur lesquelles je travaille. Y a-t-il quelque chose comme ça disponible? Je sais que je peux utiliser des sqlcmdvariables pour échanger des valeurs spécifiques pendant le déploiement, mais je ne sais pas comment utiliser cela pour inclure ou exclure des morceaux de code ultérieurs.

Exemple:

#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
la source

Réponses:

6

Je ne suis pas conscient que cela soit possible avec SSDT malheureusement.

Selon la taille du projet et le nombre de procédures que vous prévoyez d'améliorer avec les goodies 2012, il peut être gérable avec les projets composites .

SSDT peut combiner un projet de base de données avec un ou plusieurs projets de base de données référencés ou dacpac pour décrire un schéma de base de données composite unique. L'utilisation d'un projet composite permet de décomposer une grande base de données en segments plus faciles à gérer, permet à différentes personnes ou équipes d'avoir la responsabilité de différentes parties du schéma global et permet la réutilisation des définitions d'objets de base de données dans plusieurs bases de données.

L'idée serait d'avoir un projet de base, contenant les définitions d'objet communes et des projets spécifiques à la version pour les procédures utilisant de nouvelles fonctionnalités. Le projet 2012 ferait référence au projet de base et une compilation / construction combinerait des objets des deux.

Le PITA serait que vous ne pouvez pas remplacer un objet dans le projet de base par un objet dans un composite, vous devez donc gérer les projets de base, 2008 et 2012. Lorsque vous vouliez une version 2012 d'une procédure particulière, vous devez la supprimer de la base et créer une version dans les projets 2008 et 2012.

Mark Storey-Smith
la source
2

J'ai eu une discussion ouverte sur MSDN à propos de ce besoin. N'ont pas fait beaucoup de progrès. La situation idéale vous permettrait de marquer les objets db comme "héritables" dans les projets ssdt de base afin que les autres projets qui référencent le projet de base ou DAC ne se plaignent pas de l'objet en double, et ne créeraient l'objet de base ou "stub" que si cela n'existait pas. Cela vous permettrait d'avoir des "couches" de modèles de base de données. Voir mon article sur msdn Extension des solutions composites SSDT avec des procédures stockées Overriden

user2624727
la source
2

J'ai réalisé quelque chose de proche de ce qui est demandé en utilisant des événements de pré-construction. Dans mon cas, je voulais que différents utilisateurs et connexions soient inclus dans un déploiement en fonction de la configuration en cours de création.

Pour ce faire, j'ai créé un fichier .sql pour chaque configuration de build, pour chaque utilisateur. Je les ai marqués comme Build Action 'None': (je les ai mis dans un sous-dossier du projet)

  • Debug_SomeUser.sql
  • Release_SomeUser.sql

J'ai ensuite créé un fichier vide SomeUser.sql (avec Build Action = 'Build').

Dans la ligne de commande de l'événement Pre-build:

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

C'était une nuisance qu'une équipe de codeurs crée constamment des conflits dans git, j'ai donc également ajouté à la ligne de commande pré-build

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

Il était assez difficile de faire fonctionner cela car j'avais un nombre beaucoup plus important d'utilisateurs et de configurations à prendre en compte, mais cela fonctionne.

Hugh Jones
la source