语句错误,靠近 '' 处

52

我正在尝试在SQL Server Management Studio中运行以下相当简单的查询:

SELECT TOP 1000 * 
FROM 
    master.sys.procedures as procs
left join 
    master.sys.parameters as params on procs.object_id = params.object_id

看起来完全正确,但我一直收到以下错误消息:

Msg 102,级别 15,状态 1,第 6 行
'附近有语法错误。

如果我删除 join 只进行简单的 select,则可以工作:

SELECT TOP 1000 *
FROM 
    master.sys.procedures as procs

但是我需要联接工作。在这个查询中,甚至没有字符串'',所以我无法弄清它不喜欢什么。


1
SQL Server 的哪个版本? - Ed Harper
11
你是否从其他地方复制了查询语句?第6行是什么?我敢打赌问题可能出在一个无法打印的字符上,也许是一个单独的CR或LF。 - Panagiotis Kanavos
在我的 SQL 2008 上运行良好。 - Tom Chantler
有时候我从浏览器中的HTML表格复制文本时,会粘贴一些奇怪的非断空格字符,比如0x160;之类的东西。这个字符也会影响到Excel。 - Mike Christensen
@PanagiotisKanavos: 原来就是这个问题。谢谢你。你能重新发帖作为答案,这样我就可以接受了吗? - Joshua Frank
显示剩余2条评论
8个回答

107

当你从网页或电子邮件中复制代码时,如果文本包含无法打印的字符(如单个CR或LF和不间断空格),就可能出现这样意外的问题。


5
就这样了。我手动删除了所有的空格并重新添加了空格,现在它可以工作了。 - Joshua Frank
1
复制粘贴到记事本中会显示这些特殊字符,使其更容易删除。 - Peter
1
并非总是如此。至少有一个关于字符串分割的SO问题是由一个单独的Unicode字符引起的,该字符看起来像逗号后跟着一个空格。 - Panagiotis Kanavos
是的,我的代码在行末,而且在记事本中仍然看不见。不过按下删除键就可以解决了。 - Paul Totzke
当我在SSMS或Notepad++中打开我的脚本时,我看不到不可打印的字符,但是当我在VS Code中打开时它们就出现了。 - Rich
当我在SSMS或Notepad++中打开我的脚本时,我无法看到不可打印的字符,但在VS Code中打开时它们就出现了。 - undefined

24
Panagiotis Kanavos是正确的,有时候复制和粘贴T-SQL会导致出现不需要的字符...
我最终找到了一种简单快速的方法(只需要Notepad++)来检测哪些字符是错的,而不必手动重写整个语句: 不需要将任何文件保存到磁盘。
在Notepad++中操作很快:
1. 点击“新建文件” 2. 在菜单“编码”下检查, 值应该是 "以UTF-8编码"; 如果不是,则设置它 3. 粘贴你的文本enter image description here 4. 从编码菜单中,现在点击“ANSI编码”,再次检查您的文本enter image description here 5. 你应该很容易地找到错误的字符(s)

1
非常感谢。您的解决方案轻松揭示了我的问题源头。需要注意的是,在我的Notepad++版本中,一些奇怪的字符变成了普通的问号。因此,我只是搜索了?并删除了在奇怪位置发现的任何一个。再次感谢。 - Perry Tew
@PerryTew 可能是因为菜单中设置了不同的编码方式? - MAXE

4
您可以使用编辑器(我使用的是Visual Studio Code)来识别文件(在本例中为SQL文件)所使用的编码。一旦您打开文件,编辑器底部右侧会显示文件的编码。encoding 我曾遇到此问题,当时我尝试提交一个被编码为UTF-BOM(来自非Windows机器)的文件,其中每个字符串字符都附加了特殊字符。
您可以按照以下步骤更改文件的编码:
在VSCode的底部工具栏上,您将看到标签UTF-8 With BOM。单击它,弹出窗口将打开。单击“以编码方式保存”。现在您可以为该文件选择新的编码(UTF-8)。

3
我的错误在于我从一个文本文件中读取了SQL语句,而且这个文本文件是以UTF-8带BOM(字节顺序标记)格式保存的。
要解决这个问题,我在Notepad++中打开了文件,在“编码”下选择了UTF-8。或者你可以使用十六进制编辑器删除文件的前三个字节。

这对我有用。UTF-8和LF修复了错误。谢谢大家。 - SteveB
@SteveB 我该怎么获取它? - user123456
@user123456 你想获取什么?Notepad++ 是可以下载的软件。 - SteveB

1

我正在使用ADO.NET,并且使用的SQL命令是:

 string query =
"SELECT * " +
"FROM table_name" +
"Where id=@id";

我错过了在"FROM table_name"+末尾的空格,所以出现了这种情况。基本上它说:

string query = "SELECT * FROM table_nameWHERE id=@id";

并且这是导致错误的原因。

希望它能有所帮助。


0

我出现了这个错误,是因为我将别名列复制粘贴到了一个声明语句中。

DECLARE @userdata TABLE(
f.TABLE_CATALOG nvarchar(100),
f.TABLE_NAME nvarchar(100),
f.COLUMN_NAME nvarchar(100),
p.COLUMN_NAME nvarchar(100)
)
SELECT * FROM @userdata 

错误: Msg 102,级别15,状态1,第2行 附近有不正确的语法。

DECLARE @userdata TABLE(
f_TABLE_CATALOG nvarchar(100),
f_TABLE_NAME nvarchar(100),
f_COLUMN_NAME nvarchar(100),
p_COLUMN_NAME nvarchar(100)
)
SELECT * FROM @userdata

没有错误


0
我通过将 [dbo][tablename] 中的 'Dot' 替换为 'Underscore',成功运行了这个程序。
例如:
EXEC sp_columns INFORMATION_SCHEMA.COLUMNS GO //**这个不会工作。但是 IntelliSense/自动完成会认为它是正确的。
EXEC sp_columns INFORMATION_SCHEMA_COLUMNS GO //**这个在 Synapse 中可以运行。但有趣的是,它不会自动完成。

replace me with an underscore

enter image description here

using the dot, will autopoulate but after this go back and replace the dot with an underscore


0

对我来说,语句中缺少了单引号

错误的语句:"INSERT INTO Customers (CustomerNo, FirstName, MobileNo1, RelatedPersonMobileNo) VALUES ('John123', John', '1111111111', '1111111111)"

John''1111111111中缺少了引号

正确的语句:"INSERT INTO Customers (CustomerNo, FirstName, MobileNo1, RelatedPersonMobileNo) VALUES ('John123', 'John', '1111111111', '1111111111')"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接