Jeg foretog noget mere research, så her er min forståelse af dette for at udvide det, der er blevet skrevet indtil videre:
Hvad er SQLCMD
SQLCMD.exe
er et konsolværktøj inkluderet i installationen af SQL Server 2005 og nyere. Du kan typisk finde det i en sti som c:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE
.
Det er et simpelt scriptmiljø, der tillader automatisering af opgaver relateret til SQL server. For eksempel kan du skrive og udføre et script, der vil logge på en specifik forekomst af SQL Server, udføre scripts fra en given mappe på denne forbindelse og gemme outputtet i en specificeret fil.
Invoke-Sqlcmd
cmdlet blev introduceret med SQL Server 2008 som et middel til at erstatte dette værktøj med en standardiseret, Powershell-baseret tilgang, der bevarer det meste af den originale syntaks og funktionalitet.
Hvad er SQLCMD-tilstand i SSMS
I SSMS, SQLCMD-tilstand er en script-udførelsestilstand, der simulerer sqlcmd.exe-miljøet og derfor accepterer nogle kommandoer, der ikke er en del af T-SQL-sproget. I modsætning til sqlcmd.exe
, kontakter den databasen ved hjælp af SqlClient (på samme måde som SSMS), ikke ODBC dataudbyder, så i nogle aspekter kan den have en anden adfærd end sqlcmd.exe
.
Udførelse af scripts i SQLCMD-tilstand gør det muligt at bruge kommandoer, der er typiske for sqlcmd.exe
miljø. Der er dog ingen IntelliSense eller debugging-understøttelse for SQLCMD-tilstand, så det kan være besværligt at vedligeholde scripts, der blander ren T-SQL med SQLCMD-specifik kode. Derfor bør den kun bruges, når det er nødvendigt.
Eksempel på brug
Lad os antage, at en virksomhed har en navngivningskonvention for databaser, der inkluderer miljø i navnet, f.eks.:MyDb_Prod , MyDb_Test , MyDb_Dev . Denne konvention kan bruges til at minimere risikoen for fejl .
Når en udvikler skriver et T-SQL-script, skal det udføres i forskellige miljøer i implementerings-/testprocessen, hvilket ville kræve mange versioner af koden:
SELECT *
FROM [MyDb_Dev].[dbo].[MyTable1] -- MyDb_Dev -> MyDb_Test -> MyDb_Prod
I stedet kan vi antage, at databasenavnet vil blive angivet som en SQLCMD-variabel i implementeringsprocessen og have nøjagtig den samme fil implementeret i alle miljøer:
-- :setvar databaseName "MyDb_Dev" -- uncomment for testing in SSMS
SELECT *
FROM [$(databaseName)].[dbo].[MyTable1]
(i dette simple eksempel kunne databasenavn udelades helt, men hvis du har krydsdatabasesammenføjninger, er det nødvendigt at bruge databasenavn)