При использовании режима SQLCMD без SSMS (не из командной строки), есть ли способ назначить текущий сервер и экземпляр переменной? Это отличается от назначения обычных переменных TSQL.
Определение проблемы
Я хочу использовать возможности расширения переменных SQLCMD для замены значений, специфичных для среды, в наших сценариях развертывания вместо существующей системы построения строк tsql, в которую я заходил. С одним исключением из текущей среды использование SQLCMD для обработки развертываний прошло очень хорошо.
--
-- define 2 sqlcmd variables that will be expanded in scripts
--
:setvar dbServer "DEVA2\DEV2"
:setvar dbNotServer @@servername
SELECT
'$(dbServer)' AS hard_coded_value
, @@servername AS [servername]
, '$(dbNotServer)' AS dbNotServer
И это приводит к следующим результатам.
hard_coded_value servername dbNotServer
DEVA2\DEV2 DEVA2\DEV2 @@servername
Мясной рулет говорит, что 2 из 3 - это неплохо , но я бы предпочел решение 3 из 3. Когда этот сценарий будет развернут на тестовом сервере, я не хочу доверять пользователям развертывания редактирование сценария.
Если единственным решением для использования SQLCMD является полный запуск сценариев из командной строки, я могу согласиться с этим, но хотел бы выкинуть это здесь, так как я готов использовать SQLCMD.
Желаемый вывод
:setvar dbNotServer @@servername
SELECT '$(dbNotServer)' AS worked
Результаты
worked
DEVA\DEV2
Бесплодные занятия
Первая ссылка BOL показала обещание, все, что мне нужно было сделать, это использовать SQLCMDSERVER, но безрезультатно. Запустите в контексте SSMS в режиме SQLCMD, это вызовет фатальную ошибку скриптинга
-- A fatal scripting error occurred.
-- Variable SQLCMDSERVER is not defined.
SELECT '$(SQLCMDSERVER)' AS [FatalScriptingError]
Обновление Tumbleweed
2011-08-12 В попытке свести мою проблему к простейшей форме, основываясь на ответах, я упростил свои запросы (мои извинения). Часть запроса, которую я использовал, приведена ниже. Два ответа правильны в своих ответах, которые определяют, что перенос @@ servername в тиковые метки приводит к буквальному значению, и чтобы получить расширенное значение, мне нужно было бы развернуть его из кавычек. Я хотел использовать подстановку переменных sqlcmd, а не сборку строк, что повлекло бы за собой развертывание строк.
INSERT INTO
dbo.SSISCONFIG
(
ConfigurationFilter
, ConfiguredValue
, PackagePath
, ConfiguredValueType
, Application
, Category
, Subcategory
, Comment
)
SELECT
'Default.Accounting' AS ConfigurationFilter
, 'Data Source=$(dbServer);Initial Catalog=Accounting;Provider=SQLNCLI10.1;Integrated Security=SSPI;Packet Size=32767;' AS ConfiguredValue
, '\Package.Connections[Accounting].Properties[ConnectionString]' AS PackagePath
, 'String' AS ConfiguredValueType
, 'Defaults' AS Application
, 'Connection' AS Category
, 'Database' AS Subcategory
, 'Default connection string' AS Comment
SELECT
'Default.$(sqlVersion).CorporateReporting' AS ConfigurationFilter
, 'Data Source=$(dwServer);Initial Catalog=CRDS;Provider=SQLNCLI10.1;Integrated Security=SSPI;Packet Size=32767;' AS ConfiguredValue
, '\Package.Connections[CorporateReporting].Properties[ConnectionString]' AS PackagePath
, 'String' AS ConfiguredValueType
, 'Defaults' AS Application
, 'Connection' AS Category
, 'Database' AS Subcategory
, 'Default connection string' AS Comment
Вызов командной строки работает (как и ожидалось)
C:\>sqlcmd -E -d master -S DEVA2\DEV2 -Q "SELECT '$(SQLCMDSERVER)' AS [servername]"
Я пробовал и отказывался от других перестановок: setvar x @@ servername, пытаясь получить оцененное значение переменной базы данных, сохраненной в переменной SQLCMD. На данный момент, я вполне уверен, что переменные sqlcmd замещаются в запросах до их компиляции, но хотелось бы, чтобы их ошиблись.