2009-07-08 11 views
15

Mam do czynienia z irytującą bazą danych, w której jedno pole zawiera to, co powinno być przechowywane w dwóch osobnych polach. Tak więc kolumna jest przechowywana w stylu "Pierwszy ciąg ~ @ ~ Drugi ciąg", gdzie "~ @ ~" jest ogranicznikiem. (Ponownie, nie zaprojektować to, po prostu próbuję to naprawić.)Serwer SQL: jakikolwiek odpowiednik strpos()?

Chcę kwerendy, aby przenieść to na dwie kolumny, które wyglądają mniej więcej tak:

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)) 

Ale Nie mogę stwierdzić, że istnieje jakikolwiek odpowiednik strpos.

Odpowiedz

34

charIndex użytkownika:

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

Link

+0

Należy zauważyć, że kolejność argumentów jest tutaj przełączana, co prowadzi do wielu błędów "String lub binary data would be ścięte", jeśli pozostawisz igłę i stóg siana w tej samej kolejności, co strpos. – Noumenon

0

Jeśli potrzebujesz danych w kolumnach Oto co mogę użyć:

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 

Wystarczy zastąpić „” w funkcji z ogranicznikiem (a może nawet parametrize go)