以下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中运行脚本,则该脚本正在执行,没有任何问题。
什么会导致此问题?
答案 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