SQL Server:SSMS与sqlcmd执行REPLACE函数结果不一致问题咨询
SQL Server 2019 sqlcmd与SSMS执行含$字符查询的差异问题
在SQL Server 2019(v15)中执行查询时遇到以下问题:同一包含REPLACE函数的查询在SSMS中可正常将$替换为_,但在sqlcmd中无效,且sqlcmd返回结果中$后的内容被截断。
原查询
SELECT RTRIM(DB_NAME(dbid)) AS dbName, COUNT(dbid) AS ActiveSessions, RTRIM(loginame) AS LoginName FROM sys.sysprocesses WHERE dbid > 0 GROUP BY dbid, loginame;
SSMS返回结果
master 1 NT SERVICE\TELEMETRY$MSSQLSERVER01
sqlcmd返回结果
master 1 NT SERVICE\TELEMETRY
修改后的查询(使用REPLACE)
SELECT RTRIM(DB_NAME(dbid)) AS dbName, COUNT(dbid) AS ActiveSessions, REPLACE(RTRIM(loginame), '$', '_') AS LoginName FROM sys.sysprocesses WHERE dbid > 0 GROUP BY dbid, loginame;
SSMS返回结果
master 1 NT SERVICE\TELEMETRY_MSSQLSERVER01
sqlcmd返回结果
master 1 NT SERVICE\TELEMETRY
咨询问题
- 为何同一查询在SSMS与sqlcmd中表现不同?
- 为何REPLACE仅在SSMS中生效,在sqlcmd中无效?
- 如何修改查询使其在sqlcmd中正常执行?
- 为何sqlcmd中$后的内容(MSSQLSERVER01)被截断?
问题解答
为何同一查询在SSMS与sqlcmd中表现不同?
sqlcmd默认会将$符号视为变量前缀,输出内容包含$时会尝试解析为变量,导致内容被截断或替换异常;而SSMS没有默认的变量解析行为,直接输出查询的原始结果。为何REPLACE仅在SSMS中生效,在sqlcmd中无效?
并非REPLACE函数未生效,而是sqlcmd在输出结果阶段,将$及后续内容当作变量处理,提前截断了内容,你看到的是sqlcmd处理后的结果,而非REPLACE执行后的真实结果。如何修改查询使其在sqlcmd中正常执行?
有两种可行方案:
- 方案一:禁用sqlcmd变量替换
启动sqlcmd时添加-x参数,例如:sqlcmd -S 你的SQL实例名 -d 目标数据库名 -x -Q "你的查询语句" - 方案二:转义查询中的$符号
将查询中的单个$替换为$$,修改后的REPLACE语句:
注:此方案适用于数据中REPLACE(RTRIM(loginame), '$$', '_')$为单个出现的场景。
- 为何sqlcmd中$后的内容(MSSQLSERVER01)被截断?
sqlcmd默认启用变量替换功能,当输出内容中遇到$时,会将$后面的字符当作变量名尝试解析;如果这个变量未定义,sqlcmd会直接截断$及后续的所有内容,只保留$之前的部分。
内容的提问来源于stack exchange,提问作者udaikp
相关产品推荐
相关产品推荐

