Как изменить переменную SSDT SQLCMD в предварительном сценарии?

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

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

Я пробовал:

1)

:servar myVariable 
SELECT @myVariable = 1

2) Пробовал поставить значение файла с :OUT но пишет что:

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


person Dmitrij Kultasev    schedule 06.05.2015    source источник
comment
Мои 2 цента: stackoverflow.com/questions/13183203/   -  person lucazav    schedule 07.05.2015


Ответы (3)


Вам нужно объявить временную 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
person scar80    schedule 06.05.2015
comment
Здесь не происходит инициализация переменной sqlcmd из переменной SQL. - person Martin Smith; 22.06.2015

Это невозможно. 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.

person Martin Smith    schedule 21.06.2015

Ответ на 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 поверх 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.

person Vadim Loboda    schedule 17.05.2015
comment
вы пробовали это в SSDT во время публикации? или просто включили режим SQLCMD в SSMT? Очевидно, что переменная temp исчезла после GO - person Dmitrij Kultasev; 18.05.2015
comment
Ты прав! Я тестировал его только в SSMT. Я проверю в SSDT. Спасибо. - person Vadim Loboda; 18.05.2015