使用 osql 实用工具,可以输入 Transact-SQL 语句、系统过程和脚本文件。 此实用工具通过 ODBC 与服务器通信。
语法
osql [-?] | [-L] | [ { {-Ulogin_id [-Ppassword]} | –E } [-Sserver_name[\instance_name]] [-Hwksta_name] [-ddb_name] [-ltime_out] [-ttime_out] [-hheaders] [-scol_separator] [-wcolumn_width] [-apacket_size] [-e] [-I] [-D data_source_name] [-ccmd_end] [-q "query"] [-Q"query"] [-n] [-merror_level] [-r {0 | 1}] [-iinput_file] [-ooutput_file] [-p] [-b] [-u] [-R] [-O] ]
参数
-?
显示 osql 开关的语法摘要。
-L
列出在本地配置的服务器和在网络上广播的服务器的名称。
注意
鉴于网络上广播的特点,osql 可能不会及时接收来自所有服务器的响应。 因此,每次调用该选项所返回的服务器列表都可能不同。
-U login_id
用户登录 ID。 登录 ID 区分大小写。
-P password
用户指定的密码。 如果未使用 -P 选项,osql 将提示输入密码。 如果在命令提示符的末尾使用 -P 选项而不提供密码,osql 将使用默认密码 (NULL)。
安全说明
不要使用空密码。 请使用强密码。 有关详细信息,请参阅强密码。
密码是区分大小写的。
使用 OSQLPASSWORD 环境变量,可以为当前会话设置默认密码。 因此,不需要通过硬编码在批处理文件中设置密码。
如果不使用 -P 选项指定密码,osql 将首先检查 OSQLPASSWORD 变量。 如果未设置任何值,则 osql 将使用默认密码 (NULL)。 以下示例将在命令提示符中设置 OSQLPASSWORD 变量,然后访问 osql 实用工具:
复制
C:\>SET OSQLPASSWORD=abracadabra
C:\>osql
安全说明
若要屏蔽密码,请不要同时指定 -P 和 -U 选项。 相反,应在指定 osql 和 -U 选项和其他开关(不指定 -P)之后,按 Enter 键,此时 osql 将提示您输入密码。 这种方法可以确保输入密码时对其屏蔽。
-E
使用可信连接而不请求密码。
-S server_name[ **\instance_name]
指定要连接到的 SQL Server 实例。 指定 server_name 将连接到该服务器上的 SQL Server 默认实例。 指定 server_name\**instance_name 将连接到该服务器中的 SQL Server 的命名实例。 如果未指定服务器,osql 将连接到本地计算机上的 SQL Server 默认实例。 从网络上的远程计算机执行 osql 时,此选项是必需的。
-H wksta_name
工作站的名称。 工作站名称存储在 sysprocesses.hostname 中,并按 sp_who 显示。 如果不指定此选项,则采用当前计算机名称。
-d db_name
启动 osql时发出一个 USE db_name 语句。
-l time_out
指定 osql 登录超时之前的秒数。 登录到 osql 的默认超时时间为 8 秒。
-t time_out
指定命令超时之前的秒数。 如果未指定 time_out 值,则命令将不会超时。
-h headers
指定要在列标题之间打印的行数。 默认为每一组查询结果打印一次标题。 使用 -1 可指定不打印标题。 如果使用 -1,则在参数和设置之间一定不能有空格(可以是 -h-1,不能是 -h -1)。
-s col_separator
指定列分隔符字符,默认值为空格。 若要使用对操作系统有特殊含义的字符(例如 | ; & < >),请将该字符用双引号 (") 括起来。
-w column_width
允许用户设置屏幕输出的宽度。 默认为 80 个字符。 当输出行达到其最大屏幕宽度时,会拆分为多行。
-a packet_size
允许您请求不同大小的数据包。 packet_size 的有效值介于 512 和 65535 之间。 默认值 osql 是服务器默认值。 执行较大的脚本时,各个 GO 命令之间的 SQL 语句的数量是庞大的,因此增大数据包可以提高性能。 Microsoft 的测试表明大容量复制操作的最快设置通常为 8192。 可以请求更大的数据包,但如果请求不能得到批准,则 osql 会将此值默认为服务器的默认值。
-e
回显输入。
-I
将 QUOTED_IDENTIFIER 连接选项设置为开启。
-D data_source_name
连接到某个通过用于 SQL Server 的 ODBC 驱动程序定义的 ODBC 数据源。 osql 连接使用该数据源中指定的选项。
注意
此选项不适用于为其他驱动程序定义的数据源。
-c cmd_end
指定命令终止符。 默认情况下,可以在行中输入一个单独的 GO 来终止命令,并将该命令发送到 SQL Server。 如果要重置命令终止符,请勿使用对操作系统有特殊含义的 Transact-SQL 保留字或字符,无论其前面是否有反斜杠。
-q " query "
启动 osql 时执行查询,但在查询完成时不退出 osql。 (注意查询语句不应包含 GO)。 如果从批处理文件中发出查询,请使用 %variables 或环境 %variables%。 例如:
复制
SET table=sys.objects
osql -E -q "select name, object_id from %table%"
将查询用双引号括起来,将查询中嵌入的任何内容用单引号括起来。
-Q" query "
执行查询并立即退出 osql。 将查询用双引号括起来,将查询中嵌入的任何内容用单引号括起来。
-n
从输入行中删除编号和提示符号 (>)。
-m error_level
自定义错误消息的显示。 显示指定的或更高严重级别的错误的消息数、状态和错误级别。 不显示低于指定级别的错误的信息。 使用 -1 可以指定返回所有标题及其消息,即使是信息型消息。 如果使用 -1,则在参数和设置之间不能有空格(可以是 -m-1,不能是 -m -1)。
-r { 0| 1}
将消息输出重定向到屏幕 (stderr)。 如果不指定参数,或指定参数为 0,则仅重定向严重级别为 11 或更高的错误信息。 如果指定参数为 1,则将重定向所有消息输出(包括“print”)。
-i input_file
标识包含一批 SQL 语句或存储过程的文件。 小于 (<) 比较运算符可以代替 -i 使用。
-o output_file
标识从 osql 接收输出的文件。 大于 (>) 比较运算符可以代替 -o 使用。
如果 input_file 不是 Unicode 并且未指定 -u,则以 OEM 格式存储 output_file。 如果 input_file 是 Unicode 或者指定了 -u,则以 Unicode 格式存储 output_file。
-p
打印性能统计信息。
-b
指定发生错误时,osql 退出并返回一个 DOS ERRORLEVEL 值。 当 SQL Server 错误消息的严重级别为 11 或更大值时,返回给 DOS ERRORLEVE 变量的值为 1;否则返回的值为 0。 Microsoft MS-DOS 批处理文件可以测试 DOS ERRORLEVEL 的值并正确地处理错误。
-u
指定无论 input_file 为何种格式,output_file 都以 Unicode 格式进行存储。
-R
指定在将货币、日期和时间数据转换为字符数据时,SQL Server ODBC 驱动程序使用客户端设置。
-O
指定停用某些 osql 功能以便与 isql 的早期版本的行为匹配。 下列功能停用:
同时还将 DOS ERRORLEVEL 的默认值设置为 -1。
EOF 批处理
自动调整控制台宽度
宽消息
注意
osql 不再支持 -n、-O 和 -D 选项。
注释
osql 实用工具从操作系统直接启动,并且使用本文中列出的区分大小写的选项。 osql启动后将接受 SQL 语句,然后以交互方式将这些语句发送到 SQL Server。 结果被格式化并在屏幕 (stdout) 上显示。 可使用 QUIT 或 EXIT 退出 osql。
如果启动 osql 时不指定用户名,则 SQL Server 将检查并使用环境变量,如 osqluser=(user) 或 osqlserver=(server)。 如果未设置环境变量,则使用工作站用户名。 如果未指定服务器,则使用工作站名称。
如果 -U 和 -P 选项都没有使用,则 SQL Server 将尝试使用 Microsoft Windows 身份验证模式进行连接。 身份验证根据运行 osql 的用户的 Microsoft Windows 帐户进行。
osql 实用工具使用 ODBC API。 对于 SQL Server ISO 连接选项,该实用工具使用 SQL Server ODBC 驱动程序的默认设置。 有关详细信息,请参阅“ANSI 选项的效果”。
注意
osql 实用工具不支持 CLR 用户定义数据类型。 若要处理这些数据类型,必须使用 sqlcmd 实用工具。 有关详细信息,请参阅 sqlcmd 实用工具。
OSQL 命令
除了 osql 中的 Transact-SQL 语句外,还可以使用以下命令。
命令
说明
GO
执行上一个 GO 命令之后输入的所有语句。
RESET
清除已输入的所有语句。
QUIT 或 EXIT( )
退出 osql。
Ctrl+C
结束查询但不退出 osql。
注意
!! 和 ED 命令 不再受 osql 支持。
仅当命令终止符 GO(默认)、RESET、EXIT、QUIT 和 Ctrl+C 出现在一行的开始(紧跟 osql 提示符)时,才会被识别。
GO 在批处理和执行任何缓存 Transact-SQL 语句结尾时会发出信号。 在每个输入行的结尾按 Enter 键时,osql 将缓存此行的语句。 键入 GO 后按 Enter 键时,所有当前已缓存的语句都将作为批处理发送到 SQL Server。
使用当前的 osql 实用工具时,好像在所执行的脚本结尾处都带有隐含的 GO,因而将执行脚本中的所有语句。
键入以命令终止符开始的行可结束命令。 可以在命令终止符后输入一个整数来指定命令运行的次数。 例如,若要执行此命令 100 次,可键入:
复制
SELECT x = 1
GO 100
命令执行结束之后将打印结果。 osql 每行的字符数不得超过 1,000 个。 长语句应当跨多行书写。
Windows 的命令撤回功能可用来撤回和修改 osql 语句。 键入 RESET 可以清除现有的查询缓冲区。
运行存储过程时,osql 在批处理中的每个结果集之间打印一个空行。 此外,如果没有应用于执行的语句,则不会出现“0 行受到影响”消息。
以交互方式使用 osql
若要以交互方式使用 osql,请在命令提示符中键入 osql 命令(以及任何选项)。
通过键入类似下面的命令,可以读入一个包含由 osql 执行的查询的文件(例如 Stores.qry):
复制
osql -E -i stores.qry
通过键入类似下面的命令,可以读入包含查询的文件(如 Titles.qry),并将结果导向其他文件:
复制
osql -E -i titles.qry -o titles.res
安全说明
如果可能,请使用 -E选项(可信连接)。
以交互方式使用 osql 时,若要将操作系统文件读入命令缓冲区,可使用 :r file_name。 这会将 file_name 中的 SQL 脚本作为一个批处理直接发送给服务器。
注意
使用 osql 时,如果批处理分隔符“GO”出现在 SQL 脚本文件中,则 SQL Server 会将其视为语法错误。
插入注释
可以在 osql 提交给 SQL Server 的 Transact-SQL 语句中包含注释。 允许使用两种类型的注释样式:-- 和 /*...*/。
使用 EXIT 返回 osql 中的结果
可以使用 SELECT 语句的结果作为 osql 的返回值。 如果为数值,则最后一个结果行的最后一列将转换为 4 字节的整数(长整型)。 MS-DOS 将低字节传递给父进程或操作系统错误级别。 Windows 则传递整个 4 字节整数。 语法为:
复制
EXIT ( < query > )
例如:
复制
EXIT(SELECT @@ROWCOUNT)
还可以在批处理文件中包含 EXIT 参数。 例如:
复制
osql -E -Q "EXIT(SELECT COUNT(*) FROM '%1')"
osql 实用工具将在圆括号 ( ) 中输入的所有内容原样传递给服务器。 如果存储系统过程选择了一个集合并返回一个值,则仅返回选择的内容。 圆括号中无参数的 EXIT**(** ) 语句将执行批处理中此语句前的所有内容,然后不返回值退出。
EXIT 格式有四种:
EXIT
注意
不执行批处理,立即退出,不返回值。
EXIT**(** )
注意
执行批处理后退出,不返回值。
EXIT**(query)**
注意
执行包括查询的批处理,返回查询的结果后退出。
状态为 127 的 RAISERROR。
注意
如果在 osql 脚本中使用 RAISERROR,并且出现状态 127,则 osql 将退出,并将消息 ID 返回给客户端。 例如:
复制
RAISERROR(50001, 10, 127)
此错误将导致 osql 脚本终止,并向客户端返回消息 ID 50001。
返回值 1 - 99 是为 SQL Server 保留的;osql 可定义下列值:
-100
选择返回值前遇到错误。
-101
选择返回值时找不到行。
-102
选择返回值时发生转换错误。
显示 Money 和 Smallmoney 数据类型
osql 只用两位小数位数显示 money 和 smallmoney 数据类型,但 SQL Server 用四位小数位数在内部存储值。 请看下例:
复制
SELECT CAST(CAST(10.3496 AS money) AS decimal(6, 4))
GO
此语句的结果为 10.3496,说明该值是原样按完整的小数位存储的。