Использование программы sqlcmd с переменными скрипта
Переменные, которые используются в скриптах, называются переменными скрипта. Переменные скрипта позволяют использовать один скрипт в различных обстоятельствах. Например, если нужно выполнить один скрипт на нескольких серверах, вместо изменения скрипта для каждого сервера можно указать для имени сервера соответствующую переменную скрипта. Изменяя имя сервера, указываемое в переменной скрипта, можно выполнять один и тот же скрипт на разных серверах.
Переменные скрипта можно определить явно с помощью команды setvar или неявно с помощью параметра -v программы sqlcmd.
Кроме того, этот раздел содержит примеры определения переменных среды в командной строке Cmd.exe с помощью инструкции SET.
Настройка переменных скрипта с помощью команды setvar
Команда setvar используется для определения переменных скрипта. Переменные, определенные с помощью команды setvar, предназначены для внутреннего хранения. Переменные скрипта не следует путать с переменными среды, которые определяются в командной строке с помощью инструкции SET. Если скрипт ссылается на переменную, которая не является переменной среды или не определена с помощью команды setvar, то возвращается сообщение об ошибке, и выполнение скрипта останавливается. Дополнительные сведения см. в описании параметра -b в разделе Программа sqlcmd.
Приоритет переменных (от низкого к высокому)
Если несколько переменных имеют одинаковое имя, то используется переменная с более высоким приоритетом.
Системные переменные среды.
Пользовательские переменные среды.
Командная оболочка (SET X=Y), заданная в командной строке перед запуском sqlcmd.
sqlcmd-v X=Y.
: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
См. также