Quando si utilizza la modalità SQLCMD con SSMS (non dalla riga di comando), esiste un modo per assegnare il server e l'istanza correnti a una variabile? Ciò è diverso e distinto dall'assegnazione delle normali variabili TSQL.
Definizione del problema
Voglio usare la potenza dell'espansione variabile di SQLCMD per sostituire i valori specifici dell'ambiente nei nostri script di distribuzione anziché l'attuale mash di creazione di stringhe tsql in cui ho camminato. Con l'unica eccezione dell'ambiente attuale, l'uso di SQLCMD per gestire le distribuzioni è andato molto bene.
--
-- define 2 sqlcmd variables that will be expanded in scripts
--
:setvar dbServer "DEVA2\DEV2"
:setvar dbNotServer @@servername
SELECT
'$(dbServer)' AS hard_coded_value
, @@servername AS [servername]
, '$(dbNotServer)' AS dbNotServer
E questo genera i seguenti risultati.
hard_coded_value servername dbNotServer
DEVA2\DEV2 DEVA2\DEV2 @@servername
Meat Loaf dice che 2 su 3 non sono male , ma preferirei avere una soluzione 3 su 3. Quando quello script viene distribuito sul server di prova, non voglio fidarmi delle persone che eseguono la distribuzione con la modifica dello script.
Se l'unica soluzione all'utilizzo di SQLCMD è quella di invocare gli script completamente dalla riga di comando, posso accettarlo, ma volevo buttarlo qui perché sono pronto a utilizzare SQLCMD.
Uscita desiderata
:setvar dbNotServer @@servername
SELECT '$(dbNotServer)' AS worked
risultati
worked
DEVA\DEV2
Inseguimenti infruttuosi
Il primo link BOL ha mostrato risultati promettenti, tutto quello che dovevo fare era usare SQLCMDSERVER ma senza risultati. Eseguito nel contesto di SSMS in modalità SQLCMD, genererà un errore di scripting fatale
-- A fatal scripting error occurred.
-- Variable SQLCMDSERVER is not defined.
SELECT '$(SQLCMDSERVER)' AS [FatalScriptingError]
Aggiornamento di Tumbleweed
2011-08-12 Nel tentativo di ridurre il mio problema nella forma più semplice, in base alle risposte, ho semplificato troppo le mie domande (le mie scuse). Una parte della query che ho usato è di seguito. I due reponder hanno ragione nelle loro risposte che identificano il wrapping @@nomeserver nei segni di spunta determina il valore letterale e per ottenere il valore espanso, dovrei scartarlo dalle virgolette. Il mio desiderio era di usare la sostituzione della variabile sqlcmd piuttosto che la costruzione di stringhe che unwrap avrebbe comportato.
INSERT INTO
dbo.SSISCONFIG
(
ConfigurationFilter
, ConfiguredValue
, PackagePath
, ConfiguredValueType
, Application
, Category
, Subcategory
, Comment
)
SELECT
'Default.Accounting' AS ConfigurationFilter
, 'Data Source=$(dbServer);Initial Catalog=Accounting;Provider=SQLNCLI10.1;Integrated Security=SSPI;Packet Size=32767;' AS ConfiguredValue
, '\Package.Connections[Accounting].Properties[ConnectionString]' AS PackagePath
, 'String' AS ConfiguredValueType
, 'Defaults' AS Application
, 'Connection' AS Category
, 'Database' AS Subcategory
, 'Default connection string' AS Comment
SELECT
'Default.$(sqlVersion).CorporateReporting' AS ConfigurationFilter
, 'Data Source=$(dwServer);Initial Catalog=CRDS;Provider=SQLNCLI10.1;Integrated Security=SSPI;Packet Size=32767;' AS ConfiguredValue
, '\Package.Connections[CorporateReporting].Properties[ConnectionString]' AS PackagePath
, 'String' AS ConfiguredValueType
, 'Defaults' AS Application
, 'Connection' AS Category
, 'Database' AS Subcategory
, 'Default connection string' AS Comment
La chiamata dalla riga di comando funziona (come previsto)
C:\>sqlcmd -E -d master -S DEVA2\DEV2 -Q "SELECT '$(SQLCMDSERVER)' AS [servername]"
Ho provato e scartato altre permutazioni di: setvar x @@ servername nel tentativo di ottenere il valore valutato della variabile del database memorizzato nella variabile SQLCMD. A questo punto, sono abbastanza certo che le variabili sqlcmd sono sostituite nelle query prima della compilazione delle query, ma mi piacerebbe essere smentito.