C# 无法通过代码执行SQL脚本,但在SSMS中执行有效
以下SQL脚本保存在文件中:C# 无法通过代码执行SQL脚本,但在SSMS中执行有效,c#,sql,sql-server,ssms,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 =
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服务器上正确执行,条目仍然存在。没有例外
如果在MicrosoftSQLServerManagementStudio中运行该脚本,则执行该脚本时不会出现任何问题
什么会导致此问题?让我们从定义开始:
@@rowcount
返回受上一条语句影响的行数
看起来@@rowcount
等于0
创建新连接时,该值默认为1,因此它必须进入循环,但可能您删除了满足where
子句的所有行
另一种猜测是:有些操作会影响0行,因此@@rowcount
等于0,并且不会进入循环
您可以通过执行和检索以下查询的结果来检查上述猜测:
SELECT @@rowcount [rowcount]
正如Michał提到的: @@rowcount返回受上一条语句影响的行数。如果行数超过20亿,请使用ROWCOUNT\u 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
从应用程序运行语句时@@rowcount等于“0” 您必须首先对其进行初始化,如下所示:
SELECT 1;
WHILE @@rowcount > 0
BEGIN
DELETE TOP(100) t1
WHERE name >= 20000
END
你能发布
queryString
数据吗?你为什么不从name>=2000的t1中执行DELETE之类的操作?为什么要使用while循环?我担心name>=20000时可能会出现排序/排序问题。甚至可能是一个数据类型问题。你能试着把它变成一个SP,并称之为SP吗?不确定程序性T-SQL将如何从ADO.NET执行您无法确定@@rowcount>0第一次,我建议您将逻辑改为do while语法,例如,谢谢,这就是问题所在