20

我正在处理一个烦人的数据库,其中一个字段包含真正应该存储的两个单独字段。因此,该列存储的内容类似于“第一个字符串~@~第二个字符串”,其中“~@~”是分隔符。(同样,我没有设计这个,我只是想修复它。)

我想要一个查询将它移动到两列中,看起来像这样:

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

但我找不到任何与 strpos 等效的东西。

4

3 回答 3

37

用户字符索引:

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

关联

于 2009-07-08T19:01:00.030 回答
12

PatIndex 函数应该将模式的位置作为字符串的一部分提供给您。

PATINDEX ( '%pattern%' , expression )

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

于 2009-07-08T19:06:06.400 回答
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)-@intPos)
    END
    IF LEN(@strList)>0 
        INSERT INTO @retTable (intValue) values (CONVERT(int, @strList))

    RETURN

END

只需将函数中的 ',' 替换为分隔符(或者甚至将其参数化)

于 2009-07-08T19:58:59.477 回答