Festlegen von Variablen im SQLCMD-Modus

13

Verwenden von SQL Server 2008 R2 Enterprise Edition

Betrachten Sie die folgende Aussage:

:setvar source_server_name "SERVERNAME\INSTANCENAME"

Ist es im SQLCMD-Modus möglich, diesen Wert mit TSQL abzurufen?

Etwas wie: :setvar source_server_name = SELECT @@servername

Vielen Dank

Update 15.07.2013

Die beiden unten aufgeführten Antworten haben nicht das gewünschte Ergebnis geliefert, daher füge ich eine relevantere Exampe hinzu.

:setvar source_server_name [myserver]

Die Variable source_server_name wird auf die Textzeichenfolge [myserver_1] gesetzt.

Das möchte ich können:

create table #tmp(
id int identity(1,1),
server sysname
)

insert into #tmp values('myserver_1'),('myserver_2');

:setvar source_server_name = SELECT server FROM #tmp WHERE id = 1

select '$(source_server_name)' 

(No column name)
myserver_1

Die Variable source_server_name würde auf den Wert in server für die ID 1 gesetzt.

Craig Efrein
quelle
Nicht, dass ich es gewusst hätte oder es herausfinden könnte.
1
Was Sie verlangen, ist per se nicht möglich, da sqlcmd-Variablen vom Client ausgewertet werden, bevor die SQL jemals an den Server gesendet wird. Sie fordern den SQL-Server auf, den Wert einer Variablen festzulegen, die er nie sieht. Führen Sie einen SQL-Profiler-Trace für ein SQL-Skript mit SQL-Cmd-Variablen aus, und Sie werden sehen, dass alle bereits ausgewertet wurden.
Tim Abell

Antworten:

9

Ich denke, Sie müssen Ihre Ergebnisse in eine Datei ausgeben und sie wieder einlesen. So etwas sollte Ihnen helfen, sich dem zu nähern, wonach Sie suchen:

:setvar MyDir "C:\scripts"
:OUT $(MyDir)\test.txt
PRINT ':SETVAR ServerName ''' + @@SERVERNAME + ''''
GO
:OUT stdout
:r $(MyDir)\test.txt
GO
SELECT $(ServerName)

Sie können weitere Beispiele hier sehen .

SQLRockstar
quelle
Vielen Dank. Ich bin bereits von der Arbeit abgereist, also werde ich deinen Vorschlag am Montag
ausprobieren
Ich habe meine Frage aktualisiert
Craig Efrein
Diese Antwort hat sich als die nützlichste erwiesen.
Craig Efrein
1
Ich denke, der wichtige Teil hier ist, dass Sie separate Stapel haben müssen, um 1) die SETVAR-Datei zu generieren, 2) sie auszuführen, um die Skriptvariable zu initialisieren, und schließlich 3) die Skriptvariable zu verwenden.
Andriy M