Направих още малко проучване, така че ето моето разбиране за това, за да разширя написаното дотук:
Какво е SQLCMD
SQLCMD.exe
е конзолна помощна програма, включена в инсталацията на SQL Server 2005 и по-нова версия. Обикновено можете да го намерите в път като c:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE
.
Това е проста среда за скриптове, която позволява автоматизиране на задачи, свързани със SQL сървър. Например, можете да напишете и изпълните скрипт, който ще влезе в конкретен екземпляр на SQL Server, ще изпълни скриптове от дадена директория на тази връзка и ще съхрани изхода в определен файл.
Invoke-Sqlcmd
cmdlet беше въведен със SQL Server 2008 като средство за замяна на този инструмент със стандартизиран, базиран на Powershell подход, запазващ по-голямата част от оригиналния синтаксис и функционалност.
Какво е режимът SQLCMD в SSMS
В SSMS, режим SQLLCMD е режим на изпълнение на скрипт, който симулира средата sqlcmd.exe и следователно приема някои команди, които не са част от езика T-SQL. За разлика от sqlcmd.exe
, той се свързва с базата данни чрез SqlClient (по същия начин като SSMS), а не ODBC доставчик на данни, така че в някои аспекти може да има различно поведение от sqlcmd.exe
.
Изпълнението на скриптове в режим SQLCMD позволява да се използват команди, типични за sqlcmd.exe
заобикаляща среда. Въпреки това, няма поддръжка на IntelliSense или отстраняване на грешки за режим SQLCMD, така че поддържането на скриптове, които смесват чист T-SQL със специфичен за SQLCMD код, може да бъде мъка. Затова трябва да се използва само когато е необходимо.
Примерен случай на употреба
Да предположим, че една компания има конвенция за именуване за бази данни, които включват среда в името, напр.:MyDb_Prod , MyDb_Тест , MyDb_Dev . Тази конвенция може да се използва за свеждане до минимум на вероятността от грешки .
Когато разработчик напише T-SQL скрипт, той ще трябва да се изпълнява в различни среди в процеса на внедряване/тест, което ще изисква много версии на кода:
SELECT *
FROM [MyDb_Dev].[dbo].[MyTable1] -- MyDb_Dev -> MyDb_Test -> MyDb_Prod
Вместо това можем да предположим, че името на базата данни ще бъде предоставено като SQLCMD променлива в процеса на внедряване и ще има точно същия файл, разгърнат във всички среди:
-- :setvar databaseName "MyDb_Dev" -- uncomment for testing in SSMS
SELECT *
FROM [$(databaseName)].[dbo].[MyTable1]
(в този прост пример името на базата данни може да бъде пропуснато напълно, но ако имате свързвания между база данни, използването на име на база данни е необходимо)