Fonctions de string SQL

C'est un problème auquel j'ai mis trop de time.

Je passe dans une string comme

@OrderSsortingng varchar(255) = '1=1;|2=|3=|4=1;|5=|' 

Le premier nombre est l'article que je voudrais order. Je vais save cela dans @ItemNum le deuxième nombre après le = est la quantité (sera stocké comme @ItemQuat ). La quantité peut être n'importe quoi de 1 à 1000. Si le zéro est commandé alors ce sera juste le numéro d'article et = .

La question est de savoir comment puis-je tirer dynamicment ces valeurs? Je ne veux que les valeurs supérieures à 0.

Je l'ai dérangé pendant des heures et je ne suis pas sûr si je dois mettre à jour la logique qui construit la string ou est-il possible de tirer les bonnes valeurs en utilisant des fonctions de string dans sql.

Exemple de ce que j'ai actuellement:

 --Obviously this won't work because it will always pull 1 regardless if the amount ordered is 0 set @ItemNum = subssortingng(@OrderSsortingng, 1, charindex('=', @OrderSsortingng, 1)-1) --This is currently wrong too because its pulling the quant for item 1 set @ItemQuat = subssortingng(@OrderSsortingng, charindex('=',@OrderSsortingng,1)+1, charindex('|',@OrderSsortingng,1)-charindex('=',@OrderSsortingng,1)-1) 

Je boucle et concatène la string après avoir tiré la première valeur, etc.

Toute aide serait appréciée!

Cette requête unique convertira cette string en un résultat de table avec les colonnes [ItemNumber] et [ItemValue], plus seulement les lignes de return où la valeur est supérieure à zéro. Est-ce que ça marche pour toi?

 DECLARE @OrderSsortingng VARCHAR(MAX) = '1=1;|2=|3=|4=1;|5=|'; WITH Step0 AS ( SELECT Ssortingng = REPLACE(@OrderSsortingng, ';', '') ), Step1 AS ( SELECT Block = SUBSTRING(Ssortingng, 1, CHARINDEX('|', Ssortingng) - 1), Ssortingng = SUBSTRING(Ssortingng, CHARINDEX('|', Ssortingng) + 1, LEN(Ssortingng)) FROM Step0 UNION ALL SELECT Block = SUBSTRING(Ssortingng, 1, CHARINDEX('|', Ssortingng) - 1), Ssortingng = SUBSTRING(Ssortingng, CHARINDEX('|', Ssortingng) + 1, LEN(Ssortingng)) FROM Step1 WHERE LEN(Ssortingng) > 0 ), Step2 AS ( SELECT ItemNumber = SUBSTRING(Block, 1, CHARINDEX('=', Block) - 1), ItemValue = SUBSTRING(Block, CHARINDEX('=', Block) + 1, LEN(Block)) FROM Step1 ), Step3 AS ( SELECT ItemNumber = CAST(ItemNumber AS INT), ItemValue = CAST(ItemValue AS INT) FROM Step2 WHERE CAST(ItemValue AS INT) > 0 ) SELECT * FROM Step3; 

PS: J'ai trouvé l'exercice curieux alors je pensais l'utiliser pour un post, j'espère que cela ne vous dérange pas:

https://tangodude.wordpress.com/2014/02/16/t-sql-extracting-serialized-data-from-ssortingng-in-one-go/

S'il est "passé de XML", il serait probablement préférable de passer le XML plutôt que la string. Le traitement XML dans ce que vous voulez serait tout simplement.

Vous pourriez même faire quelque chose de moche pour remettre la string en XML:

 DECLARE @OrderSsortingng VARCHAR(MAX) = '1=1;|2=|3=|4=1;|5=|'; DECLARE @xml XML SELECT @xml = CAST('<order_line><item_id>' +REPLACE(REPLACE(REPLACE(STUFF(@OrderSsortingng,LEN(@OrderSsortingng),1,''),';',''),'|' ,'</quantity></order_line><order_line><item_id>'),'=','</item_id><quantity>') +'</quantity></order_line>' AS XML) 

Et puis c'est vraiment simple:

 SELECT c.value('(item_id)[1]', 'int') item_id ,c.value('(quantity)[1]', 'int') quantity FROM @xml.nodes('/order_line') T(c)