代码之家  ›  专栏  ›  技术社区  ›  user1519979

无法按代码执行SQL脚本,但在SSMS Works中执行

  •  0
  • user1519979  · 技术社区  · 7 年前

    以下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 回复  |  直到 7 年前
        1
  •  3
  •   Michał Turczyn    7 年前

    让我们从定义开始:

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

    看起来像 @行数 等于0。

    创建新连接时,此值默认为1,因此它必须进入循环,但可能删除了所有满足条件的行 where 条款。

    另一种猜测是:有一些操作会影响0行,所以 @行数 等于0且未输入循环。

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

    SELECT @@rowcount [rowcount]
    
        2
  •  2
  •   Slava Murygin    7 年前

    当您从应用程序运行语句时@@rowcount等于“0” 您必须先初始化它,如下所示:

    SELECT 1;
    WHILE @@rowcount > 0
    BEGIN
        DELETE TOP(100) t1 
        WHERE name >= 20000
    END
    
        3
  •  1
  •   LukaszBalazy    7 年前

    如Micha_

    @@rowcount返回受最后一条语句影响的行数。如果行数超过20亿,请使用行数“大”。来自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