Я провел еще несколько исследований, поэтому вот мое понимание этого, чтобы расширить то, что было написано до сих пор:
Что такое SQLCMD
SQLCMD.exe являетсяКонсольная утилита включена в установку SQL Server 2005 и выше.Обычно его можно найти по пути, например c:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE
.
. Это простая среда сценариев, позволяющая автоматизировать задачи, связанные с сервером SQL.Например, вы можете написать и выполнить сценарий, который будет входить в конкретный экземпляр SQL Server, выполнять сценарии из данного каталога в этом соединении и сохранять выходные данные в указанном файле.
Invoke-Sqlcmd
* Командлет 1014 * был представлен в SQL Server 2008 как средство для замены этого инструмента стандартизированным подходом на основе Powershell, сохраняя большую часть исходного синтаксиса и функциональности.
Что такое режим SQLCMD в SSMS
В SSMS Режим SQLCMD - это режим выполнения скрипта, который имитирует среду sqlcmd.exe и поэтому принимает некоторые команды, не являющиеся частью языка T-SQL.В отличие от sqlcmd.exe
, он связывается с базой данных, используя SqlClient (так же, как SSMS), а не ODBC поставщик данных, поэтому в некоторых аспектах он может вести себя иначе, чем sqlcmd.exe
.
Выполнение сценариев в режиме SQLCMD позволяет использовать команды, типичные для среды sqlcmd.exe
.Однако IntelliSense или поддержка отладки для режима SQLCMD отсутствуют, поэтому поддержка сценариев, которые смешивают чистый T-SQL с кодом, специфичным для SQLCMD, может быть проблематичной.Следовательно, его следует использовать только тогда, когда это необходимо.
Пример варианта использования
Предположим, что в компании существует соглашение об именах для баз данных, в которые входит имя среды, например: MyDb_ Prod , MyDb_ Test , 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]
(в этом простом примере имя базы данных может быть вообще опущено, но если у вас есть соединения между базами данных, необходимо использовать имя базы данных)