Kanske det här inlägget är lite för gammalt men jag har provat koden som presenteras av Devart och det fungerar inte för mig.
Med få ändringar fungerar den här versionen för mig :
DELIMITER $$
CREATE PROCEDURE procedure1(IN strIDs VARCHAR(255))
BEGIN
DECLARE strLen INT DEFAULT 0;
DECLARE SubStrLen INT DEFAULT 0;
IF strIDs IS NULL THEN
SET strIDs = '';
END IF;
do_this:
LOOP
SET strLen = CHAR_LENGTH(strIDs);
UPDATE TestTable SET status = 'C' WHERE Id = SUBSTRING_INDEX(strIDs, ',', 1);
SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
SET strIDs = MID(strIDs, SubStrLen, strLen);
IF strIDs = '' THEN
LEAVE do_this;
END IF;
END LOOP do_this;
END
$$
DELIMITER ;
Förklaringar:
1) Varför "+2" IN SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
När du kör MID-funktionen på nästa rad börjar strängindex med 1. Om du har följande sträng '4500,2', med Devart-versionen, ser MID ut som MID('4500,2',4,6) som är retur ',2'.
Så om du lägger till 1 vid delsträngens längd är du på avgränsaren. Det räcker inte. Så du lägger till längden på avgränsaren. Nu är det bra.
2) Varför IF strIDs = '' THEN
i slingtillståndet?
För när du gör MID returnerar du en sträng även om denna sträng är tom.
Devart-proceduren är korrigerad! Tack så mycket för att du svarar :)