У меня есть таблица, в которой есть столбец со значениями нежелательной почты

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, а значение будет значением из @tmp

Ожидаем результата, как показано ниже

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

Я использую SQL Server 2008, могу ли я этого добиться?

0
HashCoder 2 Апр 2014 в 15:21

3 ответа

Лучший ответ

Немного сложно, но это работает !, попробуйте следовать,

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
2
ssilas777 2 Апр 2014 в 13:46

Может это вам поможет ..

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
1
Aasish Kr. Sharma 2 Апр 2014 в 11:41

Я знаю, что это упрощенный подход, но если данные действительно выложены так, как в вашем примере, то это самый простой и эффективный способ:

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
0
dean 2 Апр 2014 в 11:56