2016-09-19 1 views
3

J'ai ajouté une colonne supplémentaire à une table que je souhaite initialiser à l'aide d'une requête dans le script de post-déploiement. Malheureusement, je n'arrive pas à écrire une requête qui peut être exécutée à chaque fois, donc je cherche un moyen de vérifier le script de pré-déploiement si la colonne est disponible et de passer un argument ou une variable au script de post-déploiement exécutera ensuite la requête d'initialisation une fois.Script de pré-déploiement et de post-déploiement de projet de base de données SQL Server

Tentative 1: J'ai essayé la fixation d'un sqlcmd var dans le script de pré-déploiement, mais la syntaxe suivante n'est pas autorisé:

IF COL_LENGTH('dbo.Table','NewColumn') IS NULL 
    :setvar PerformInitQuery 1 

Tentative 2: J'ai aussi essayé d'utiliser une normale variable dans le script de pré-déploiement:

DECLARE @PerformInitQuery BIT = 0 
IF COL_LENGTH('dbo.Table','NewColumn') IS NULL 
    SET @PerformInitQuery = 1 

et l'accès dans le script de post-déploiement:

IF @PerformInitQuery = 1 
BEGIN 
    :r ".\DeploymentScripts\PerformInitQuery.sql" 
END 

Cette dernière tentative semblait fonctionner lors de la publication du projet à partir de Visual Studio mais pas sur notre serveur de construction; qui utilise SqlPackage.exe pour publier le fichier .dacpac généré dans la base de données.

Erreur SQL72014: .Net SqlClient Data Provider:

Msg 137, Niveau 15, État 2, Ligne 12
doit déclarer la variable scalaire "@PerformInitQuery"

+0

Une variable normale ne fonctionnera pas car elle n'existe que dans un seul lot. Le déploiement utilisera plusieurs lots. Vérifiez simplement le script de création et vous verrez plusieurs instructions 'GO'. Pourquoi ne pas ajouter la même vérification que celle que vous effectuez dans votre pré-déploiement à votre post-déploiement? – JodyT

+0

Parce que la construction va créer la colonne avant que le script de post-déploiement s'exécute, je n'ai aucun moyen de déterminer si elle a été créée cette course ou une course avant – Zenuka

Répondre

3

Vous pouvez essayer utiliser une table temporaire pour contenir les valeurs que vous souhaitez passer des scripts pré-post à post-scriptum;

/* 
    Pre-Deployment Script Template       
    -------------------------------------------------------------------------------------- 
    This file contains SQL statements that will be executed before the build script. 
    Use SQLCMD syntax to include a file in the pre-deployment script.   
    Example:  :r .\myfile.sql        
    Use SQLCMD syntax to reference a variable in the pre-deployment script.   
    Example:  :setvar TableName MyTable        
        SELECT * FROM [$(TableName)]     
    -------------------------------------------------------------------------------------- 
    */ 

    select 'hello world' as [Col] into #temptable 

repris dans le script de post-déploiement;

/* 
Post-Deployment Script Template       
-------------------------------------------------------------------------------------- 
This file contains SQL statements that will be appended to the build script.  
Use SQLCMD syntax to include a file in the post-deployment script.   
Example:  :r .\myfile.sql        
Use SQLCMD syntax to reference a variable in the post-deployment script.  
Example:  :setvar TableName MyTable        
       SELECT * FROM [$(TableName)]     
-------------------------------------------------------------------------------------- 
*/ 

declare @var nvarchar(200) 
select @var = [Col] from #temptable 

print @var 

Bonjour tout le monde

Mise à jour terminée.

+0

Merci, cela a fait le travail! – Zenuka

+0

De rien! –