【问题标题】:Cannot execute SQL script by code, but executing in SSMS works无法通过代码执行 SQL 脚本,但在 SSMS 中执行有效
【发布时间】:2019-06-18 05:58:14
【问题描述】:

以下 SQL 脚本保存在文件中:

WHILE @@rowcount > 0
BEGIN
    DELETE TOP(100) t1 
    WHERE name >= 20000
END

为了在我的软件中执行,我读取文件然后通过以下方法执行脚本:

private static void CreateCommand(string queryString, string connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(queryString, connection);
        command.Connection.Open();
        command.ExecuteNonQuery();
    }
}

所以现在我的问题是脚本没有在 MSSQL 服务器上正确执行,条目仍然存在。根本没有例外。

如果我在 Microsoft SQL Server Management Studio 中运行脚本,则脚本正在执行,没有任何问题。

什么会导致这个问题?

【问题讨论】:

  • 你能发布queryString数据吗?
  • 您是否有理由不做DELETE FROM t1 WHERE name >= 2000 之类的事情?为什么是 while 循环?
  • 我很警惕WHERE name >= 20000,闻起来可能是整理/排序问题。甚至可能是数据类型问题。
  • 你能不能把它变成一个SP,然后叫它?不确定如何从 ADO.NET 执行过程 T-SQL
  • 第一次你不能确定@@rowcount > 0,我建议你将你的逻辑改为do-while语法,例如stackoverflow.com/questions/4487546/…

标签: c# sql sql-server ssms


【解决方案1】:

让我们从定义开始:

@@rowcount 返回受最后一条语句影响的行数。

看起来@@rowcount 等于 0。

创建新连接时,这个值默认为1,所以它必须进入你的循环,但也许你删除了所有满足where子句的行。

另一个猜测是:有一些操作会影响 0 行,所以 @@rowcount 等于 0 并且没有进入你的循环。

您可以通过执行和检索以下查询的结果来检查上述猜测:

SELECT @@rowcount [rowcount]

【讨论】:

  • 谢谢,这就是问题
【解决方案2】:

当您从应用程序运行您的语句时,@@rowcount 等于“0” 你必须先初始化它,像这样:

SELECT 1;
WHILE @@rowcount > 0
BEGIN
    DELETE TOP(100) t1 
    WHERE name >= 20000
END

【讨论】:

    【解决方案3】:

    正如 Michał 所说:

    @@rowcount 返回受最后一条语句影响的行数。如果行数超过 20 亿,则使用 ROWCOUNT_BIG。来自微软文档。

    如果你想删除大量记录,你应该执行 DO WHILE 操作:

    DECLARE @iter INT;
    
    SET @iter = 1;
    
    WHILE @iter > 0 BEGIN BEGIN TRANSACTION;
    
    DELETE TOP(100) t1 WHERE name >= 20000
    
    SET @iter = @@ROWCOUNT;
    
    COMMIT TRANSACTION; 
    
    END
    

    【讨论】:

      猜你喜欢
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多