为什么 SQL Server Management Studio 从复制的代码中得到这些语法错误
Why does SQL Server Management Studio get these syntax errors from copied code
因此,在测试一些代码时,我发现我在查询中粘贴的代码有奇怪的行为 window。下面是我从哪里获得代码的简化示例:
declare @a nvarchar(max) = '';
select @a = 'select ' + cast(n as char(1)) + ';' + char(13) + 'GO' + char(13) from nums where n = 1;
print @a
exec sp_executesql @a
这是在 SSMS 的查询 window 中执行的。当然,它会出错,因为 GO
分隔符在动态 SQL.
中不起作用
但是,为了确认代码本身没问题,我将其复制到一个新查询中 window。继续这个例子:
select 1;
GO
select 1
GO
第一个语句给出语法错误,第二个语句将 GO
视为列别名。有趣的是,如果我直接在该查询中键入代码 window,这仍然是正确的。它不影响其他 windows 或新的,只影响我将 PRINT
结果粘贴到的那个。
关于此的最后一个有趣的事实是,如果我比较在 "bad" 查询 window 中对上述示例执行 LEN()
与按预期工作的情况相比,"bad" query 是26个字符长,但是正常的是31.
我发现退格所有字符似乎没有帮助,但如果我执行 Select All 并删除,这似乎可以解决问题。我认为这意味着它得到了一个不可打印的字符,但是如果我执行 Select All 并使用 Show All Symbols 选项复制到 Notepad++ 中,我看不到任何值得注意的内容。
有谁知道为什么 SSMS 会这样?我使用的是版本 17.9(如果重要的话,运行 针对 SQL Server 2014 实例)。
char(13)
是回车 Return (CR)。
char(10)
是换行 (LF)。
Windows 使用 CRLF 作为行终止符。
Linux 使用 LF 作为行终止符。
没有现代环境像您的脚本那样只使用 CR 作为行终止符。 SSMS 恰好通过插入垂直 space 来呈现 CR,并且此行为可能是从底层 Visual Studio 代码库继承的。
但是,SSMS 的 TSQL 批处理分析器无法将 CR 识别为行终止符,因此它不会查找 CR 之后的 GO 符号。它适用于 LF 或 CRLF。
因此,在测试一些代码时,我发现我在查询中粘贴的代码有奇怪的行为 window。下面是我从哪里获得代码的简化示例:
declare @a nvarchar(max) = '';
select @a = 'select ' + cast(n as char(1)) + ';' + char(13) + 'GO' + char(13) from nums where n = 1;
print @a
exec sp_executesql @a
这是在 SSMS 的查询 window 中执行的。当然,它会出错,因为 GO
分隔符在动态 SQL.
但是,为了确认代码本身没问题,我将其复制到一个新查询中 window。继续这个例子:
select 1;
GO
select 1
GO
第一个语句给出语法错误,第二个语句将 GO
视为列别名。有趣的是,如果我直接在该查询中键入代码 window,这仍然是正确的。它不影响其他 windows 或新的,只影响我将 PRINT
结果粘贴到的那个。
关于此的最后一个有趣的事实是,如果我比较在 "bad" 查询 window 中对上述示例执行 LEN()
与按预期工作的情况相比,"bad" query 是26个字符长,但是正常的是31.
我发现退格所有字符似乎没有帮助,但如果我执行 Select All 并删除,这似乎可以解决问题。我认为这意味着它得到了一个不可打印的字符,但是如果我执行 Select All 并使用 Show All Symbols 选项复制到 Notepad++ 中,我看不到任何值得注意的内容。
有谁知道为什么 SSMS 会这样?我使用的是版本 17.9(如果重要的话,运行 针对 SQL Server 2014 实例)。
char(13)
是回车 Return (CR)。
char(10)
是换行 (LF)。
Windows 使用 CRLF 作为行终止符。 Linux 使用 LF 作为行终止符。
没有现代环境像您的脚本那样只使用 CR 作为行终止符。 SSMS 恰好通过插入垂直 space 来呈现 CR,并且此行为可能是从底层 Visual Studio 代码库继承的。
但是,SSMS 的 TSQL 批处理分析器无法将 CR 识别为行终止符,因此它不会查找 CR 之后的 GO 符号。它适用于 LF 或 CRLF。