拆分字符串并将其保存到临时表

时间:2014-04-02 11:21:10

标签: sql sql-server sql-server-2008

我有一个表,其中有一个带有垃圾值的列

DECLARE @tmp TABLE(junkValues nvarchar(max))

INSERT into @tmp (junkValues)
VALUES ('@{''id''= ''63FCE3C0-B6FE-4FFE-8BC8-506A338455DD''; Value="ABC"; Other="ddd"}')

INSERT into @tmp (junkValues)
VALUES ('@{''id''= ''C10560BA-7059-4AC5-B9ED-77BAC7182BD7''; Other="ddd"; Value="XYZ" }')

我想将这个以分号分隔的值转换为另一个临时表。

DECLARE @outputTempTable TABLE(CDID uniqueidentifier, Value nvarchar(max))

其中CDID将是来自@tmp的id,而Value将是来自@tmp

的值

期望输出如下

CDID                                       Value       
-----                                      -----------
63FCE3C0-B6FE-4FFE-8BC8-506A338455DD        ABC
C10560BA-7059-4AC5-B9ED-77BAC7182BD7        XYZ 

我正在使用SQL Server 2008,有什么方法可以实现这个目标吗?

3 个答案:

答案 0 :(得分:2)

有点复杂,但它有效!,请尝试以下,

DECLARE @tmp TABLE(junkValues nvarchar(max))

INSERT into @tmp (junkValues)
VALUES ('@{''id''= ''63FCE3C0-B6FE-4FFE-8BC8-506A338455DD''; Value="ABC", Other="ddd"}')

INSERT into @tmp (junkValues)
VALUES ('@{''id''= ''C10560BA-7059-4AC5-B9ED-77BAC7182BD7''; Other="ddd"; Value="XYZ" }')

;with cte as
(
select junkValues
        ,CHARINDEX('''id''= ''',junkValues) + 7 as IDStart
        ,CHARINDEX(''';',junkValues,CHARINDEX('''id''= ''',junkValues))  as IDEnd
        ,CHARINDEX('Value="',junkValues) + 7 as valStart
        ,CHARINDEX('"',junkValues,CHARINDEX('Value="',junkValues) + 8)  as valEnd

from @tmp
)
select *
    ,SUBSTRING(junkValues,IDStart, IDEnd  - IDStart  )  as IDCol
    ,SUBSTRING(junkValues,valStart, valEnd  - valStart  )  as ValCol
    from cte

答案 1 :(得分:1)

这可以帮助你..

DECLARE @tmp TABLE(junkValues nvarchar(max))

INSERT into @tmp (junkValues)
VALUES ('@{''id''= ''63FCE3C0-B6FE-4FFE-8BC8-506A338455DD''; Value="ABC", Other="ddd"}')

INSERT into @tmp (junkValues)
VALUES ('@{''id''= ''C10560BA-7059-4AC5-B9ED-77BAC7182BD7''; Value="XYZ", Other="ddd"}')

SELECT 
SUBSTRING(junkValues,CHARINDEX('''= ''',junkValues)+4, 36) AS CDID,
SUBSTRING(junkValues,CHARINDEX('="',junkValues)+2,((CHARINDEX('", O',junkValues))-(CHARINDEX('="',junkValues)+2))) AS Value
from @tmp

答案 2 :(得分:0)

我知道这是一种简单化的方法,但如果数据真的如您的样本那样布局,那么这是最简单,最有效的方法:

select substring(junkValues, 10, 36) as CDID, substring(junkValues, 56, 3) as Value
from #tmp

否则,应该使用PATINDEX来识别子串的开始和长度:

select 
substring(junkValues, patindex('%''id''= %', junkValues)+7, patindex('%; Value=%', junkValues)-11),
substring (junkValues, patindex('%Value=%', junkValues)+7, patindex('%Other=%', junkValues)-patindex('%Value=%', junkValues)-10)
from #tmp