在导入sql大文件数据的时候 SQL Server Management Studio 工具会有OOM的问题,用 sqlcmd 是个不错的选择。
下载最新版本的 sqlcmd 实用工具
下载 Microsoft Command Line Utilities 15.0.x for SQL Server (x64) (2.6 MB)
下载 Microsoft Command Line Utilities 15.0.x for SQL Server (x86) (2.3 MB)
SQLCMD 的新版本支持 Azure AD 身份验证,包括对 SQL 数据库、 SQL 数据仓库和始终加密功能的多重身份验证 (MFA) 支持。 新的 BCP 支持 Azure AD 身份验证,包括多重身份验证 (MFA) 支持用于 SQL 数据库和 SQL 数据仓库。
系统要求Windows 10、 Windows 7、 Windows 8、 Windows 8.1、 Windows Server 2008、 Windows Server 2008 R2、 Windows Server 2008 R2 SP1、 Windows Server 2012 中,Windows Server 2012 R2 此组件要求Windows 安装程序4.5并SQL Server 的 Microsoft ODBC 驱动程序 17.3.1.1。
若要检查的 SQLCMD 版本执行sqlcmd -?命令并确认该 15.0.1300.359 版本或更高版本中使用。
sqlcmd 暂不要求在命令行选项和值之间使用空格。 不过,在今后推出的版本中,可能会要求在命令行选项和值之间必须有空格。
其他主题:
语法
sqlcmd
-a packet_size
-A (dedicated administrator connection)
-b (terminate batch job if there is an error)
-c batch_terminator
-C (trust the server certificate)
-d db_name
-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
-N (encrypt connection)
-o output_file
-p[1] (print statistics, optional colon format)
-P password
-q "cmdline query"
-Q "cmdline query" (and exit)
-r[0 | 1] (msgs to stderr)
-R (use client regional settings)
-s col_separator
-S [protocol:]server[instance_name][,port]
-t query_timeout
-u (unicode output file)
-U login_id
-v var = "value"
-V error_severity_level
-w column_width
-W (remove trailing spaces)
-x (disable variable substitution)
-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)
命令行选项
登录相关选项
-A
使用专用管理员连接 (DAC) 登录 SQL Server。 此类型连接用于排除服务器故障。 此连接仅适用于支持 DAC 的服务器计算机。 如果 DAC 不可用,sqlcmd 会生成错误消息并退出。 有关 DAC 的详细信息,请参阅 用于数据库管理员的诊断连接。 -A 选项不支持使用-G 选项。 当连接到 SQL 数据库使用-A,您必须是 SQL server 管理员。 DAC 不可用于 Azure Active Directory 管理员。
-C
该开关供客户端用于将其配置为隐式表示信任服务器证书且无需验证。 此选项等同于 ADO.NET 选项 TRUSTSERVERCERTIFICATE = true
。
-d db_name
启动 sqlcmd 时发出一个 USE
db_name 语句。 此选项设置 sqlcmd 脚本变量 SQLCMDDBNAME。 此参数指定初始数据库。默认为您的登录名的默认数据库属性。 如果数据库不存在,则生成错误消息且 sqlcmd 退出。
-l login_timeout
指定在你尝试连接到服务器时 sqlcmd 登录 ODBC 驱动程序的超时时间(以秒为单位)。 此选项设置 sqlcmd 脚本变量 SQLCMDLOGINTIMEOUT。 登录到 sqlcmd 的默认超时时间为 8 秒。 当使用 -G 选项连接到 SQL 数据库或 SQL 数据仓库并使用 Azure Active Directory 进行身份验证时,建议超时值至少为 30 秒。 登录超时必须是介于 0 和 65534 之间的数字。 如果提供的值不是数值或不在此范围内, sqlcmd 将生成错误消息。 该值为 0 时,则允许无限制等待。
-E
使用信任连接而不是用户名和密码登录 SQL Server。 默认情况下,如果未指定 -E , sqlcmd 将使用信任连接选项。
-E 选项会忽略可能的用户名和密码环境变量设置,例如 SQLCMDPASSWORD。 如果将 -E 选项与 -U 选项或 -P 选项一起使用,将生成错误消息。
-g
将列加密设置设为 Enabled
。 有关详细信息,请参阅 Always Encrypted。 仅支持存储在 Windows 证书存储中的主密钥。 -g 开关至少需要 sqlcmd 版本 13.1。 若要确定你的版本,请执行 sqlcmd -?
。
-G
当连接到 SQL 数据库或 SQL 数据仓库时,客户端将使用此开关指定该用户使用 Azure Active Directory 身份验证来进行身份验证。 此选项设置 sqlcmd 脚本变量 SQLCMDUSEAAD = true。 -G 开关至少需要 sqlcmd 版本 13.1。 若要确定你的版本,请执行 sqlcmd -?
。 有关详细信息,请参阅 使用 Azure Active Directory 身份验证连接到 SQL 数据库或 SQL 数据仓库。 -A 选项不支持使用-G 选项。
-H workstation_name
工作站的名称。 此选项设置 sqlcmd 脚本变量 SQLCMDWORKSTATION。 工作站名称列出在 sys.sysprocesses 目录视图的hostname 列中,并且可使用存储过程 sp_who返回。 如果不指定此选项,则默认为当前计算机名称。 此名称可用来标识不同的 sqlcmd 会话。
-j 将原始错误消息输出到银幕上。
-K application_intent
连接到服务器时声明应用程序工作负荷类型。 目前唯一支持的值是 ReadOnly。 如果未指定 -K ,sqlcmd 实用工具将不支持连接到 AlwaysOn 可用性组中的次要副本。 有关详细信息,请参阅活动次要副本:可读次要副本(AlwaysOn 可用性组)
-M multisubnet_failover
在连接到 SQL Server 可用性组或 SQL Server 故障转移群集实例的可用性组侦听程序时,应始终指定 -M。 -M 将为(当前)活动服务器提供更快的检测和连接。 如果 -M 未指定,-M 处于关闭状态。 有关详细信息,请参阅侦听程序、客户端连接、应用程序故障转移、创建和配置可用性组 (SQL Server)、故障转移群集和 AlwaysOn 可用性组 (SQL Server) 和活动次要副本:可读次要副本(AlwaysOn 可用性组)。
-N
此开关供客户端用于请求加密连接。
-P password
用户指定的密码。 密码是区分大小写的。 如果使用了 -U 选项而未使用 -P 选项,并且未设置 SQLCMDPASSWORD 环境变量,则 sqlcmd 会提示用户输入密码。 我们不建议使用 null 密码,但您可以通过连续双引号一对用于参数值指定 null 密码:
- -P ""
建议使用强密码。
使用强密码!
通过向控制台输出密码提示,可以显示密码提示,如下所示: Password:
隐藏用户输入。 也就是说,将不会显示任何输入的内容,光标保留原位不动。
使用 SQLCMDPASSWORD 环境变量可以为当前会话设置默认密码。 因此,不必将密码硬编码到批处理文件中。
以下示例首先在命令提示符处设置 SQLCMDPASSWORD 变量,然后访问 sqlcmd 实用工具。 在命令提示符下,键入:
SET SQLCMDPASSWORD= p@a$$w0rd
在以下命令提示符处键入:
sqlcmd
如果用户名和密码组合不正确,将生成错误消息。
注意! 为实现向后兼容性而保留了 OSQLPASSWORD 环境变量。 SQLCMDPASSWORD 环境变量优先于 OSQLPASSWORD 环境变量。 现在,不再共享 OSQLPASSWORD,实用程序sqlcmd并osql可以彼此不受干扰地使用。 旧脚本将继续使用。
如果将 -P 选项与 -E 选项一起使用,将生成错误消息。
如果 -P 选项后有多个参数,将生成错误消息并退出程序。
-S [protocol:]server[*instance_name][,*port]
指定要连接的 SQL Server 实例。 它设置 sqlcmd 脚本变量 SQLCMDSERVER。
指定 server_name 可连接到该服务器计算机上的 SQL Server 默认实例。 指定要连接到该服务器计算机上 SQL Server 命名实例的 server_name [ *instance_name* ]。 如果不指定服务器,sqlcmd 将连接到本地计算机上 SQL Server 的默认实例。 从网络上的远程计算机执行 sqlcmd 时,此选项是必需的。
protocol 可以是 tcp (TCP/IP)、 lpc (共享内存)或 np (命名管道)。
如果在启动 sqlcmd 时未指定 server_name [ *instance_name* ],SQL Server 将检查并使用 SQLCMDSERVER 环境变量。
备注
为实现向后兼容性而保留了 OSQLSERVER 环境变量。 SQLCMDSERVER 环境变量优先于 OSQLSERVER 环境变量;也就是说 sqlcmd 和 osql 可以彼此相邻使用而不会相互干扰,并且旧式脚本可以继续使用。
-U login_id
登录名或包含的数据库用户名。 对于包含的数据库用户,必须提供数据库名称选项 (-d)。
备注
OSQLUSER 环境变量可用于实现向后兼容性。 SQLCMDUSER 环境变量优先于 OSQLUSER 环境变量。 也就是说,sqlcmd 和 osql 可以彼此相邻使用而不会相互干扰。 此外,现有的 osql 脚本可以继续使用。
如果 -U 选项和 -P 选项均未指定,sqlcmd 会尝试使用 Microsoft Windows 身份验证模式进行连接。 身份验证基于运行 sqlcmd的用户的 Windows 帐户。
如果 -U 选项与 -E 选项(将在本主题的后面进行说明)一起使用,则会生成错误消息。 如果 -U 选项后跟多个参数,便会生成错误消息并退出程序。
-z new_password
更改密码:
sqlcmd -U someuser -P s0mep@ssword -z a_new_p@a$$w0rd
-Z new_password
更改密码并退出:
sqlcmd -U someuser -P s0mep@ssword -Z a_new_p@a$$w0rd
输入/输出选项
-f codepage | i:codepage[,o:codepage] | o:codepage[,i:codepage]
指定输入和输出代码页。 代码页页码是指定已安装的 Windows 代码页的数值。
代码页转换规则:
如果未指定代码页, sqlcmd 会将当前代码页同时用于输入文件和输出文件,除非输入文件为 Unicode 文件,在此情况下无需进行转换。
sqlcmd 自动识别 Big-endian Unicode 和 Little-endian Unicode 输入文件。 如果已指定 -u 选项,输出将始终为 Little-endian Unicode。
如果未指定输出文件,输出代码页将为控制台代码页。 借助此方法,可以在控制台上正确显示输出。
假定多个输入文件具有相同的代码页。 可以将 Unicode 和非 Unicode 输入文件混合在一起。
在命令提示符处输入 chcp 以验证 Cmd.exe 的代码页。
-i input_file[,input_file2...]
标识包含一批 SQL 语句或存储过程的文件。 可以指定要按顺序读取和处理的多个文件。 文件名之间不要使用任何空格。sqlcmd 将首先检查所有指定的文件是否都存在。 如果有一个或多个文件不存在, sqlcmd 将退出。 -i 和 -Q/-q 选项是互斥的。
路径示例:
复制
-i C:\<filename>
-i \\<Server>\<Share$>\<filename>
-i "C:\Some Folder\<file name>"
包含空格的文件路径必须用引号引起来。
此选项可以使用多次:-i_input_file_ -I_I input_file。_
-o output_file
标识从 sqlcmd接收输出的文件。
如果指定了 -u ,则 output_file 以 Unicode 格式存储。 如果文件名无效,将生成一个错误消息,并且 sqlcmd 将退出。sqlcmd 不支持向同一文件并发写入多个 sqlcmd 进程。 文件输出将损坏或不正确。 请参阅 -f开关也是与文件格式。 如果此文件不存在,将创建此文件。 前一个 sqlcmd 会话中的同名文件将被覆盖。 此处指定的文件不是 stdout 文件。 如果指定了 stdout 文件,就不会使用此文件。
路径示例:
复制
-o C:< filename>
-o \\<Server>\<Share$>\<filename>
-o "C:\Some Folder\<file name>"
包含空格的文件路径必须用引号引起来。
-r[0 | 1]
将错误消息输出重定向到屏幕 (stderr)。 如果未指定参数或指定参数为 0,则仅重定向严重级别为 11 或更高的错误消息。 如果指定参数为 1,则将重定向所有消息输出(包括 PRINT)。 如果使用 -o,将不起任何作用。 默认情况下,消息将发送到 stdout。
-R
让 sqlcmd 根据客户端的区域设置,本地化从 SQL Server 中检索到的数字、货币、日期和时间列。 默认情况下,这些列使用服务器的区域设置进行显示。
-u
指定无论 input_file 为何种格式,都以 Unicode 格式存储 output_file。
查询执行选项
-e
将输入脚本写入标准输出设备 (stdout)。
-I
将 SET QUOTED_IDENTIFIER 连接选项设置为 ON。 默认情况下,此选项设置为 OFF。 有关详细信息,请参阅 SET QUOTED_IDENTIFIER (Transact-SQL)。
-q " cmdline query "
启动 sqlcmd 时执行查询,但是在查询结束运行时不退出 sqlcmd 。 可以执行多个以分号分隔的查询。 将查询用引号引起来,如下例所示。
在命令提示符下,键入:
sqlcmd -d AdventureWorks2012 -q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"
sqlcmd -d AdventureWorks2012 -q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
重要
请不要在查询中使用 GO 终止符。
如果在指定此选项的同时还指定了 -b , sqlcmd 在遇到错误时将退出。 -b 将在本文后面部分进行介绍。
-Q " cmdline query "
在 sqlcmd 启动时执行查询,随后立即退出 sqlcmd。 可以执行多个以分号分隔的查询。
将查询用引号引起来,如下例所示。
在命令提示符下,键入:
sqlcmd -d AdventureWorks2012 -Q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"
sqlcmd -d AdventureWorks2012 -Q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
重要
请不要在查询中使用 GO 终止符。
如果在指定此选项的同时还指定了 -b , sqlcmd 在遇到错误时将退出。 -b 将在本文后面部分进行介绍。
-t query_timeout
指定命令(或 SQL 语句)超时的时间。此选项设置 sqlcmd 脚本变量 SQLCMDSTATTIMEOUT。 如果未指定 time_out 值,则命令将不会超时。querytime_out 必须是介于 1 和 65534 之间的数字。 如果提供的值不是数值或不在此范围内, sqlcmd 将生成错误消息。
备注
实际的超时值可能会与指定的 time_out 值相差几秒。
-vvar = value[ var = value...]
创建可在 sqlcmd脚本中使用的 sqlcmd 脚本变量。 如果该值包含空格,则将其用引号引起来。 可以指定多个 var="values"值。 如果指定的任何值中有错误, sqlcmd 会生成错误消息,然后退出。
sqlcmd -v MyVar1=something MyVar2="some thing"
sqlcmd -v MyVar1=something -v MyVar2="some thing"
-x
导致 sqlcmd 忽略脚本变量。 如果脚本中包含多个 INSERT 语句,且这些语句可能包含格式与常规变量(如 $(variable_name))相同的字符串,就会发现此参数很有用。
格式设置选项
-h headers
指定要在列标题之间输出的行数。 默认为每一组查询结果输出一次标题。 此选项设置 sqlcmd 脚本变量 SQLCMDHEADERS。使用 -1 指定不要打印的标题。 任何无效的值都将导致 sqlcmd 生成错误消息并随后退出。
-k [1 | 2]
删除输出中的所有控制字符,例如制表符和换行符。 此参数在返回数据时保留列格式。 如果指定了 1,则控制字符被一个空格替代。 如果指定了 2,则连续的控制字符被一个空格替代。 -k 与 -k1相同。
-s col_separator
指定列分隔符字符。 默认为空格。 此选项设置 sqlcmd 脚本变量 SQLCMDCOLSEP。 若要使用对操作系统有特殊含义的字符,如“与”符号 (&) 或分号 (;),请将该字符用双引号 (") 引起来。 列分隔符可以是任意 8 位字符。
-w column_width
指定用于输出的屏幕宽度。 此选项设置 sqlcmd 脚本变量 SQLCMDCOLWIDTH。 该列宽必须是介于 8 和 65536 之间的数字。如果指定的列宽不在此范围内,sqlcmd 就会生成错误消息。 默认宽度为 80 个字符。 在输出行超出指定的列宽时,将转到下一行。
-W
此选项删除列的尾随空格。 在准备要导出到另一应用程序的数据时,请将此选项和 -s 选项一起使用。 不能与 -y 或 -Y 选项一起使用。
-y variable_length_type_display_width
设置 sqlcmd 脚本变量 SQLCMDMAXVARTYPEWIDTH
。 默认值为 256。 它限制为下列大型可变长度数据类型返回的字符的数目:
varchar(max)
nvarchar(max)
varbinary(max)
xml
UDT(用户定义数据类型)
text
ntext
图像
备注
根据实现,UDT 可以使用固定的长度。 如果此固定长度 UDT 的长度比 display_width短,则返回的 UDT 值将不受影响。但是,如果此长度比 display_width长,则输出会被截断。
重要
使用 -y 0 选项时要特别注意,因为根据返回的数据量大小,此选项可能导致服务器和网络上出现严重性能问题。
-Y fixed_length_type_display_width
设置 sqlcmd 脚本变量 SQLCMDMAXFIXEDTYPEWIDTH
。 默认值为 0(无限制)。 它限制为以下数据类型返回的字符数:
char( n ),其中 1<=n<=8000
nchar(n n ),其中 1<=n<=4000
varchar(n n ),其中 1<=n<=8000
nvarchar(n n ),其中 1<=n<=4000
varbinary(n n ),其中 1<=n<=4000
变量
错误报告选项
-b
指定发生错误时, sqlcmd 退出并返回一个 DOS ERRORLEVEL 值。 当 SQL Server 错误消息的严重级别高于 10 时,返回给 DOS ERRORLEVEL 变量的值为 1;否则返回的值为 0。 如果除 -b 选项外还设置了 -V选项,则当严重级别低于使用 -V 设置的值时, sqlcmd将不报告错误。 命令提示符批处理文件可以测试 ERRORLEVEL 的值并相应处理错误。 sqlcmd 不对严重级别 10 报告错误(信息性消息)。
如果 sqlcmd 脚本包含错误的注释、语法错误或缺少脚本变量,则返回的 ERRORLEVEL 为 1。
-m error_level
控制发送到 stdout的错误消息类型。 将发送严重级别大于或等于此级别的消息。 如果此值设置为 -1,将发送所有消息(包括信息性消息)。 -m 和 -1之间不允许有空格。 例如, -m-1 有效,而 -m-1 无效。
此选项还设置 sqlcmd 脚本变量 SQLCMDERRORLEVEL。 此变量的默认值为 0。
-V error_severity_level
控制用于设置 ERRORLEVEL 变量的严重级别。 严重级别大于或等于此值的错误消息将设置 ERRORLEVEL。 小于 0 的值将报告为 0。 可以使用批处理文件和 CMD 文件来测试 ERRORLEVEL 变量的值。
其他选项
-a packet_size
需要不同大小的数据包。 此选项设置 sqlcmd 脚本变量 SQLCMDPACKETSIZE。 packet_size 必须是介于 512 和 32767 之间的值。 默认值为 4096。 如果脚本的两个 GO 命令之间包含大量 SQL 语句,则使用较大的数据包可以提高脚本执行的性能。 您可以请求更大的包大小。 但是,如果请求遭拒绝, sqlcmd 将对包大小使用服务器默认值。
-c batch_terminator
指定批处理终止符。 默认情况下,通过单独在一行中键入“GO”来终止命令并将其发送到 SQL Server。 重置批处理终止符时,不要使用对操作系统具有特殊意义的 Transact-SQL 保留关键字或字符,即便它们前面有反斜杠也是如此。
-L[c]
列出本地配置的服务器计算机和在网络上播发的服务器计算机的名称。 此参数不能与其他参数结合使用。 可以列出的服务器的最大数目是 3000。 如果服务器列表由于缓冲区大小而被截断,则会显示错误消息。
备注
鉴于网络广播的特点, sqlcmd 不可能及时接收来自所有服务器的响应。 因此,每次调用该选项所返回的服务器列表都可能不同。
如果指定了可选参数 c,输出就不会包含 Servers: 标题行,且列出的每个服务器行都没有前导空格。 此演示文稿称为清除输出。 清除输出可以提高脚本语言的处理性能。
-p[1]
输出每个结果集的性能统计信息。 下面的输出显示示例展示了性能统计信息的格式:
Network packet size (bytes): n
x xact[s]:
Clock Time (ms.): total t1 avg t2 (t3 xacts per sec.)
其中:
x
= SQL Server 处理的事务数。
t1
= 所有事务的总时间。
t2
= 单个事务的平均时间。
t3
= 每秒平均事务数。
所有时间均以毫秒表示。
如果指定了可选参数 1 ,则统计信息的输出格式为以冒号分隔的格式,此格式可以由脚本轻松导入到电子表格中或进行处理。
如果可选参数是除 1之外的任何值,则将生成错误并且 sqlcmd 将退出。
-X[1]
从批处理文件执行 sqlcmd 时,将禁用可能危及系统安全的命令。 禁用的命令仍然可以被识别; sqlcmd 发出警告消息并继续。 如果指定了可选参数 1 ,则 sqlcmd 将生成错误消息,然后退出。 使用 -X 选项时,将禁用以下命令:
ED
!! command
如果指定 -X 选项,则会阻止将环境变量传递给 sqlcmd。 同时该选项还会阻止执行通过使用 SQLCMDINI 脚本变量指定的启动脚本。 有关 sqlcmd 脚本变量的详细信息,请参阅 将 sqlcmd 与脚本变量结合使用。
-?
显示 sqlcmd 的版本和 sqlcmd 选项的语法摘要。
Remarks
不必按语法部分所示的顺序使用选项。
在返回多个结果时, sqlcmd 在批处理中的每个结果集之间输出一个空行。 此外,如果没有应用于已执行的语句,则不会出现 <x> rows affected
消息。
若要交互使用 sqlcmd,请在命令提示符处使用本文前面介绍的一个或多个选项键入 sqlcmd。 有关详细信息,请参阅 使用 sqlcmd 实用工具
备注
选项 -L、 -Q、 -Z 或 -i 会导致 sqlcmd 在执行后退出。
命令环境 (Cmd.exe) 中的 sqlcmd 命令行的总长度(包括所有参数和扩展变量)取决于 Cmd.exe 所在的操作系统。
变量优先级(从低到高)
系统级环境变量。
用户级环境变量
运行sqlcmd 之前在命令提示符处设置的命令 shell ( SETX=Y)。
sqlcmd-v X=Y
:Setvar X Y
备注
若要查看环境变量,请在“控制面板” 中打开“系统” ,然后单击“高级” 选项卡。