我有一个表,其中有一个带有垃圾值的列
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,有什么方法可以实现这个目标吗?
答案 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