Fanr

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
Sqlcmd是SQL Server 2005所带的一个命令行工具。它是用于执行SQL脚本和替代上一个版本SQL Server的osql工具。除了执行SQL代码,它也执行所谓的“sqlcmd扩展”。这些扩展提供了许多普通SQL之外的功能,使得sqlcmd成为用脚本自动化SQL Server数据库管理和维护的一个好用的工具。本文将介绍使用sqlcmd的基本方法,并提供一些它在SQL Server管理和维护中的实践方法。

  从命令行提示窗口中以交互模式启动sqlcmd命令。当在窗口中执行SQL查询时,我们就会即时看到结果,而相同的查询操作我们在SQL Server Management Studio的sqlcmd模式可以更简单地实现。Sqlcmd的真正作用在于它能够很容易自动执行已保存的带有位置和执行方式选项的SQL脚本——选项控制可以通过传入参数或sqlcmd变更实现。

  下面是一组最常用的sqlcmd特性:

  1、执行脚本文件。在sqlcmd中执行脚本文件的方法有2种。在DOS中,可以调用sqlcmd命令,并用选项-i传入想要执行的文件名:

  sqlcmd -i"c:\sql\MySql.sql"

  注意:双引号只在路径中包含空格时才是必需的,但为了保持一致性,我总是使用双引号来表示路径。

  第二个方法是从一个执行的SQL文件中调用另一个SQL文件。这可以使我们实现更多层次的脚本文件,其中最上层负责控制整个流程——指定执行的文件和传入的参数。下面的脚本将从一个在sqlcmd模式中运行的SQL文件中执行MySql.sql文件:

  :r "c:\sql\MySql.sql"

  2、使用和传递变量。在我看来,这是SQL Server 2005的sqlcmd对比于之前的SQL Server版本的osql的最好用的功能。我们可以在sqlcmd脚本内使用:server指令声明变量,然后在后面的代码中将变量名放在placeholder $()中来使用这些变量。Sqlcmd会用所引用变量的值替换这些占位符。

  :setvar hello "Hello World"

  PRINT '$(hello)'

  如果声明和定义了一个变量,那么其中会有一个很有用的操作是执行上下文其中包括声明变量的文件所调用的所有脚本文件。这使我们能将变量从父脚本文件传递到子脚本文件。在下面的例子中,变量hello在所调用的MySql2.sql文件中也是可以使用的。

  :setvar hello "Hello World"

  :r "c:\sql\MySql2.sql"

  如果在DOS中调用sqlcmd,我们可以传入参数并使用命令行选项-v来传递它们。

  sqlcmd -i"c:\sql\MySql2.sql" -

  vhello="Hello World"

  3、连接到多个服务器。在启动sqlcmd时,我们需要连接到一个特定的服务器来执行我们的代码。但是在SQL中,你可以将连接修改为另一个不同的服务器,然后接下来的脚本都会在新的服务器上执行。我们可以使用下面的命令来连接另一个服务器:

  :connect MyServer2

  SELECT * FROM sys.databases – returns

  databases from MyServer2

4、改进错误处理。Sqlcmd会有许多选项可用于处理程序所遇到的意外情况。将这个特性与sqlcmd变量相结合,我们可以很灵活地处理所遇到的意外情况。例如,如果我们想要确定一个特定的脚本文件只会在一个指定的数据库服务器上执行,那么我们需要在代码中确保它不会出错。这个例子使用“:on error exit”命令来规如果SQL Server实例的名称不是PREHAK,脚本的执行就应该停止:
  :on error exit
  IF (@@servername != 'RREHAK')
  BEGIN
  RAISERROR(N'This script can only
  Execute on RREHAK', 16, 127)
  END

  任何跟在上面代码后的脚本都不会执行。

  5、备份和恢复一个数据库。现在我将介绍一个好用的sqlcmd脚本例子。我经常会创建脚本来备份一个服务器上的数据库,然后将它恢复到另一个服务器上。通过使用sqlcmd,我们可以在一个脚本里完成这所有的操作,因为我们可以同时连接到源和目标服务器。下面的脚本会备份一个服务器上的Northwind数据库,然后再将它恢复到另一台服务器上。

  -- connect to the source server
  :CONNECT rrehak\sql2000
  BACKUP DATABASE Northwind
  TO DISK = 'C:\Temp\Northwind.bak'
  WITH INIT
  GO
  -- connect to the destination server
  :CONNECT rrehak
  -- if the database exists, disconnect any
  possible connections
  IF EXISTS (SELECT * FROM
  master.dbo.sysdatabases WHERE name =
  'Northwind')
  ALTER DATABASE Northwind
  SET SINGLE_USER WITH ROLLBACK IMMEDIATE
  GO
  RESTORE DATABASE [Northwind]
  FROM DISK = N'C:\Temp\Northwind.bak'
  WITH FILE = 1,
  MOVE N'Northwind' TO N'C:\SQL Server
  Databases\Northwind.mdf',
  MOVE N'Northwind_log' TO N'C:\SQL Server
  Databases\Northwind_1.ldf',
  NOUNLOAD, STATS = 10
  GO

  这个脚本作了进一步的改进,它向我们演示了如何在sqlcmd上执行操作系统的命令。演示脚本从源数据库所备份的位置恢复数据库。假设我们要拷贝一个备份文件到目标服务器的一个文件夹,因为我们将重复地恢复这个文件,这样做可以避免通过网络来恢复。Sqlcmd可以使用指令:!!来执行DOS命令。这样,将下面的脚本放在备份部分代码之后而在恢复部分代码之前,就可以执行DOS拷贝命令来创建备份文件的一个拷贝了:

  :setvar CopyCommand "copy
  \ \sqlserver1\c$\Temp\Northwind.bak
  \ \sqlserver2\c$\sql"
  :!! $(CopyCommand)

  所有这些特性使得sqlcmd成为自动化SQL Server管理和维护的工具。例如,我们可以创建一个“worker”脚本文件,它包含一套通用的脚本,它们需要在多个数据库、甚至多个服务器上执行。在这些脚本中我们将使用sqlcmd变量:

  本文概述了使用sqlcmd工具的方法和实例。你可以在Microsoft Books Online上阅读更多关于sqlcmd的文章,然后开始创建你自己的一套脚本,来自动化你的重复性任务,从而提高你的工作效率。

posted on 2011-03-19 21:15  Fanr_Zh  阅读(9457)  评论(1编辑  收藏  举报