• sqlcmd 与脚本变量结合使用


    脚本中使用的变量称为脚本变量。使用脚本变量,一个脚本可以应用于多个方案中。例如,如果需要对多台服务器运行单个脚本,则可以用脚本变量来表示服务器名称,而不必为每台服务器修改脚本。通过更改脚本变量表示的服务器名称,可以在不同的服务器上运行同一脚本。

    可以使用 setvar 命令显式定义脚本变量,也可以使用 sqlcmd -v 选项隐式定义脚本变量。

    本主题还包含有关使用 SET 在 Cmd.exe 命令提示符下定义环境变量的示例。

    sqlcmd 与脚本变量结合使用 - 创新远大 - 创新远大  使用 setvar 命令设置脚本变量

    setvar 命令用于定义脚本变量。使用 setvar 命令定义的变量存储在内部。不应将脚本变量与使用 SET 在命令提示符下定义的环境变量相混淆。如果脚本引用的变量不是环境变量,或不是使用 setvar 定义的变量,则会返回错误消息,并将停止执行脚本。有关详细信息,请参阅 sqlcmd 实用工具中的 -b 选项。

    sqlcmd 与脚本变量结合使用 - 创新远大 - 创新远大  变量优先级(从低到高)

    如果有多类变量具有相同的名称,则使用优先级最高的变量。

    1. 系统级环境变量
    2. 用户级环境变量
    3. 启动 sqlcmd 之前在命令提示符下设置的命令 shell (SET X=Y)
    4. sqlcmd -v X=Y
    5. :Setvar X Y
    注意:
    若要查看环境变量,请在“控制面板”中打开“系统”,然后单击“高级”选项卡。
    sqlcmd 与脚本变量结合使用 - 创新远大 - 创新远大  隐式设置脚本变量

    如果启动 sqlcmd 时使用具有相关 sqlcmd 变量的选项,则 sqlcmd 变量将被隐式设置为使用该选项指定的值。在下面的示例中,启动 DE>sqlcmdDE> 时使用了 DE>-lDE> 选项。这会隐式设置 SQLLOGINTIMEOUT 变量。

    DE>c:\> sqlcmd -l 60DE>

    您还可以使用 -v 选项对脚本中的脚本变量进行设置。在下面的脚本(文件名为 DE>testscript.sqlDE>)中,DE>ColumnNameDE> 是一个脚本变量。

    DE>USE AdventureWorks;DE>

    DE>SELECT x.$(ColumnName)DE>

    DE>FROM Person.Contact xDE>

    DE>WHERE c.ContactID < 5;DE>

    然后,您可以使用 DE>-vDE> 选项指定要返回的列名称:

    DE>sqlcmd -v ColumnName ="FirstName" -i c:\testscript.sqlDE>

    若要使用同一个脚本返回其他列,请更改 DE>ColumnNameDE> 脚本变量的值。

    DE>sqlcmd -v ColumnName ="LastName" -i c:\testscript.sqlDE>

    sqlcmd 与脚本变量结合使用 - 创新远大 - 创新远大  有关脚本变量名和变量值的原则

    为脚本变量命名时,请考虑以下原则:

    • 变量名不能包含空格字符或引号。
    • 变量名不能与变量表达式(如 $(var))具有相同的形式。
    • 脚本变量不区分大小写。
      ms188714.note(zh-cn,SQL.100).gif注意:
      如果没有为 sqlcmd 环境变量分配任何值,则将删除该变量。使用不包含值的 :setvar VarName 可以清除该变量。

    为脚本变量指定值时,请考虑以下原则:

    • 如果字符串值包含空格,则必须用引号将使用 setvar-v 选项定义的变量值引起来。
    • 如果引号属于变量值的一部分,则必须对其进行转义。例如::DE>setvar MyVar "spac""e"DE>。
    sqlcmd 与脚本变量结合使用 - 创新远大 - 创新远大  有关 Cmd.exe SET 变量值和变量名的原则

    使用 SET 定义的变量是 Cmd.exe 环境的一部分并可供 sqlcmd 引用。请考虑以下原则:

    • 变量名不能包含空格字符或引号。
    • 变量值可包含空格或引号。
    sqlcmd 与脚本变量结合使用 - 创新远大 - 创新远大  sqlcmd 脚本变量

    sqlcmd 定义的变量称为脚本变量。下表列出了 sqlcmd 脚本变量。

     

    变量 相关选项 R/W 默认值

    SQLCMDUSER*

    -U

    R

    ""

    SQLCMDPASSWORD*

    -P

    --

    ""

    SQLCMDSERVER*

    -S

    R

    "DefaultLocalInstance"

    SQLCMDWORKSTATION

    -H

    R

    "ComputerName"

    SQLCMDDBNAME

    -d

    R

    ""

    SQLCMDLOGINTIMEOUT

    -l

    R/W

    "8"(秒)

    SQLCMDSTATTIMEOUT

    -t

    R/W

    "0" = 无限期等待

    SQLCMDHEADERS

    -h

    R/W

    "0"

    SQLCMDCOLSEP

    -s

    R/W

    " "

    SQLCMDCOLWIDTH

    -w

    R/W

    "0"

    SQLCMDPACKETSIZE

    -a

    R

    "4096"

    SQLCMDERRORLEVEL

    -m

    R/W

    "0"

    SQLCMDMAXVARTYPEWIDTH

    -y

    R/W

    "256"

    SQLCMDMAXFIXEDTYPEWIDTH

    -Y

    R/W

    "0" = 无限制

    SQLCMDEDITOR

     

    R/W

    "edit.com"

    SQLCMDINI

     

    R

    ""

    * SQLCMDUSER、SQLCMDPASSWORD 和 SQLCMDSERVER 是在使用 :Connect 时设置的。

    R 表示在程序初始化过程中只能设置一次值。

    R/W 表示可以使用 setvar 命令重置值,并且后续命令将使用新值。

    sqlcmd 与脚本变量结合使用 - 创新远大 - 创新远大  示例

    A. 在脚本中使用 setvar 命令

    许多 sqlcmd 选项都可以通过在脚本中使用 setvar 命令来控制。在下面的示例中,创建了一个脚本 DE>test.sqlDE>,其中 DE>SQLCMDLOGINTIMEOUTDE> 变量设置为 DE>60DE> 秒,另一个脚本变量 DE>serverDE> 设置为 DE>testserverDE>。以下是 DE>test.sqlDE> 中的代码。

    DE>:setvar SQLCMDLOGINTIMEOUT 60DE>

    DE>:setvar server "testserver"DE>

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

    DE>USE AdventureWorks;DE>

    DE>SELECT FirstName, LastName DE>

    DE>FROM Person.Contact;DE>

    DE>The script is then called by using sqlcmd:DE>

    DE>sqlcmd -i c:\test.sqlDE>

    B. 交互式使用 setvar 命令

    下面的示例说明了如何使用 DE>setvarDE> 命令交互式设置脚本变量。

    DE>sqlcmd DE>

    DE>:setvar MYDATABASE AdventureWorksDE>

    DE>USE $(MYDATABASE);DE>

    DE>GODE>

    下面是结果集:

    DE>Changed database context to 'AdventureWorks'DE>

    DE>1>DE>

    C. 在 sqlcmd 中使用命令提示符环境变量

    在下例中,设置了四个环境变量DE>DE>然后从 DE>sqlcmdDE> 加以调用。

    DE>C:\>SET tablename=Person.ContactDE>

    DE>C:\>SET col1=FirstNameDE>

    DE>C:\>SET col2=LastNameDE>

    DE>C:\>SET title=Ms.DE>

    DE>C:\>sqlcmd -d AdventureWorksDE>

    DE>1> SELECT TOP 5 $(col1) + ' ' + $(col2) AS NameDE>

    DE>2> FROM $(tablename)DE>

    DE>3> WHERE Title ='$(title)'DE>

    DE>4> GODE>

    D. 在 sqlcmd 中使用用户级环境变量

    在下面的示例中,在命令提示符下设置了用户级环境变量 DE>%Temp%DE>,并将其传递给了 DE>sqlcmdDE> 输入文件。若要获取用户级环境变量,请在“控制面板”中双击“系统”。单击“高级”选项卡,再单击“环境变量”

    以下是输入文件 (DE>c:\testscript.txtDE>) 中的代码:

    DE>:OUT $(MyTempDirectory) DE>

    DE>USE AdventureWorks;DE>

    DE>SELECT FirstName DE>

    DE>FROM AdventureWorks.Person.Contact DE>

    DE>WHERE ContactID < 5;DE>

    以下是在命令提示符下输入的代码:

    DE>C:\ >SET MyTempDirectory=%Temp%\output.txtDE>

    DE>C:\ >sqlcmd -i C:\testscript.txtDE>

    以下是发送给输出文件 (C:\Documents and Settings\<user>\Local Settings\Temp\output.txt) 的结果。

    DE>Changed database context to 'AdventureWorks'.DE>

    DE>FirstName DE>

    DE>--------------------------------------------------DE>

    DE>Gustavo DE>

    DE>Catherine DE>

    DE>KimDE>

    DE>Humberto DE>

    DE>(4 rows affected)DE>

    E. 使用启动脚本

    sqlcmd 启动脚本是 sqlcmd 启动时执行的脚本。下面的示例设置了环境变量 DE>SQLCMDINIDE>。下面是 DE>init.sql.DE> 的内容

    DE>SET NOCOUNT ONDE>

    DE>GODE>

    DE>DECLARE @nt_username nvarchar(128)DE>

    DE>SET @nt_username = (SELECT rtrim(convert(nvarchar(128), nt_username))DE>

    DE>FROM sys.dm_exec_sessions WHERE spid = @@SPID)DE>

    DE>SELECT @nt_username + ' is connected to ' +DE>

    DE>rtrim(CONVERT(nvarchar(20), SERVERPROPERTY('servername'))) +DE>

    DE>' (' +DE>

    DE>rtrim(CONVERT(nvarchar(20), SERVERPROPERTY('productversion'))) +DE>

    DE>')' DE>

    DE>:setvar SQLCMDMAXFIXEDTYPEWIDTH 100DE>

    DE>SET NOCOUNT OFFDE>

    DE>GODE>

    DE>:setvar SQLCMDMAXFIXEDTYPEWIDTHDE>

    这将在 DE>sqlcmdDE> 启动时调用 DE>init.sqlDE> 文件。

    DE>C:\> SET sqlcmdini=c:\init.sqlDE>

    DE>>1 SqlcmdDE>

    这是输出。

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

    注意   -X 选项禁用了启动脚本功能。

    F. 变量扩展

    以下示例说明如何以 sqlcmd 变量的形式处理数据。

    DE>USE AdventureWorks;DE>

    DE>CREATE TABLE AdventureWorks.dbo.VariableTestDE>

    DE>(DE>

    DE>Col1 nvarchar(50)DE>

    DE>);DE>

    DE>GODE>

    在 DE>dbo.VariableTestDE>(包含值 DE>$(tablename)DE>)的 DE>Col1DE> 中插入一行。

    DE>INSERT INTO AdventureWorks.dbo.VariableTest(Col1)DE>

    DE>VALUES('$(tablename)');DE>

    DE>GODE>

    在 DE>sqlcmdDE> 提示符下,如果没有任何变量设置为 DE>$(tablename)DE>,则使用以下语句返回该行。

    DE>C:\> sqlcmdDE>

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

    DE>>2 GODE>

    DE>>3 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';DE>

    DE>>4 GODE>

    下面是结果集:

    DE>>1 Col1DE>

    DE>>2 ------------------DE>

    DE>>3 $(tablename)DE>

    DE>>4DE>

    DE>>5 (1 rows affected)DE>

    假设将变量 DE>MyVarDE> 设置为 DE>$(tablename)DE>。

    DE>>6 :setvar MyVar $(tablename)DE>

    这些语句返回该行,并且还返回了消息:“未定义‘tablename’脚本变量”。

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

    DE>>7 GODE>

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

    DE>>2 GODE>

    这些语句返回该行。

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

    DE>>2 GODE>

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

    DE>>2 GODE>

    引用自微软MSDN:http://msdn.microsoft.com/zh-cn/library/ms188714.aspx

  • 相关阅读:
    Struts2概述
    Oracle Multitenant Environment (二) Purpose
    Oracle Multitenant Environment (一) About
    oracle 12c之前用sequence 和 trigger来生成自动增长的列
    EPEL reporsitory
    optimizer_index_cost_adj
    oracle rac cache fusion
    一个oracle bug
    django book chapter 2
    linux 中文乱码问题
  • 原文地址:https://www.cnblogs.com/jancco/p/2489118.html
Copyright © 2020-2023  润新知