【问题标题】:Incorrect syntax near '​''​' 附近的语法不正确
【发布时间】:2018-08-14 07:10:36
【问题描述】:

首先我遇到了这个错误:

无效的对象名称“product_images​_temporary”

在我添加了[] 括号后,一切正常。但是当我再次删除它们时,我收到了这个错误:

'​'附近的语法不正确

为什么会这样:

[product_images​_temporary]

但这会引发异常(“'​' 附近的语法不正确”):

product_images​_temporary

更多代码:

try
{
    using (var sqlConnection = new DapperHelper().DatabaseConnection())
    {
        var sqlStatement = "SELECT * FROM product_images​_temporary";

        sqlConnection.Execute(sqlStatement);
    }
}
catch (Exception e)
{
}

product_images​_temporary 是 SQL Server 中的保留字吗?喜欢datetime 等?我无法解释。

【问题讨论】:

  • 只是表名。名称中有一个 unicode 字符会破坏它。将其按原样转换为 varbinary 以查看究竟是什么。
  • 请注意,如果它与 [] 一起使用,您还应该通过重新键入来重命名表。
  • 是的,s_ 之间有一个 invisible unicode 字符。如果您执行SELECT CONVERT(varchar(100),N'product_images​_temporary'),您会注意到返回值为product_images?_temporary
  • 只需使用编辑器并使用箭头键逐步浏览名称。在images 之后,就在_ 之前,您会注意到,您的光标不会移动... Alex K. 是对的,这个 - 嗯 - 问题似乎也在真实表的名称中。这 - 很可能 - 不是你想要的......
  • 是的,因为没有一个叫做product_images_temporary的对象,所以它叫做product_images​_temporary。它们可能看起来相同,但是,第一个在s_ 之间没有Unicode 字符。我强烈建议您修改对象的名称。

标签: c# sql-server sql-server-2008 dapper


【解决方案1】:

只需重命名表格,您的表格名称中有一个隐形字符

【讨论】:

    【解决方案2】:

    s_ 之间是Unicode 零宽度空格字符\u200B。这是不可见的,所以字符串不是它看起来的样子。

    此字符在 SQL 对象标识符名称中不合法,是您看到的错误的原因,使用 [] 转义使其合法。

    只需手动重新输入名称或在两个字符之间重复删除即可。

    由于您的代码确实适用于[],这意味着实际的表名包含\u200B,因此也应该重命名。

    【讨论】:

      猜你喜欢
      • 2015-12-12
      • 2013-12-16
      • 1970-01-01
      • 2011-03-11
      • 2014-02-16
      • 2017-01-11
      • 2020-02-06
      • 1970-01-01
      相关资源
      最近更新 更多