Как изменить переменную SSDT SQLCMD в pre-script?

Я пытаюсь выяснить, как изменить переменную SQLCMD на лету, и я не мог заставить ее работать.

Цель состоит в том, чтобы получить значение из SELECT и присвоить переменную SQLCMD этому значению.

Я пробовал:

1)

:servar myVariable SELECT @myVariable = 1 

2) Попытался поставить значение файла с помощью: OUT, но он говорит, что:

Ошибка 1 72006: Неустранимая ошибка сценария: Command Out не поддерживается.

Вам нужно объявить временный sql @variable и присвоить ему значение из select.

Затем инициализируйте переменную sqlcmd, используя sql @variable.

 DECLARE @sqlVar CHAR(1) SELECT @sqlVar = '1' :setvar myVar @sqlVar SELECT $(myVar) as value SELECT @sqlVar = '2' :setvar myVar @sqlVar SELECT $(myVar) as value 

Это невозможно. SQLCMD является всего лишь предварительным процессором, прежде чем скрипт будет даже отправлен на сервер.

Ответ, который вы приняли, несколько запутанный.

Он фактически не присваивает переменной SQLCMD на лету» каким-либо значимым образом.

 :setvar myVar @sqlVar 

Просто присваивает строку «@sqlVar» переменной SQL Cmd (излишне и ошибочно дважды). Затем эта строка используется при замене строки в $(myVar) .

Все это происходит до того, как сценарий даже отправлен на сервер (и, очевидно, до начала выполнения и переменной SQL присваивается любое значение)

Результат скрипта после замены всего $(myVar) на @sqlVar выглядит следующим образом.

Это то, что отправлено на сервер.

 DECLARE @sqlVar CHAR(1) SELECT @sqlVar = '1' SELECT @sqlVar as value SELECT @sqlVar = '2' SELECT @sqlVar as value 

В настоящее время нет назначения «на лету» для переменной SQLCMD. Единственное назначение – это переменная SQL.

Ответ на https://stackoverflow.com/a/30086248/623190 :

Круто! Просто знайте о ловушке:

 DECLARE @sqlVar CHAR(1) SELECT @sqlVar = '1' :setvar myVar @sqlVar SELECT $(myVar) as value GO -- SELECT @sqlVar = '2' -- :setvar myVar @sqlVar SELECT $(myVar) as value 

результат:

 Msg 137, Level 15, State 2, Line 6 Must declare the scalar variable "@sqlVar". 

Если мы не можем принести значение переменной SQLCMD Variable over GO (когда она была назначена обычной переменной), тогда нет смысла использовать переменную SQLCMD в пакете.

Сравните с кодом, который работает:

 :setvar myVar '1' SELECT $(myVar) as value GO SELECT $(myVar) as value 

И это волшебным образом работает:

 :OUT C:\Temp\SetVarTest.sql declare @command varchar(100) = ':SETVAR myVar ' + cast((select count(*) from sys.objects) as varchar(10)); PRINT @command GO :OUT stdout :r C:\Temp\SetVarTest.sql GO PRINT $(myVar) 

Подробнее см. В статье « Взлом SQLCMD-режима» .

  • Как упаковать вкладчика развертывания в dacpac?
  • Как преобразовать VS2010 SQL Server Unit тестовый проект в VS 2012?
  • Как разработать t-sql в Visual Studio?
  • Я не понимаю, что делает SSDT в отличие от (или нет?) SSMS и обозревателя объектов SQL Server
  • MS Build публикует ошибки проекта SSDT, создавая логины SQL Server
  • Пропущенный перечислитель в редакторе циклов
  • Создание пакета SSIS через MVS 2015 ODBC IDENTITY_INSERT
  • Развертывание отчета с SSDT 2016 создает ошибку
  • Инструменты данных SQL Server - режим восстановления
  • Частичный ярлык базы данных в SSDT
  • SQL 71501 имеет неразрешенную ссылку на сборку
  • Давайте будем гением компьютера.