无法通过代码执行SQL脚本,但是在SSMS中执行有效

时间:2019-01-24 13:21:16

标签: c# sql sql-server ssms

以下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中运行脚本,则该脚本正在执行,没有任何问题。

什么会导致此问题?

3 个答案:

答案 0 :(得分:3)

让我们从定义开始:

  

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

看起来像@@rowcount等于0。

在创建新连接时,该值默认为1,因此必须进入循环,但是也许您删除了所有符合where子句的行。

另一种猜测是:有一些操作会影响0行,因此@@rowcount等于0,并且没有输入循环。

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

SELECT @@rowcount [rowcount]

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

如Michał所述:

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

如果要删除大块记录,应执行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