sqlcmd的使用

2024-08-29 15:01:44 浏览数 (1)

官方文档 https://learn.microsoft.com/zh-cn/sql/tools/sqlcmd/sqlcmd-utility?view=sql-server-ver16&tabs=go,windows&pivots=cs1-bash

sqlcmd 有两个版本:

1 基于 go-mssqldb 的 sqlcmd,有时样式为 go-sqlcmd。 此版本是可以独立于 SQL Server 下载的独立工具。

go版本的项目仓库 https://github.com/microsoft/go-sqlcmd

2 基于 ODBC 的 sqlcmd,可用于 SQL Server 或 Microsoft 命令行实用程序,以及 Linux 上 mssql-tools 包的一部分。

下面内容中演示的是基于 ODBC 的 sqlcmd。另一种go版本的使用方法差不多,参考官方文档即可。

环境:centos7.9 x64

安装sqlcmd命令行工具

代码语言:txt复制
vim /etc/yum.repos.d/microsoft-prod.repo
[packages-microsoft-com-prod]
name=packages-microsoft-com-prod
baseurl=https://packages.microsoft.com/rhel/7/prod/
enabled=1
gpgcheck=0



yum install mssql-tools.x86_64 -y

安装过程中需要输入2次的YES确认

安装完成后,sqlcmd的文件路径为 /opt/mssql-tools/bin/sqlcmd

将 /opt/mssql-tools/bin/sqlcmd 加到环境变量里面

命令参数

代码语言:txt复制
$ sqlcmd "-?"
Microsoft (R) SQL Server Command Line Tool
Version 17.10.0001.1 Linux
Copyright (C) 2017 Microsoft Corporation. All rights reserved.

sqlcmd
   -a packet_size   # 介于 512 和 32767 之间的值。 默认为 4096。 如果脚本的两个 GO 命令之间包含大量 Transact-SQL 语句,则使用较大的数据包可以提高脚本执行的性能。 你可以请求更大的包大小。 但是,如果请求遭拒绝, sqlcmd 将对包大小使用服务器默认值。

   -A (dedicated administrator connection)
   -b (terminate batch job if there is an error)
   -c batch_terminator
   -C (trust the server certificate)
   -d db_name
   -D
   -e (echo input)
   -E (use trusted connection)
   -f codepage | i:codepage[,o:codepage] | o:codepage[,i:codepage]
   -g (enable column encryption)
   -G (use Azure Active Directory for authentication)
   -h rows_per_header
   -H workstation_name
   -i input_file
   -I (enable quoted identifiers)
   -j (Print raw error messages)
   -k[1 | 2] (remove or replace control characters)
   -K application_intent
   -l login_timeout
   -L[c] (list servers, optional clean output)
   -m error_level
   -M multisubnet_failover   # 在连接到 SQL Server 可用性组或 SQL Server 故障转移群集实例的可用性组侦听程序时,应始终指定 -M。 -M 将为(当前)活动服务器提供更快的检测和连接。 如果未指定 -M,则 -M 处于关闭状态。 有关详细信息,请参阅侦听程序、客户端连接、应用程序故障转移、创建和配置可用性组 (SQL Server)、故障转移群集和 AlwaysOn 可用性组 (SQL Server) 和活动次要副本:可读次要副本(AlwaysOn 可用性组)。


   -N (encrypt connection)
   -o output_file
   -p[1] (print statistics, optional colon format)
   -P password  # 密码
   -q "cmdline query"  # 查询sql明细,查询结束不退出命令行
   -Q "cmdline query" (and exit)   # 查询sql明细,查询结束自动退出命令行
   -r[0 | 1] (msgs to stderr)
   -R (use client regional settings)
   -s col_separator  # 指定列分隔符字符。 默认为空格。 此选项设置 sqlcmd 脚本变量 SQLCMDCOLSEP。 若要使用对操作系统有特殊含义的字符,如“与”符号 (&) 或分号 (;),请将该字符用双引号 (") 引起来。 列分隔符可以是任意 8 位字符。

   -S [protocol:]server[instance_name][,port]   # 连接地址串
   -t query_timeout
   -u (unicode output file)
   -U login_id
   -v var = "value"  # 创建可在 sqlcmd 脚本中使用的 sqlcmd 脚本变量
   -V error_severity_level
   -w screen_width   # 指定用于输出的屏幕宽度。 此选项设置 sqlcmd 脚本变量 SQLCMDCOLWIDTH。 该列宽必须是介于 8 和 65536 之间的数字。 如果指定的列宽不在此范围内,sqlcmd 就会生成错误消息。 默认宽度为 80 个字符。 在输出行超出指定的列宽时,将转到下一行。

   -W (remove trailing spaces)  # 此选项删除列的尾随空格。 在准备要导出到另一应用程序的数据时,请将此选项和 -s 选项一起使用。 不能与 -y 或 -Y 选项一起使用。

   -x (disable variable substitution)  # 导致 sqlcmd 忽略脚本变量。 如果脚本中包含多个 INSERT 语句,且这些语句可能包含格式与常规变量(如 $(<variable_name>))相同的字符串,就会发现此参数很有用。
   
   -X[1] (disable commands, startup script, environment variables, optional exit)
   -y variable_length_type_display_width
   -Y fixed_length_type_display_width
   -z new_password
   -Z new_password (and exit)
   -? (usage)


sqlcmd 暂不要求在命令行选项和值之间使用空格。 不过,在今后推出的版本中,可能会要求在命令行选项和值之间必须有空格。

例子

代码语言:txt复制

执行存储过程
	$ echo "exec Gettb2Id @a=22;" | sqlcmd -S 192.168.31.181,1433 -U SA -P'Abcd1234' -d sbtest
	$ echo "EXEC dbo.RoutineDemo @FID = '1111', @EmpID = 222;" |sqlcmd -S 192.168.31.181,1433 -U SA -P'Abcd1234' -d sbtest
	$ echo "EXEC dbo.sp_who_lock;" | sqlcmd -S 192.168.31.181,1433 -U SA -P'Abcd1234' -d sbtest


读取文件中的内容然后执行,可以接多个文件
	使用-i参数
	$ cat a.sql
	exec Gettb2Id @a=22;
	$ cat b.sql
	exec Gettb2Id @a=222;

	$ sqlcmd -S 192.168.31.181,2433 -U SA -P'Abcd1234' -d sbtest -i a.sql -i b.sql


将结果输出到文件
	使用-o参数
	$ sqlcmd -S 192.168.31.181,2433 -U SA -P'Abcd1234' -d sbtest -i a.sql -i b.sql -o a.out


查询结束后不退出命令行界面【不推荐使用这种】
	-q参数
	$ sqlcmd -S 192.168.31.181,2433 -U SA -P'Abcd1234' -d AdventureWorks2019 -q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"

	$ sqlcmd -S 192.168.31.181,2433 -U SA -P'Abcd1234'  -d AdventureWorks2019 -q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"

	请不要在查询中使用 GO 终止符。
	如果在指定此选项的同时还指定了 -b , sqlcmd 在遇到错误时将退出。 -b 将在本文其他部分进行介绍。


查询结束后不退出命令行界面【推荐使用这种】
	-Q参数
	$ sqlcmd -S 192.168.31.181,2433 -U SA -P'Abcd1234' -d AdventureWorks2019 -Q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"

	$ sqlcmd -S 192.168.31.181,2433 -U SA -P'Abcd1234'  -d AdventureWorks2019 -Q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
	或者 $ echo 'SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;' |sqlcmd -S 192.168.31.181,2433 -U SA -P'Abcd1234' -d AdventureWorks2019

	请不要在查询中使用 GO 终止符。
	如果在指定此选项的同时还指定了 -b , sqlcmd 在遇到错误时将退出。 -b 将在本文其他部分进行介绍。

	
	
限制查询超时时间【推荐使用】
	-t参数, 如果未指定 query_timeout 值,则命令不会超时。query_timeout 必须是介于 1 和 65534 之间的数字
	$ sqlcmd -S 192.168.31.181,2433 -U SA -P'Abcd1234' -d AdventureWorks2019 -t 10 -Q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"



输出每个结果集的性能统计信息
	-p参数
	$ sqlcmd -S 192.168.31.181,2433 -U SA -P'Abcd1234' -d AdventureWorks2019 -t 10 -Q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';" -p
	会在结果的最下面添加类似如下3行内容:
	Network packet size (bytes): 4096
	1 xact[s]:  --> 这里表示1个事务
	Clock Time (ms.): total        15  avg   15.0 (66.7 xacts per sec.)  --> 所有事务的总时间。 单个事务的平均时间。 每秒平均事务数。


执行的时候,先输出input的内容
	$ sqlcmd -S 192.168.31.181,2433 -U SA -P'Abcd1234'  -d AdventureWorks2019 -Q "SELECT TOP 5 FirstName FROM Person.Person; SELECT TOP 5 LastName FROM Person.Person;" -e

0 人点赞