Tout le monde, j'essaie de séparer une colonne Nom en 4 parties différentes. À l'heure actuelle, toutes les pièces de noms sont séparées par des espaces ». J'ai des problèmes avec mon @ThirdString peuplant la quatrième partie du nom (généralement un suffixe) que je veux être considéré comme le @fourThstring. Je vais l'exécuter avec des noms différents de différentes longueurs. J'utilise simplement l'exemple de Robert Dobson Bud Jr. Les autres noms pourraient être deux parties ou plus. i Voudrais se débarrasser de la JR dans la 3ème colonne. L'intention est d'avoir 4 colonnes différentes avec 4 parties différentes du nom. p> p>
p>
4 Réponses :
Utilisation d'une fonction de division, cela peut être agencé très simplement.
CREATE FUNCTION [dbo].[DelimitedSplit8K_LEAD]
--===== Define I/O parameters
(@pString VARCHAR(8000), @pDelimiter CHAR(1))
RETURNS TABLE WITH SCHEMABINDING AS
RETURN
--===== "Inline" CTE Driven "Tally Tableâ produces values from 0 up to 10,000...
-- enough to cover VARCHAR(8000)
WITH E1(N) AS (
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
), --10E+1 or 10 rows
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS (--==== This provides the "zero base" and limits the number of rows right up front
-- for both a performance gain and prevention of accidental "overruns"
SELECT 0 UNION ALL
SELECT TOP (DATALENGTH(ISNULL(@pString,1))) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
),
cteStart(N1) AS (--==== This returns N+1 (starting position of each "element" just once for each delimiter)
SELECT t.N+1
FROM cteTally t
WHERE (SUBSTRING(@pString,t.N,1) = @pDelimiter OR t.N = 0)
)
--===== Do the actual split. The ISNULL/NULLIF combo handles the length for the final element when no delimiter is found.
SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY s.N1),
Item = SUBSTRING(@pString,s.N1,ISNULL(NULLIF((LEAD(s.N1,1,1) OVER (ORDER BY s.N1) - 1),0)-s.N1,8000))
FROM cteStart s
;
La raison pour laquelle vous obtenez "JR" dans la troisième chaîne est un peu mystifié. C'est dans cette partie du code: Pourquoi utilisez-vous pour obtenir le len (@NeString) code> pour le troisième paramètre de la sous-chaîne? Bien sûr, cela retournera le reste de la chaîne, y compris le "JR". Vous saviez clairement de ne pas le faire de cette façon lorsque vous obtenez la valeur @secondstring code>, comment pouvez-vous ne pas savoir de le faire de cette façon lors de l'obtention du @ThirdString code>? p> @ThirdString code> Vous devez utiliser la même technique que vous avez utilisée pour obtenir le @secondstring code>. p> p>
Oui monsieur, je sais que c'est là que c'est le problème, mais quand j'ai essayé d'appliquer la même logique que je l'ai fait dans le secondstring, cela ne sort pas correctement. Je reçois une partie du texte secondaire ou juste le format incorrect en général
Vous devez modifier votre question pour montrer votre tentative d'utiliser la même logique dans le tierstring, afin que nous puissions déboguer pourquoi cela n'a pas fonctionné pour vous. À propos, vous pouvez faciliter votre code à lire à l'aide des variables au lieu de répéter leurs calculs. En d'autres termes, au lieu de charindex ('', @ namestring, 1) +1 code> Vous pouvez simplement faire @ premierspaceloc + 1 code>
Ce script fera le travail
First String Second String Third String Fourt String Robert Dobson NULL NULL
Est-ce que c'est ce que vous voulez? +--------+--------+------+------+
| Str1 | Str2 | Str3 | Str4 |
+--------+--------+------+------+
| Robert | Dobson | Bud | jr |
+--------+--------+------+------+
Les programmeurs de mensonges croient des noms