Это перебирает массив классов и проверяет, есть ли какие-либо элементы, соответствующие каждому классу на странице. Совпадающие имена классов помещаются в новый массив.
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;
}
}
Вы действуете в режиме явной или неявной транзакции?
Так как Вы находитесь в явном режиме, я думаю, что необходимо окружить УДАЛИТЬ операцию операторами 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 действительно вносить изменения.
Очевидно, что-то не удаляется или изменяется, где это должно. Если условие является все еще тем же на следующем повторении, оно собирается продолжать идти.
Кроме того, Вы сравниваете @TmpShoppingCartItemID, и не @PurchID. Я вижу, как они могли отличаться, и Вы могли удалить другую строку, чем та, на которую это проверяется в в то время как оператор.
Если будут какие-либо объекты корзины, которые не существуют в таблице GoodsForSale затем, то это будет вращаться в бесконечный цикл.
Попытайтесь изменить Ваш, существует оператор для принятия во внимание это
(SELECT * FROM ShoppingCartItem WHERE JOIN GoodsForSale on ShoppingCartItem.GFSID = GoodsForSale.GFSID where ShoppingCartItem.PurchID = @PurchID)
Или лучше все еще, переписывая это так это не требует цикла. Цикличное выполнение как это является неизбежным бесконечным циклом. Необходимо заменить основанными на наборе операциями и транзакцией.
Существует ли запись в ShoppingCartItem с тем @PurchID, где GFSID не находится в таблице GoodsForSale? Это объяснило бы, почему СУЩЕСТВОВАНИЕ возвращает true, но больше нет записей для удаления.
Если вышеупомянутые комментарии не помогли Вам до сих пор, я предлагаю добавить / замена:
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
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
При изменении кода для выборки ключа (не присоединяясь) и затем выбирая связанные данные ключом во втором запросе, Вы победите.
Я не уверенный, если я понимаю проблему, но в избранном пункте, это делает внутреннее объединение с другой таблицей. То соединение может вызвать для получения записей и затем удалить сбоев. Попытайтесь использовать левое соединение.