Выражение while в T-SQL это циклично выполняется навсегда

Это перебирает массив классов и проверяет, есть ли какие-либо элементы, соответствующие каждому классу на странице. Совпадающие имена классов помещаются в новый массив.

var classes = [".abc", ".def", ".ghi"];
var found = [];

for(var i = 0; i < classes.length; i++) {
    if($(classes[i]).length > 0) {
        found.push(classes[i]);
    }
}

Если вы уверены, что в начальном списке будет найден только один класс, вы можете остановиться после первого попадания:

var classes = [".abc", ".def", ".ghi"];
var found;

for(var i = 0; i < classes.length; i++) {
    if($(classes[i]).length > 0) {
        found = classes[i];
        break;
    }
}
7
задан Community 23 May 2017 в 11:48
поделиться

7 ответов

Вы действуете в режиме явной или неявной транзакции?

Так как Вы находитесь в явном режиме, я думаю, что необходимо окружить УДАЛИТЬ операцию операторами BEGIN TRANSACTION и COMMIT TRANSACTION.

WHILE EXISTS (SELECT * FROM ShoppingCartItem WHERE ShoppingCartItem.PurchID = @PurchID)
BEGIN
    SELECT TOP 1 
            @TmpGFSID = ShoppingCartItem.GFSID, 
            @TmpQuantity = ShoppingCartItem.Quantity,
            @TmpShoppingCartItemID = ShoppingCartItem.ShoppingCartItemID,
    FROM
            ShoppingCartItem INNER JOIN GoodsForSale on ShoppingCartItem.GFSID = GoodsForSale.GFSID
    WHERE ShoppingCartItem.PurchID = @PurchID

    EXEC @ErrorCode = spGoodsForSale_ReverseReservations @TmpGFSID, @TmpQuantity
    IF @ErrorCode <> 0
    BEGIN
            Goto Cleanup    
    END

    BEGIN TRANSACTION delete

        DELETE FROM ShoppingCartItem WHERE ShoppingCartItem.ShoppingCartItemID = @TmpShoppingCartItemID
        -- @@ROWCOUNT is 1 after this

    COMMIT TRANSACTION delete
END

Разъяснение: причина необходимо было бы использовать транзакции, состоит в том, что удаления на самом деле не происходит в базе данных, пока Вы не делаете операцию ФИКСАЦИИ. Это обычно используется, когда у Вас есть несколько операций записи в атомарной транзакции. В основном Вы только хотите, чтобы изменения произошли с DB, если все операции успешны.

В Вашем случае существует только 1 операция, но так как Вы находитесь в режиме явной транзакции, необходимо сказать SQL Server действительно вносить изменения.

3
ответ дан 7 December 2019 в 10:10
поделиться

Очевидно, что-то не удаляется или изменяется, где это должно. Если условие является все еще тем же на следующем повторении, оно собирается продолжать идти.

Кроме того, Вы сравниваете @TmpShoppingCartItemID, и не @PurchID. Я вижу, как они могли отличаться, и Вы могли удалить другую строку, чем та, на которую это проверяется в в то время как оператор.

0
ответ дан 7 December 2019 в 10:10
поделиться

Если будут какие-либо объекты корзины, которые не существуют в таблице GoodsForSale затем, то это будет вращаться в бесконечный цикл.

Попытайтесь изменить Ваш, существует оператор для принятия во внимание это

(SELECT * FROM ShoppingCartItem WHERE  JOIN GoodsForSale on ShoppingCartItem.GFSID = GoodsForSale.GFSID where ShoppingCartItem.PurchID = @PurchID)

Или лучше все еще, переписывая это так это не требует цикла. Цикличное выполнение как это является неизбежным бесконечным циклом. Необходимо заменить основанными на наборе операциями и транзакцией.

0
ответ дан 7 December 2019 в 10:10
поделиться

Существует ли запись в ShoppingCartItem с тем @PurchID, где GFSID не находится в таблице GoodsForSale? Это объяснило бы, почему СУЩЕСТВОВАНИЕ возвращает true, но больше нет записей для удаления.

1
ответ дан 7 December 2019 в 10:10
поделиться

Если вышеупомянутые комментарии не помогли Вам до сих пор, я предлагаю добавить / замена:

DECLARE Old@ShoppingCartItemID INT

SET @OldShoppingCartItemID = 0

WHILE EXISTS (SELECT ... WHERE ShoppingCartItemID > @ShoppingCartItemID)

SELECT TOP 1 WHERE ShoppingCartItemID > @OldShoppingCartItemID ORDER BY ShoppingCartItemID 

SET @OldShoppingCartItemID = @TmpShoppingCartItemID
0
ответ дан 7 December 2019 в 10:10
поделиться
FROM
  ShoppingCartItem
    INNER JOIN
  GoodsForSale
    on ShoppingCartItem.GFSID = GoodsForSale.GFSID

Ой, Ваше соединение снижает набор результатов для обнуления строк.

 SELECT TOP 1
    @TmpGFSID = ShoppingCartItem.GFSID,
    @TmpQuantity = ShoppingCartItem.Quantity,
    @TmpShoppingCartItemID =
      ShoppingCartItem.ShoppingCartItemID

Ой, Вы использовали мультиприсвоение против набора без строк. Это заставляет переменные оставаться неизменными (у них будет то же значение, которое они имели в прошлый раз через цикл). Переменные НЕ становятся присвоенными пустому указателю в этом случае.

При помещении этого кода в начале цикла он (правильно) перестанет работать быстрее:

 SELECT
    @TmpGFSID = null,
    @TmpQuantity = null,
    @TmpShoppingCartItemID = null

При изменении кода для выборки ключа (не присоединяясь) и затем выбирая связанные данные ключом во втором запросе, Вы победите.

3
ответ дан 7 December 2019 в 10:10
поделиться

Я не уверенный, если я понимаю проблему, но в избранном пункте, это делает внутреннее объединение с другой таблицей. То соединение может вызвать для получения записей и затем удалить сбоев. Попытайтесь использовать левое соединение.

-1
ответ дан 7 December 2019 в 10:10
поделиться