此 SQL 代码在 SMMS 中执行时有效,但在 .Net 中通过 ExecuteNonQuery() 调用时无效,为啥?

Posted

技术标签:

【中文标题】此 SQL 代码在 SMMS 中执行时有效,但在 .Net 中通过 ExecuteNonQuery() 调用时无效,为啥?【英文标题】:This SQL code works when being executed in SMMS but not when called via ExecuteNonQuery() in .Net why?此 SQL 代码在 SMMS 中执行时有效,但在 .Net 中通过 ExecuteNonQuery() 调用时无效,为什么? 【发布时间】:2013-10-08 12:20:54 【问题描述】:

我想这是一件很小的事情,但我似乎没有看到。 我有一个脚本可以在已经存在的数据库中设置一些视图和索引(列和表的详细信息对于这个问题应该无关紧要......)

USE <dbname>

GO
CREATE VIEW [dbo].View1_
WITH SCHEMABINDING
AS
  SELECT
      [someTable].[Id]
  FROM [dbo].[someTable]
  WHERE [dbo].[someTable].[Str] != N'someString'

GO
CREATE UNIQUE CLUSTERED INDEX someTable_Index1
    ON [dbo].View1_(ID)

GO
...

例如,如果我从 SQL Server Management Studio 运行它,现在它执行得很好。 但是我希望在调用某个网站时进行设置;我将上面的脚本保存在 MVC4-Project 内的文件夹中,并生成了以下 sn-p:

string connectionString = ConfigurationManager.ConnectionStrings["SomeConnectionString"].ToString();

string scriptCommand = System.IO.File.ReadAllText(Server.MapPath("~/Models/View1_IndexedViews.sql"));

using(SqlConnection connection = new SqlConnection(connectionString))

    using (SqlCommand command = connection.CreateCommand())
    
        connection.Open();
        command.CommandText = scriptCommand;

        try
        
            command.ExecuteNonQuery();
        
        catch(SqlException e)
        

        
    


但是现在当我触发那个调用时,这里会抛出一个异常

"Incorrect syntax near 'GO'.\r\n'CREATE VIEW' must be the first statement in a query batch.\r\nIncorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

有人可以给我一个提示,我在这里缺少什么吗?我知道那条消息CREATE VIEW must be the first statement,但通常应该在每个CREATE VIEW 之前加上GOs 来消除它,这条消息似乎也表明它不喜欢WITH SCHEMABINDING,但为什么会这样呢?

任何提示/帮助表示赞赏!

谢谢。

【问题讨论】:

【参考方案1】:

该数据库没有任何go 命令,仅在Management Studio(和一些类似工具)中用于分隔批次。

在某些情况下,您可以删除 go 命令并将其作为单个批处理运行。否则,您需要将它们分成几个数据库调用。

如果语法与示例中一样可预测,那么您可以在 "\r\nGO\r\n" 上拆分并执行每个字符串。

【讨论】:

好点,还不知道GO,这里是参考technet.microsoft.com/en-us/library/ms188037.aspx,所以如果我想批量创建多个视图,我必须将其拆分,对吗? 啊刚刚阅读了您关于按GO 拆分的编辑,非常好的输入,谢谢!

以上是关于此 SQL 代码在 SMMS 中执行时有效,但在 .Net 中通过 ExecuteNonQuery() 调用时无效,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

程序在 C++ Tutor 中执行时有效,但在其他任何地方都无效

调用SQL存储过程的C#函数在从本地计算机使用时有效,但在从云中的Azure函数调用时失败

在SpriteKit中模拟UIScrollView:滚动SKScene在SKView高达2000点但在高度为2050时失败时有效

jQuery 代码在选中复选框时有效,但在未选中时无效

WebView JavaScript 链接在触摸时有效,但在使用轨迹球时无效

JS 代码在我将其粘贴到控制台时有效,但在我的 React 应用程序中不起作用