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.
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.
:setvar dbNotServer @@servername
SELECT '$(dbNotServer)' AS worked
Résultats
worked
DEVA\DEV2
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]
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.
À 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
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".