Команды режима SQLCMD не являются командами T-SQL; они работают только в SQL Server Management Studio (SSMS)/Visual Studio (VS) и SQLCMD.EXE. Режим SQLCMD по своей сути является тем, как работает SQLCMD.EXE, и его можно включить вручную в SSMS/VS; это часть этих приложений, а не то, что можно сделать через провайдера.
Эти приложения интерпретируют команды режима SQLCMD и не передают их SQL Server. Команды режима SQLCMD сначала анализируются/выполняются (именно так они могут повлиять на SQL, который должен быть отправлен), а затем окончательная версия SQL отправляется на SQL Server.
Следовательно, сценарии развертывания SQL, созданные SQL Server Data Tools (SSDT)/Visual Studio, необходимо запускать с помощью одной из этих трех программ.
Поскольку у вас уже есть файл .dacpac
, Microsoft предлагает несколько способов опубликовать те, которые вам следует проверить:
Вы также можете создать сценарий публикации SQL через DacServices. GenerateDeployScript(), но это не изменит ситуацию, как указано выше, поскольку SQL-скрипт публикации/развертывания, независимо от того, сгенерирован ли он из Visual Studio "Publish {project_name}" или GenerateDeployScript()
, является одним и тем же скриптом. Это означает, что он будет иметь команды двоеточия режима SQLCMD, такие как :setvar
и :on error exit
, а также переменные режима SQLCMD, которые, по крайней мере, будут $(DatabaseName)
, которые используются в следующей строке:
USE [$(DatabaseName)];
Хотя можно закомментировать начальные :setvar
строк, установив DacDeployOptions свойство CommentOutSetVarDeclarations на true
, что по-прежнему оставит строку :on error exit
, а также строку для :setvar __IsSqlCmdEnabled "True"
, которая используется для определения того, включен ли режим SQLCMD. Чуть выше этой конкретной строки :setvar
находится комментарий, в котором говорится:
/*
Detect SQLCMD mode and disable script execution if SQLCMD mode is not supported.
To re-enable the script after enabling SQLCMD mode, execute the following:
SET NOEXEC OFF;
*/
Таким образом, они действительно предполагают, что этот сценарий запускается только через SQLCMD, будь то через DOS -> SQLCMD.EXE или PowerShell -> Invoke-SqlCMD.
Технически можно сгенерировать строку содержимого сценария развертывания (а не stream
) и манипулировать этой строкой, а) удалив любые команды с двоеточием и б) заменив «$ (DatabaseName)» на любую базу данных, которую вы собираетесь использовать. развертывание в. Однако я не пробовал это, я не рекомендую это, и я не уверен, что это будет работать во всех ситуациях, когда сценарии развертывания могут быть сгенерированы SQL Server Data Tools. Но это похоже на возможный вариант.
Кроме того, незначительное отношение: вам не нужен SMO для запуска сценариев SQL. SMO — это средство взаимодействия с SQL Server через объекты, а не напрямую через команды T-SQL.
EDIT:
Ссылки, где другие пробовали это и нашли, что это не работает:
Возможности программной работы сгенерированного SQL-скрипта публикации:
person
Solomon Rutzky
schedule
28.10.2014