官方文档 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