2017-07-21 2 views
0

J'ai une valeur de chaîne importante que je cherche à placer dans une base de données. J'ai le code actuel pour le faire.Sélection de la valeur entre deux caractères dans la chaîne Serveur SQL

DECLARE @Value NVARCHAR(max) = {status} 
DECLARE @DYVALUE TABLE (VALUE NVARCHAR(MAX)) 
INSERT INTO @DYVALUE (value) 
SELECT @VALUE 
;WITH cte 
AS (
SELECT Split.a.value('.', 'VARCHAR(1000)') AS Value 
FROM (
    SELECT CAST('<S>' + REPLACE(Value, ',', '</S><S>') + '</S>' AS XML) AS Value 
    FROM @DyValue 
    ) AS A 
CROSS APPLY Value.nodes('/S') AS Split(a) 
) 

insert into mytable 
SELECT * 
FROM (
SELECT replace(LTRIM(SUBSTRING(Value, 0, CHARINDEX('|', value))),' ','') AS col1 
    ,SUBSTRING(Value, CHARINDEX('|', Value) + 1, LEN(Value)) AS [col2] 
    ,SUBSTRING(Value, CHARINDEX('/', Value) + 1, LEN(Value)) AS [col3] 

FROM Cte 
) dt 

Cela me permet de tout placer avant le | dans la colonne1, et tout après/dans la colonne 3. Je dois essayer de tout placer entre la valeur '|' et «/» dans colonne2

Je me bats pour obtenir

,SUBSTRING(Value, CHARINDEX('|', Value) + 1, LEN(Value)) AS [col2] 

pour ne prendre que ces valeurs entre les deux personnages.

Un exemple du type de chaîne ce sera en cours d'exécution sur est

1234567890 | Goodbye Cruel World/je devrais être dans la colonne 3, 2345678901 | Cruel World/je devrais être au revoir à la colonne 3, 3456789012 | Au revoir monde cruel/S'il vous plaît mettez-moi dans la colonne 3, 3456789012 | Au revoir monde cruel/S'il vous plaît mettez-moi dans la colonne 3, 6324589657 | Hello World/Je dois être dans Col 3, 1145698763 | Au revoir monde cruel/Je devrais être dans la colonne 3 , 36985214728 | Au revoir monde cruel/je devrais être dans la colonne 3, 7412589635 | Au revoir monde cruel/je devrais être dans la colonne 3, 7412589635 | Au revoir monde cruel/je devrais être dans la colonne 3, 6398756951 | S'il vous plaît aidez-moi/S'il vous plaît mettez-moi Colonne 3,

La chaîne sera dans ce format, je viens de changer les valeurs pour quelque chose d'un peu plus amusant.

Toute aide serait grandement appréciée.

En utilisant Microsoft SQL Server 2012 (SP3)

Répondre

0

S'il est toujours trois mots entre chaque virgule et les mots ne sont pas plus de 128 caractères utilisez PARSENAME

;WITH cte 
    AS (SELECT Split.a.value('.', 'VARCHAR(1000)') AS Value 
     FROM (SELECT Cast('<S>' + Replace(Value, ',', '</S><S>') + '</S>' AS XML) AS Value 
       FROM @DyValue) AS A 
       CROSS APPLY Value.nodes('/S') AS Split(a)) 
SELECT Parsename(string, 3), 
     Parsename(string, 2), 
     Parsename(string, 1) 
FROM (SELECT Replace(Replace(value, '|', '.'), '/', '.') string 
     FROM cte)a 

Une autre façon, travaillera avec nombre illimité de caractères

WITH cte 
    AS (SELECT Split.a.value('.', 'VARCHAR(1000)') AS Value 
     FROM (SELECT Cast('<S>' + Replace(Value, ',', '</S><S>') + '</S>' AS XML) AS Value 
       FROM @DyValue) AS A 
       CROSS APPLY Value.nodes('/S') AS Split(a)) 
SELECT LEFT(value, Charindex('|', value) - 1), 
     Substring(value, Charindex('|', value) + 1, Charindex('/', value) - Charindex('|', value) - 1), 
     Substring(value, Charindex('/', value) + 1, Len(value)) 
FROM cte 
+0

Je souhaite qu'il serait toujours trois mots, la quantité de mots varie désolé. – Phil

+0

@Phil - C'était un exemple .. vérifier maintenant –

+0

Similaire à la réponse ci-dessus, j'obtiens l'erreur "Paramètre de longueur invalide passé à la fonction GAUCHE ou SUBSTRING" en essayant d'exécuter ceci – Phil

0

Si j'ai bien compris la question, cela pourrait être une solution:

SELECT 
SUBSTRING(Value, 0, CHARINDEX('|', Value)) AS column1, 
SUBSTRING(Value, CHARINDEX('|', Value) + 1, CHARINDEX('/', Value) 
    - CHARINDEX('|', Value) - 1) AS column2, 
SUBSTRING(Value, CHARINDEX('/', Value) + 1, LEN(Value)) AS column3 

Modifier en raison de commentaires:

SELECT 
SUBSTRING(Value, 0, CHARINDEX('|', Value)) AS column1, 
SUBSTRING(Value, CHARINDEX('|', Value) + 1, 
    CHARINDEX('/', Value) - CHARINDEX('|', Value) - 1) AS column2, 
SUBSTRING(Value, CHARINDEX('/', Value) + 1, LEN(Value) - CHARINDEX('/', Value)) AS column3 
+0

Même si je n'essaie pas d'insérer ceux-ci dans une base de données, j'obtiens l'erreur "Paramètre de longueur invalide passé à la fonction GAUCHE ou SUBSTRING" – Phil

+0

@Phil: Hmmm c'est bizarre. Pour moi ça marche. J'ai édité ma réponse pour changer la partie 'LEN'. Peut-être que ça aide ... – schlonzo