Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法通过代码执行SQL脚本,但在SSMS中执行有效_C#_Sql_Sql Server_Ssms - Fatal编程技术网

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

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 =

以下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服务器上正确执行,条目仍然存在。没有例外

如果在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语法,例如,谢谢,这就是问题所在