Question

Je fais face à une base de données ennuyeux où un champ contient ce qui devrait vraiment être stocké deux champs distincts. Ainsi, la colonne est stockée quelque chose comme « La première chaîne ~ @ ~ La deuxième chaîne », où « ~ @ ~ » est le séparateur. (Encore une fois, je ne conçois, je suis juste essayer de le réparer.)

Je veux une requête pour faire avancer ce en deux colonnes, qui ressemblerait à quelque chose comme ceci:

UPDATE UserAttributes
SET str1 = SUBSTRING(Data, 1, STRPOS(Data, '~@~')),
    str2 = SUBSTRING(Data, STRPOS(Data, '~@~')+3, LEN(Data)-(STRPOS(Data, '~@~')+3))

Mais je ne peux pas trouver que tout équivalent à strpos existe.

Était-ce utile?

La solution

Utilisateur charindex:

Select CHARINDEX ('S','MICROSOFT SQL SERVER 2000')
Result: 6

lien

Autres conseils

La fonction patindex devrait vous donner l'emplacement du motif comme une partie d'une chaîne.

PATINDEX ( '%pattern%' , expression )

http://msdn.microsoft.com/en-us/library/ ms188395.aspx

Si vous avez besoin de vos données dans les colonnes voici ce que j'utilise:

  create FUNCTION [dbo].[fncTableFromCommaString] (@strList varchar(8000))  
RETURNS @retTable Table (intValue int) AS  
BEGIN 

    DECLARE @intPos tinyint

    WHILE CHARINDEX(',',@strList) > 0
    BEGIN   
        SET @intPos=CHARINDEX(',',@strList) 
        INSERT INTO @retTable (intValue) values (CONVERT(int, LEFT(@strList,@intPos-1)))
        SET @strList = RIGHT(@strList, LEN(@strList)-@intPos)
    END
    IF LEN(@strList)>0 
        INSERT INTO @retTable (intValue) values (CONVERT(int, @strList))

    RETURN

END

Juste remplacer « » dans la fonction avec votre delimiter (ou peut-être même paramétrisation il)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top