sqlcmd — использование с переменными скрипта

Применимо к: SQL Server Azure SQL DatabaseУправляемый экземпляр SQL AzureAzure Synapse Analytics AnalyticsPlatform System (PDW)

Переменные, которые используются в скриптах, называются переменными скрипта. Переменные скрипта позволяют использовать один скрипт в различных обстоятельствах. Например, если нужно выполнить один скрипт на нескольких серверах, вместо изменения скрипта для каждого сервера можно указать для имени сервера соответствующую переменную скрипта. Изменяя имя сервера, указываемое в переменной скрипта, можно выполнять один и тот же скрипт на разных серверах.

Переменные сценариев можно определить явно с помощью команды setvar или неявно с помощью параметра sqlcmd-v.

В этой статье также приведены примеры определения переменных среды в командной строке Cmd.exe с помощью SET.

Настройка переменных скрипта с помощью команды setvar

Команда setvar используется для определения переменных сценария. Переменные, определенные с помощью команды setvar , предназначены для внутреннего хранения. Переменные сценария не следует путать с переменными среды, которые определяются в командной строке с помощью инструкции SET. Если сценарий ссылается на переменную, которая не является переменной среды или не определена с помощью команды setvar, то возвращается сообщение об ошибке, и выполнение сценария останавливается. Дополнительные сведения см. в разделе -b в служебной программе Sqlcmd.

Приоритет переменных (от низкого к высокому)

Если несколько переменных имеют одинаковое имя, то используется переменная с более высоким приоритетом.

  1. Системные переменные среды.

  2. Пользовательские переменные среды.

  3. Командная оболочка (SET X=Y), заданная в командной строке перед запуском sqlcmd

  4. sqlcmd -v X=Y

  5. :Setvar X Y

Примечание

Чтобы просмотреть переменные среды, в панель управления откройте System и перейдите на вкладку Дополнительно.

Неявное задание переменных скрипта

При запуске программы sqlcmd с параметром, с которым связана переменная sqlcmd , переменной sqlcmd неявно присваивается значение, заданное для этого параметра. В следующем примере программа sqlcmd запускается с параметром -l . Этим неявно определяется переменная SQLLOGINTIMEOUT.

c:\> sqlcmd -l 60

Кроме того, переменные сценария, которые в нем содержатся, задаются с помощью параметра -v . В следующем скрипте (имя файла testscript.sql) ColumnName является переменной скрипта.

USE AdventureWorks2022;

SELECT x.$(ColumnName)
FROM Person.Person x
WHERE x.BusinessEntityID < 5;

Кроме того, с помощью параметра -v можно указать имя возвращаемого столбца:

sqlcmd -v ColumnName ="FirstName" -i c:\testscript.sql

Чтобы возвратить другой столбец с помощью того же скрипта, измените значение переменной скрипта ColumnName .

sqlcmd -v ColumnName ="LastName" -i c:\testscript.sql

Правила выбора имен и значений переменных скрипта

Присваивая имена переменным скрипта, необходимо придерживаться следующих правил.

  • Имена переменных не должны содержать символов пробела и кавычек.

  • Имена переменных не должны иметь такую же форму, как у выражений переменных $(var) .

  • В переменных скрипта регистр не учитывается.

    Примечание

    Если переменной среды sqlcmd не присвоено никакое значение, то она удаляется. При использовании :setvar VarName без значения переменная очищается.

Присваивая значения переменным скрипта, необходимо придерживаться следующих правил.

  • Переменную, заданную с помощью параметра setvar или -v , необходимо заключать в кавычки, если строковое значение содержит пробелы.

  • Если кавычки — часть значения переменной, то их необходимо экранировать. Например,setvar MyVar "spac""e".

Правила присваивания значений и имен переменным с помощью команды Cmd.exe SET

Переменные, заданные с помощью инструкции SET, являются частью среды Cmd.exe, и на них может ссылаться программа sqlcmd. Ознакомьтесь со следующими рекомендациями:

  • Имена переменных не должны содержать символов пробела и кавычек.

  • Значения переменных могут содержать символы пробела и кавычки.

Переменные скрипта sqlcmd

Переменные, которые определяются программой sqlcmd , называются переменными сценария. В следующей таблице приведен список переменных сценария программы sqlcmd .

Переменная Связанный параметр Чтение-запись По умолчанию
SQLCMDUSER* -U R ""
SQLCMDPASSWORD* -P -- ""
SQLCMDSERVER* -S R "DefaultLocalInstance"
SQLCMDWORKSTATION -H R "ComputerName"
SQLCMDDBNAME -d R ""
SQLCMDLOGINTIMEOUT -l Чтение-запись "8" (секунд)
SQLCMDSTATTIMEOUT -T Чтение-запись "0" = неограниченное время ожидания
SQLCMDHEADERS -H Чтение-запись "0"
SQLCMDCOLSEP -S Чтение-запись " "
SQLCMDCOLWIDTH -w Чтение-запись "0"
SQLCMDPACKETSIZE -a R "4096"
SQLCMDERRORLEVEL -M Чтение-запись "0"
SQLCMDMAXVARTYPEWIDTH -y Чтение-запись «256»
SQLCMDMAXFIXEDTYPEWIDTH -y Чтение-запись "0" = неограниченное время ожидания
SQLCMDEDITOR Чтение-запись "edit.com"
SQLCMDINI R ""

Значения переменных SQLCMDUSER, SQLCMDPASSWORD и SQLCMDSERVER задаются при использовании команды :Connect .

Пометка «Чтение» означает, что значение может быть задано только один раз в процессе инициализации программы.

Пометка "Чтение и запись" означает, что переменная может быть изменена командой setvar , и все последующие команды будут использовать новое значение.

Примеры

A. Использование команды setvar в скрипте

Команда setvar позволяет управлять многими параметрами программы sqlcmd в сценарии. В следующем примере создается скрипт test.sql , в котором переменной SQLCMDLOGINTIMEOUT присваивается значение 60 , а другой переменной скрипта, server, присваивается значение testserver. Следующий код входит в скрипт test.sql.

:setvar SQLCMDLOGINTIMEOUT 60
:setvar server "testserver"
:connect $(server) -l $(SQLCMDLOGINTIMEOUT)

USE AdventureWorks2022;

SELECT FirstName, LastName
FROM Person.Person;

Затем скрипт вызывается с помощью sqlcmd:

sqlcmd -i c:\test.sql

Б. Интерактивное использование команды setvar

В следующем примере показана интерактивная установка переменной сценария с помощью команды setvar .

sqlcmd
:setvar MYDATABASE AdventureWorks2022
USE $(MYDATABASE);
GO

Результирующий набор:

Changed database context to 'AdventureWorks2022'
1>

В. Использование переменных среды командной строки в sqlcmd

В следующем примере устанавливаются четыре переменные среды are , которые затем вызываются из sqlcmd.

C:\>SET tablename=Person.Person
C:\>SET col1=FirstName
C:\>SET col2=LastName
C:\>SET title=Ms.
C:\>sqlcmd -d AdventureWorks2022
1> SELECT TOP 5 $(col1) + ' ' + $(col2) AS Name
2> FROM $(tablename)
3> WHERE Title ='$(title)'
4> GO

Г. Использование переменных среды на уровне пользователя в sqlcmd

В следующем примере пользовательская переменная среды %Temp% устанавливается в командной строке и передается входному файлу sqlcmd . Чтобы просмотреть пользовательские переменные среды, на панели управлениядважды щелкните компонент Система. Перейдите на вкладку "Заранее ", а затем выберите Переменные среды.

Следующий программный код является частью входного файла c:\testscript.txt:

:OUT $(MyTempDirectory)
USE AdventureWorks2022;

SELECT FirstName
FROM AdventureWorks2022.Person.Person
WHERE BusinessEntityID` `< 5;

Следующий программный код вводится в командной строке:

C:\ >SET MyTempDirectory=%Temp%\output.txt
C:\ >sqlcmd -i C:\testscript.txt

Следующий результат передается выходному файлу C:\Documents and Settings\<user>\Local Settings\Temp\output.txt.

Changed database context to 'AdventureWorks2022'.
FirstName
--------------------------------------------------
Gustavo
Catherine
Kim
Humberto

(4 rows affected)

Д. Использование скрипта запуска

Сценарий запуска sqlcmd выполняется при запуске программы sqlcmd . В следующем примере задается переменная среды SQLCMDINI. Ниже приведено содержимое сценария init.sql.

SET NOCOUNT ON
GO

DECLARE @nt_username nvarchar(128)
SET @nt_username = (SELECT rtrim(convert(nvarchar(128), nt_username))
FROM sys.dm_exec_sessions WHERE spid = @@SPID)
SELECT  @nt_username + ' is connected to ' +
rtrim(CONVERT(nvarchar(20), SERVERPROPERTY('servername'))) +
' (' +`
rtrim(CONVERT(nvarchar(20), SERVERPROPERTY('productversion'))) +
')'
:setvar SQLCMDMAXFIXEDTYPEWIDTH 100
SET NOCOUNT OFF
GO

:setvar SQLCMDMAXFIXEDTYPEWIDTH

Таким образом файл init.sql вызывается при запуске sqlcmd .

c:\> SET sqlcmdini=c:\init.sql
>1 Sqlcmd

Результат.

>1 < user > is connected to < server > (9.00.2047.00)

Примечание

Параметр -X отключает функцию сценария запуска.

Е. Расширение переменной

В следующем примере показана работа с данными в форме переменной sqlcmd .

USE AdventureWorks2022;
CREATE TABLE AdventureWorks2022.dbo.VariableTest
(
Col1 nvarchar(50)
);
GO

Вставляет одну строку в столбец Col1 объекта базы данных dbo.VariableTest , содержащего значение $(tablename).

INSERT INTO AdventureWorks2022.dbo.VariableTest(Col1)
VALUES('$(tablename)');
GO

В командной строке sqlcmd, если ни одна переменная не равна $(tablename), следующие инструкции возвращают эту строку и сообщение «Переменная скрипта "tablename" не определена». Флажок-bsqlcmd не отмечен по умолчанию. Если -b установлен, sqlcmd завершит работу после появления ошибки "Переменная не определена".

C:\> sqlcmd
>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(tablename)';
>2 GO
>3 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';
>4 GO

Результирующий набор:

>1 Col1
>2 ------------------
>3 $(tablename)
>4
>5 (1 rows affected)

При условии, что переменная MyVar равна $(tablename).

>6 :setvar MyVar $(tablename)

Эти инструкции возвращают строку и сообщение «Переменная сценария "tablename" не определена».

>6 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(tablename)';
>7 GO

>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';
>2 GO

Эти инструкции возвращают строку.

>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(MyVar)';
>2 GO
>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(MyVar)';
>2 GO

Дальнейшие действия