Невозможно выполнить сценарий SQL по коду, но выполнение в SSMS работает - PullRequest
0 голосов
/ 24 января 2019

Следующий 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 голосов
/ 24 января 2019

Как упомянул Михал:

@@ rowcount возвращает количество строк, затронутых последним оператором. Если количество строк превышает 2 миллиарда, используйте 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
0 голосов
/ 24 января 2019

При запуске выписки из приложения @@ rowcount равно «0» Сначала вы должны его инициализировать, например так:

SELECT 1;
WHILE @@rowcount > 0
BEGIN
    DELETE TOP(100) t1 
    WHERE name >= 20000
END
0 голосов
/ 24 января 2019

Начнем с определения:

@@rowcount возвращает количество строк, затронутых последним оператором.

Похоже, @@rowcount равно 0.

При создании нового соединения это значение по умолчанию равно 1, поэтому оно должно войти в ваш цикл, но, возможно, вы удалили все строки, удовлетворяющие условию where.

Еще одно предположение: есть некоторые операции, которые влияют на 0 строк, поэтому @@rowcount равно 0, и ваш цикл не введен.

Вы можете проверить вышеизложенные догадки, выполнив и получив результаты следующего запроса:

SELECT @@rowcount [rowcount]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...