将特殊字符“$”替换为“_”在 SSMS 中效果很好,而在 sqlcmd 中则不然

A Replace of special character '$' to '_' works well in SSMS, while it doesn't in sqlcmd

提问人:udaikp 提问时间:9/21/2023 最后编辑:udaikp 更新时间:9/21/2023 访问量:63

问:

我正在尝试在 SQL Server 2019 (v15) 中执行查询并遇到问题。替换在 SSMS 中效果很好,而在 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

要修复 loginName 中的“$”,请使用以下命令修改查询: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 中有效,而在 SSMS 中不起作用?sqlcmd
  • 查询应该在什么地方工作?sqlcmd
  • 为什么值()被截断后?MSSQLSERVER01$sqlcmd
sql-server 替换 特殊字符 sqlcmd

评论

1赞 Charlieface 9/21/2023
为什么用户名需要“修复”?你为什么使用它是旧的,只是为了兼容性?您应该使用 和sys.sysprocessessys.dm_exec_connectionssys.dm_exec_sessions
0赞 siggemannen 9/21/2023
也许登录名通过不同的系统以不同的方式公开,而不是替换是“有问题的”。如果在没有任何替换的情况下运行查询,会发生什么情况?
0赞 vasek 9/21/2023
您需要向我们展示您在命令行中到底在做什么。看起来 $ 是一个特殊字符,您可能无法正确处理它。另外,您能否描述一下您正在“修复”的内容 - 登录名没有“损坏”
1赞 AlwaysLearning 9/21/2023
sqlcmd 使用该字符在 T-SQL 脚本中引入变量,例如: ,但独立不应影响事物。如果将 -x(小写 x)添加到 sqlcmd 命令行以禁用变量替换,会发生什么情况?$$(VariableNameHere)$
0赞 udaikp 9/21/2023
@Chalieface,我们需要完整的用户名(NT SERVICE\TELEMETRY$MSSQLSERVER01 或 NT SERVICE\TELEMETRY_MSSQLSERVER01)以及执行此查询的应用程序中的MSSQLSERVER01。从结果集中删除MSSQLSERVER01时,应用程序遇到了问题

答: 暂无答案