2017-07-13 1 views
0

Ich habe eine Database project in Visual Studio, die ich versuche, jede Nacht automatisch in einer Testumgebung bereitzustellen. Um dies zu erreichen, verwende ich TFS, das ein PowerShell-Skript verwendet, um "SqlPackage.exe" auszuführen, um alle Änderungen, die während des Tages aufgetreten sind, zu implementieren.

Einige meiner Procs enthalten Logik, die innerhalb eines Skripts ausgeführt wird, die Teil eines Agenten Jobschritt und enthält die following code (In dynamischen SQL) ist:

$(ESCAPE_SQUOTE(JOBID)) 

Bei der Bereitstellung Änderungen, die diese proc beeinflussen, ich erhalte die folgende Ausgabe:

SQL Execution error: A fatal error occurred. Incorrect syntax was encountered while $(ESCAPE_SQUOTE(was being parsed.

Dies ist ein known issue, es scheint, als ob das nicht unterstützt wird. Es scheint eine Funktion des „sqlcmd“ Befehl, um die $ (Zeichen als variable falsch interpretiert:

"override the value of a SQL command (sqlcmd) variable used during a publish action."

So wie ich dieses Problem umgehen, es scheint eine große Einschränkung von „sqlcmd“ zu sein, das können Sie ‚t Variablen deaktivieren, ich weiß nicht, dass der Parameter sieht, dass die ...

Update 1

Scheint, als durch Sie es, indem das‚-x‘Argument Variablensubstitution deaktivieren können von‚sqlcmd‘unterstützt (Source, Documentation):

-x (disable variable substitution)

Noch sehe keine Möglichkeit, dies von "SqlPackage.exe" zu tun.

+0

Wenn Sie den Befehl 'sqlpackage.exe' direkt lokal verwenden, erhalten Sie auch das gleiche Ergebnis. Dieses Problem scheint also nichts mit TFS zu tun zu haben. –

+0

Nein, es ist ein Problem direkt mit dem 'sqlpackage.exe' Befehl, was ich wirklich brauche, ist eine Möglichkeit, Parameter bei der Bereitstellung meines Codes zu deaktivieren. Ich denke, dass sqlpackage sqlcmd bei der Bereitstellung aufruft, aber ich sehe keine Option für beide, die es Ihnen ermöglicht, Variablen zu deaktivieren. –

Antwort

0

Eine Möglichkeit, dies zu umgehen, besteht darin, die Zeichenfolge "$ (ESCAPE_SQUOTE (JOBID))" in eine Skalarfunktion umzuwandeln und anschließend ein PowerShell-Skript zum direkten Aufrufen des Befehls "Sqlcmd" mit dem Parameter "-x" einzurichten "Create/Alter" genannte Funktion vor dem Ausführen von "SqlPackage.exe".

Sieht so etwas in Powershell:

$sql = @" 
USE $database 
GO 

CREATE FUNCTION [dbo].[GetJobID]() 
RETURNS NVARCHAR(MAX) 
AS 
BEGIN 
    RETURN '$(ESCAPE_SQUOTE(JOBID))' 
END 

GO 
"@; 

Sqlcmd -S $servername -U $username -P $password -Q $sql -x; 

Dies ist ein ziemlich schlechtes Problem zu umgehen, aber es macht die Aufgabe zu erfüllen. Ich hoffe wirklich auf etwas Besseres.