【问题标题】:Visual Studio thinks correct SQL syntax is incorrectVisual Studio 认为正确的 SQL 语法不正确
【发布时间】:2015-01-14 17:22:10
【问题描述】:

在 Visual Studio 2013 中,我创建了一个数据库项目并导入了一个现有数据库。一开始一切都很好,项目构建并生成了创建脚本。

但是,现在 Visual Studio 似乎认为有 SQL 语法错误,返回几个 SQL46010: Incorrect syntax near: 错误。这些都是VS生成的代码——我没有写过。

示例 1:

ALTER ROLE [db_owner] ADD MEMBER [SomeUser];
SQL46010: Incorrect syntax near ADD.

示例 2:

DECLARE @Foo NVARCHAR(7) = 'abcdefg';
SQL46010: Incorrect syntax near =.

如果我将代码复制/粘贴到 SSMS 中,一切正常。

不幸的是,这些阻止了项目的构建,这意味着我无法发布。由于它们是错误而不是警告,因此我无法在项目设置中将它们设置为忽略。

存在一种解决方法,我可以将问题文件的构建操作设置为无,但我需要在发布时包含这些文件。

我试过了:

  • 删除并重新添加相同的代码
  • 复制/粘贴代码到新的 SQL 文件
  • 关闭并重新打开解决方案
  • 关闭和重新打开 Visual Studio
  • 更新 Microsoft SQL Server Data Tools (SSDT)
  • 更新 Visual Studio

我能找到的最接近的问题是 2012 年的 this MSDN thread,指出 SSDT SQL 解析器存在错误(促使我尝试更新 SSDT)。

【问题讨论】:

    标签: tsql visual-studio-2013 syntax-error database-project


    【解决方案1】:

    项目属性中有一个名为 Target platform 的设置,它告诉 VS 检查语法的 SQL Server 版本。

    这些是对 T-SQL 语法的相对较新的补充,如果将语法设置为例如,它们可能无法工作。 SQL Server 2005。

    【讨论】:

    • 这对我不起作用我的项目设置为最新版本的 VS 和 SQL 服务器。解决方法是什么。我使用的是 ADS 而不是 SSMS,因为我在 Mac 上
    • 对于我的项目,目标平台已经是“SQL Server 2016”。对我来说,解决方案是“清理”项目并再次重做。
    【解决方案2】:

    旧线程但这确实抓住了我,所以我想我会分享我的经验,ALTER ROLE 的文档似乎表明它在 SQL 2008 上受支持,而实际上只有部分功能支持。您可以使用 Alter Role 更改角色的名称,即 ALTER ROLE [ROLE NAME] WITH [NEW ROLE NAME] 但是要从角色中添加或删除成员,必须使用旧的(现已弃用)存储过程 sp_addrolememeber,即sp_addrolemember 'Role Name', 'User Name'
    正如 Aaroninus 指出的那样,如果您以 SQL 2012 或更高版本为目标,这不会报告为错误。

    【讨论】:

      【解决方案3】:

      在我的情况下,我通过单击名为“参考数据”的文件夹添加现有的部署后脚本(.sql 文件)==>添加现有项目==>选择 .sql 文件列表,包括 Script.PostDeployment1。 .sql 文件。按 F5 时出现以下错误:

      SQL46010:: 附近的语法不正确。

      sql文件的内容是:

      :r ".\Customer.data.sql"
      GO
      
      :r ".\Product.data.sql"
      GO
      
      :r ".\OrderType.data.sql"
      GO
      
      :r ".\Orders.data.sql"
      GO
      

      解决方案: 部署后脚本应该使用VS创建。在现有项目中,打开Visual Studio并通过单击添加部署后脚本:添加==>新项目==>脚本==>部署后脚本==>.PostDeployment1.sql.After创建 PostDeployment1.sql 文件只需复制粘贴您的内容,然后按 F5..PostDeployment1.sql 应该可以正确执行而不会出现任何错误。

      【讨论】:

      • 这也是我的问题。我已经确认项目中的文件类型是部署前/部署后,但看起来它没有在 .sqlproj 文件中包含附加属性,毕竟这对于前/后脚本至关重要,例如
      【解决方案4】:

      不得不在项目中设置一个标志真的很愚蠢,因为我在我的 c# 类项目中的 oracle 和 mssql 中都有 ddl sql 脚本。

      【讨论】:

        猜你喜欢
        • 2019-02-01
        • 2013-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多