web-dev-qa-db-fra.com

Mode SQLCMD dans SSMS et @@ EXPANSION VARIABLE

Lorsque vous utilisez le mode SQLCMD avec SSMS (pas à partir de la commande Commandline), il existe un moyen d'affecter le serveur et l'instance actuels à une variable? Ceci est différent et distinct d'attribuer des variables TSQL ordinaires.

Définition du problème

Je souhaite utiliser la puissance de l'expansion variable de SQLCMD pour substituer des valeurs spécifiques à l'environnement dans nos scripts de déploiement au lieu de la purée de construction de chaînes TSQL existante que j'ai entrée. À une exception de l'environnement actuel, l'utilisation de SQLCMD pour gérer les déploiements s'est extrêmement bien passée.

--
-- 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

Et cela génère les résultats suivants.

hard_coded_value  servername  dbNotServer
DEVA2\DEV2        DEVA2\DEV2  @@servername

Le pain de viande dit 2 sur 3 n'est pas mauvais , mais je préfère avoir une solution de 3 sur 3. Lorsque ce script est déployé, le serveur de test, je ne veux pas faire confiance aux personnes de déploiement avec la modification du script.

Si la seule solution à utiliser SQLCMD consiste à appeler des scripts complètement à partir de la ligne de commande, je peux accepter cela mais voulait y jeter ici car je suis vert pour utiliser SQLCMD.

Sortie désirée

:setvar dbNotServer @@servername
SELECT '$(dbNotServer)' AS worked

Résultats

worked
DEVA\DEV2

Activités infructueuses

Le premier lien Bol a montré une promesse, tout ce que j'ai dû faire était d'utiliser SQLCMDSERVER, mais en vain. Exécutez dans le contexte de SSMS en mode SQLCMD, il lancera une erreur de script fatale.

-- A fatal scripting error occurred.
-- Variable SQLCMDSERVER is not defined.
SELECT '$(SQLCMDSERVER)' AS [FatalScriptingError]

Mise à jour de Tumbleweed

2011-08-12 Pour tenter de rédiger mon problème sur la forme la plus simple, sur la base des réponses, j'ai trop simplifié mes questions (mes excuses). Une partie de la requête que j'ai utilisée est ci-dessous. Les deux repondes sont corrects dans leurs réponses qui identifient l'enveloppe @@ Servername des tiques résultent de la valeur littérale et d'obtenir la valeur étendue, je devrais le déballer à partir des guillemets. Mon désir était d'utiliser la substitution variable SQLCMD plutôt que la construction de cordes qui débouchrait.

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

Fonctionnement d'invocation de ligne de commande (comme prévu)

C:\>sqlcmd -E -d master -S DEVA2\DEV2 -Q "SELECT '$(SQLCMDSERVER)' AS [servername]"

J'ai essayé et jeté d'autres permutations de la: SETVAR X @@ ServerName dans une tentative d'obtention de la valeur évaluée de la variable de base de données stockée dans la variable SQLCMD. À ce stade, je suis assez certain que les variables SQLCMD sont subordonnées dans des requêtes avant la compilation de la requête, mais aimeraient être prouvées.

Bol références

8
billinkc

À moins que je manque quelque chose, cela ne fonctionne pas, sans les apostrophes?:

:setvar dbNotServer @@servername
SELECT $(dbNotServer) AS worked

Il renvoie Server\Instance pour moi en mode SQLCMD via SSMS.

Modifier le 02/12/2018 Après avoir parcouru ma réponse à une autre question et revoir, je peux voir la question, je crois que cela se résume à ceci:

:setvar dbNotServer @@servername
print '$(dbNotServer)'

Cette sortie @@ ServerName , et la sortie souhaitée est la valeur de @@ ServerName. La seule façon de faire cela est dans la réponse acceptée ici

3
SqlACID

Sous "Sortie souhaitée", le T-SQL allant au serveur devient:

SELECT '@@servername' AS worked

Mettre des citations simples autour de @@servername En fait un littéral à chaîne et ne sera pas remplacé par le nom réel, c'est pourquoi vous voyez @@servername comme valeur.

Si vous souhaitez afficher le nom du serveur, supprimez les guillemets simples, rendant votre T-SQL:

SELECT @@servername AS worked

Je ne suis pas tout à fait clair que je comprends la question, mais c'est ainsi que vous obtiendrez ce qui est dans votre "sortie souhaitée".

1
Pavel