2009-07-08 4 views
15

Je fais face à une base de données ennuyeuse 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 délimiteur. (Encore une fois, je ne conçois, je suis juste essayer de le réparer.)SQL Server: un équivalent de strpos()?

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

UPDATE UserAttributes 
SET str1 = SUBSTRING(Data, 1, STRPOS(Data, '[email protected]~')), 
    str2 = SUBSTRING(Data, STRPOS(Data, '[email protected]~')+3, LEN(Data)-(STRPOS(Data, '[email protected]~')+3)) 

Mais Je ne trouve pas d'équivalent à des strpos.

Répondre

34

utilisateur charindex:

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

Link

+0

Il est important de noter que l'ordre des arguments est commuté ici, ce qui conduit à beaucoup d'erreurs "Chaînes ou données binaires seraient tronquées" si vous laissez l'aiguille et la meule de foin dans le même ordre que strpos. – Noumenon

0

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)[email protected]) 
    END 
    IF LEN(@strList)>0 
     INSERT INTO @retTable (intValue) values (CONVERT(int, @strList)) 

    RETURN 

END 

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

Questions connexes