3 .8 命令行工具
SQL Server 2008提供了相当多的优秀的图形工具,可以用来完成几乎所有需要执行的 任 务 ,但 是有时候简单的命令行工具就是完成工作的最佳工具。市面上目前有一小部分命
令行工具,本节将介绍其中最突出的两个工具—— SQLCMD(以前的OSQL)和 B C P,同时
还 将 介 绍 Microsoft最新的、可能也是最强大的命令行实用 工 具 PowerShelk
3.8.1 SQLCMD
SQLCMD实用工具取代OSQL成为了在命令提示符下执行T-SQL语句、存储过程和
SQL脚本文件的工具。尽管为了向后兼容,OSQL仍可用,但 是 SQLCMD的功能更加完
善。SQLCMD使 用 OLE DB连 接 SQL Server并 执 行 T-SQL批处理。
SQLCMD实用工具可以使用变量、动态连接服务器、查询服务器信息,以及把错误信
息 传 递 回 调 用 环 境 。它 还 提 供 了 访 问 专 用 管 理 员 连 接 (DAC,Dedicated Administrator Connection)的能力。DAC是一个特殊的诊断连接,在其他连接类型不能诊断和纠正服务器错误时,数据库管理员可以用它来连接SQL Server。 SQLCMD支持一些参数,以改变其行为及连接至SQL Server实例的方式。表 3-19是 这些参数的一个简表9 要想了解参数选项的详细列表,可 参阅SQL Server联机丛书中的 “SQLCMD实用工具”主题。SQLCMD命令行参数区分大小写。
SQLCMD实用工具一般用于在批处理过程中执行保存的T-SQL脚本。而 SQLCMD接
受脚本参数的能力使这一 功 能 得 到 进 -步增强。下列代码是一个SQLCMD脚本的例子,
它接受一个名为DBName的参数,用来将指派的数据库备份到C:\SQLBackups文件夹的名
为 DatabasenameDB-Month-Year-Day.BAK 的文件中。
DECLARE @BackupDest AS varchar(255) SET QBackupDest = * C :\SQLBackups\1 +•$(DBName)' + * DB-'
+DATENAME(m,GETDATE()) +DATENAME(dd,GETDATE ⑴ + »-*
+DATENAME(yy,GETDATE()) + ,.BAK*
BACKUP DATABASE $ (DBName) TO DISK =@BackupDest
如果上述脚本被保存到C:\SQLBackups文件夹中的BackupDBs.SQL文件中,那么可以
通过下列命令在一个使用Windows身份验证的名为AughtEight的服务器上备份master数 据库:
SQLCMD - E - S AughtEight - i C:\SQLBackups\BackupDBs.SQL - v DBName="Master"
SQL Server Management Studio的 SQLCMD模式使得创建SQLCMD脚本更加简单。
选 择 “查询”菜 单 中 的 SQLCMD模式,就 可 以 使 用 Management Studio编写和测试 BackupDBs.SQL脚本。不过,要 在 “査询编辑器”中完全测试它,必须在脚本开始处插入
下列命令:
:SETVAR DBName= "Master"
SETVAR命令也可在命令行下执行SQLCMD时使用,但使用-v变量参数通常会更有用。 可以使用SETVAR命令设置多个变量,也可以使用-v参数将多个变量传递到一个 SQLCMD脚本中。下面的例子展示了如何使用多个SETVAR命令:
USE AdventureWorks2008
GO
:SETVAR ColumnName "LastNameM :SETVAR TableName "Person.Person"
SELECT $ (ColumnName) FROM $ (TableName)
如果将上述例子保存至GetContacts. SQL文件,并省略SETVAR命令,则该例将如下 所示:
USE AdventureWorks2008
GO
SELECT $ (ColumnName) FROM $ (TableName)
该脚本也可以使用如下命令行通过SQLCMD实用工具执行:
SQLCMD - E - S AughtEight - i C:\GetContacts.SQL - v ColumnName = '*LastName"
TableName = "Person.Person"
专用管理员连接(DAC)
当出于管理目的而创建批处理脚本时,SQLCMD相当有用,而且它是唯一一个能够在
紧急情况中诊断并可能改正服务器问题的实用工具。通过使用-A 变量,SQLCMD可利用指
向 SQLServer的独占连接。如果没有其他的连接oj•用,那么SQLCMD-A命令则是诊断服 务器问题和防止数据丢失的最后、也是最可能收到成效的希望。默认情况下只允许启用本
地 的 D A C ,因为DAC组件只侦听回环连接。但是,通过使用sp_configure存储过程并将
remote admin connections选项改为true,可启用远程DAC,如 F面的代码所示。
sp_configure * remote admin connections *, 1
RECONFIGURE
3 .8 .2 大容量复制程序
大容量复制程序(Bulk Copy Program, BCP)实用工具主要用于将平面文件数据导入 SQL Server表、将表导出至平面文件,或者将T-SQL査询的结果导出至平面文件。除此之 外,它还可以用来创建导入导出操作中使用的格式文件。
BCP实用工具的语法如下所示:
usage: bcp {dbtable I query} {in I out | queryout | format) datafile [-m maxerrors] [-f formatfile] [-e errfile】 [-F firstrow] (-L lastrow] [-b batchsize] [-n native type] [-c character type] [-w wide character type] [-N keep non-text native] [-V file format version] [一q quoted identifier] [-C code page specifier] [-t field terminator] [-r row terminator] [-i inputfile] [-o outfile] [-a packetsize) [一S server name] [-U username] [-P password] [-T trusted connection] [-v version] [-R regional enable] [-k keep null values] [-E keep identity values] [-h "load hints'*] [-x generate xml format file]
BCP格式文件可以创建为两种不同的格式:XML和非XML。这些文件可以在导入和
导出数据中引用。联机丛书上有有关BCP的详细资料,不过下面的例子演示了 BCP最常
见的用法。
1 .非 XML格式文件示例
这个例子显示如何开始一个交互式的BCP会话,由此基于一个已有的表创建一个非
XML格式文件。BCP实用工具会提示输入列数据类型、前缀长度和字段分隔符。一般来
说,S 好接受数据类型和前缀长度的默认设置,因为这些值都是由BCP命令中引用的表决
定的。分隔符值可以是任何字符,但默认是“None”。
下列命令使用B C P ,基于本地默认SQL Server实例的AdventureWorks2008数据库的 Sales架构中的CreditCard表创建了一个格式文件;
BCP AdventureWorks2008 . Sales .CreditCard format nul -T -f C:\BCP\CreditCard.fmt
通常,提供一个-S开关和指定服务器名称会比较好。format参数告诉BCP需要输出的 是一个格式文件。这里没有-x 幵关,说明输出的是非XML格式文件。mil参数发送一个 NULL作为用户名,因为使用的-T开关指出BCP应使用一个Windows信任连接。如果没 有使用-T ,那么需要提供一个-U用户名开关以及-P密码开关。如果没有使用nul, BCP会 因为没有用户名而运行失败。
在接受默认字段数据类型和前缀长度,但输入逗号作为字段分隔符的情况下,上面这
条命令的结果如下所示:
结果顶部的“ 10.0” 指 定 BCP的版本。“ 10.0” 表 示 SQL Server 2008, “9.0” 表 示 SQL
Server 2005。“ 10.0” 下面的数字6 表示该文件中有多少列。紧跟在列编号后面的是该列的 SQL Server数据类型,其后是前缀长度需要的字节数。列的前缀长度取决于最大字节数、 列是否支持NULL,以及存储类型。如果在BCP命令中提供数据格式参数(-c或-n ),它输出的格式文件就会把所有的列都 映射为提供的格式而没有任何交互。
2. XML格式文件示例
该示例演示了如何使用BCP命令来创建XML格式文件:
BCP AdventureWorks2008.Sales.CreditCard format nul - x -T -f C :\BCP\CreditCard.xml
可以看到,语法是相同的,只是这里使用-x开关指定XML输出。结果如下所示:
3 .将表导出至平面文件
创建好格式文件后,可以用它来控制数据导出和导入操作。要使用前述例子中创建的
XML格式文件将数据导出至一个分隔的平面文件,可执行如下代码:
BCP AdventureWorks2008.Sales.CreditCard OUT C:\BCP\CreditCard.dat -T -f C:\BCP\CreditCard.XML
4 .使用格式文件导入平面文件
要测试BCP导入,先使用下列脚本创建一份CreditCard表的副本:
USE AdventureWorks2008
GO
SELECT * INTO Sales.CreditCard2 FROM Sales.CreditCard
TRUNCATE TABLE Sales.CreditCard2
一旦有了目标表,那么通过下列代码,可使用平面文件和XML格式文件将数据导入
到新的CreditCard2表中:
BCP AdventureWorks2008.Sales.CreditCard2 IN C:\BCP\CreditCard.dat -T -f C:\BCP\CreditCard.xml