2009-07-08 3 views
15

Я имею дело с досадной базой данных, где одно поле содержит то, что действительно должно храниться в двух отдельных полях. Таким образом, в столбце хранится нечто вроде «Первая строка ~ @ ~ Вторая строка», где «~ @ ~» является разделителем. (Опять же, я не проектировал это, я просто пытаюсь это исправить.)SQL Server: любой эквивалент strpos()?

Я хочу, чтобы запрос, чтобы переместить это в два столбца, который будет выглядеть примерно так:

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

Но Я не могу найти, что существует какой-либо эквивалент strpos.

ответ

34

Пользователь CHARINDEX:

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

Link

+0

Важно отметить, что порядок аргументов переключается сюда, что приводит к тому, что ошибки «String или двоичные данные будут усечены», если вы оставите иглу и стог сена в том же порядке, что и StrPos. – Noumenon

0

Если вам нужны ваши данные в столбцах здесь является то, что я использую:

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 

Просто замените «» в функции с разделителем (или, возможно, даже параметризуем ее)

Смежные вопросы