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

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

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

Кроме того, этот раздел содержит примеры определения переменных среды в командной строке 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.

ПримечаниеПримечание

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

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

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

c:\> sqlcmd -l 60

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

USE AdventureWorks2008R2;

SELECT x.$(ColumnName)

FROM Person.Person x

WHERE c.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

Чтение

""

SQLCMDPASSWORD*

-P

--

""

SQLCMDSERVER*

-S

Чтение

"DefaultLocalInstance"

SQLCMDWORKSTATION

-H

Чтение

"ComputerName"

SQLCMDDBNAME

-d

Чтение

""

SQLCMDLOGINTIMEOUT

-l

Чтение/Запись

"8" (секунд)

SQLCMDSTATTIMEOUT

-t

Чтение/Запись

"0" = неограниченное время ожидания

SQLCMDHEADERS

-h

Чтение/Запись

"0"

SQLCMDCOLSEP

-s

Чтение/Запись

" "

SQLCMDCOLWIDTH

-w

Чтение/Запись

"0"

SQLCMDPACKETSIZE

-a

Чтение

"4096"

SQLCMDERRORLEVEL

-m

Чтение/Запись

"0"

SQLCMDMAXVARTYPEWIDTH

-y

Чтение/Запись

"256"

SQLCMDMAXFIXEDTYPEWIDTH

-Y

Чтение/Запись

"0" = неограниченное время ожидания

SQLCMDEDITOR

Чтение/Запись

"edit.com"

SQLCMDINI

Чтение

""

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

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

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

Примеры

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

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

:setvar SQLCMDLOGINTIMEOUT 60

:setvar server "testserver"

:connect $(server) -l $(SQLCMDLOGINTIMEOUT)

USE AdventureWorks2008R2;

SELECT FirstName, LastName

FROM Person.Person;

The script is then called by using sqlcmd:

sqlcmd -i c:\test.sql

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

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

sqlcmd

:setvar MYDATABASE AdventureWorks2008R2

USE $(MYDATABASE);

GO

Ниже приводится результирующий набор.

Контекст базы данных изменен на AdventureWorks2008R2.

1>

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

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

C:\>SET tablename=Person.Person

C:\>SET col1=FirstName

C:\>SET col2=LastName

C:\>SET title=Ms.

C:\>sqlcmd -d AdventureWorks2008R2

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 AdventureWorks2008R2;

SELECT FirstName

FROM AdventureWorks2008R2.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».

Контекст базы данных изменен на AdventureWorks2008R2.

FirstName

--------------------------------------------------

Gustavo

Catherine

Kim

Humberto

(Обработано строк: 4)

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

Сценарий скрипта 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 < пользователь > подключен к < серверу > (9.00.2047.00)

ПримечаниеПримечание

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

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

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

USE AdventureWorks2008R2;

CREATE TABLE AdventureWorks2008R2.dbo.VariableTest

(

Col1 nvarchar(50)

);

GO

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

INSERT INTO AdventureWorks2008R2.dbo.VariableTest(Col1)

VALUES('$(tablename)');

GO

В командной строке sqlcmd, если ни одна переменная не равна $(tablename), следующие инструкции возвращают эту строку.

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)

При условии, что переменная 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