2013-04-02 4 views
0

Я разделяю две таблицы, как показано ниже.извлечение значения из столбца значения столбца XMLl ike

Название таблицы: ATTRB

CMPG_ID  ATTR_NAME  ATTR_DESC REQUIRED TYPE   ATTR_SEQ 
12765 Attribute1 attribute1 1   String  2 
12765 OFFERTA Offer  1  Indentification 1 

Название таблицы: LEAD

CMPG_ID DYNAMIC_COLUMN 
12765    <OFFERTA MaskType="Indentification">20110508</OFFERTA><Attribute1 
       MaskType="String">7894568978</Attribute1> 

Я создал процедуру, как показано ниже:

ALTER PROCEDURE [dbo].[up_Attrs_Get]( 
    @CampaignID varchar(10)) 
AS 

BEGIN 
SELECT ATTRB.CMPG_ID AS CampaignID, 
    ATTRB.ATTR_NAME AS AttributeName , 
ATTRB.ATTR_DESC AS AttributeDesc, 
ATTRB.REQUIRED AS Required, 
     CASE WHEN ATTRB.REQUIRED = 0 Then 'No' 
     ELSE 'Yes' 
     END as RequiredState, 
CASE 
WHEN ATTRB.TYPE <> '' THEN 
ATTRB.TYPE 
ELSE 'String' 
END 
AS AttributeType, 
ATTRB.ATTR_SEQ AS AttributeSeq 
FROM ATTRB 
WHERE ATTRB.CMPG_ID = @CampaignID ORDER BY ATTR_SEQ 
END 

Теперь мне нужно извлечь результат, как показано ниже ,

CMPG_ID ATTR_NAME  ATTR_DESC REQUIRED TYPE    ATTR_SEQ Value 
12765 Attribute1  attribute12 1 String   2  20110508 
12765 OFFERTA  Offer  1 Indentification 1  7894568978 

Столбец Value shoudl извлекает значение из LEAD.Dynamic column.

благодаря

+0

Итак, что вы пробовали до сих пор? Почему это не работает? – mdm

+0

Я пробовал внутреннее соединение ниже, но он дает мне больше строк в результате, поскольку основная таблица имеет больше записей. Я не знаю, как извлечь значение из-под столбца 20110508 7894568978

+0

<Оферта MaskType = "Тождественность"> 20110508 7894568978 Пожалуйста, помогите мне, чтобы извлечь значение из выше колонки –

ответ

0

Если вы знаете имена всех элементов, которые могут быть внутри XML (т.е. список имен элементов конечное перечисление), вы можете использовать их в качестве источника PIVOT (см оператор SQL Pivot):

select DYNAMIC_COLUMN.value('./OFFERTA[1]','varchar(max)') AS OFFERTA 
    , DYNAMIC_COLUMN.value('./Attribute1[1]','varchar(max)') AS Attribute1 
from LEAD 
WHERE CMPG_ID = 12765 

Или же вы можете просто UNION значения, чтобы избежать с помощью оператора PIVOT:

select 'OFFERTA' AS ATTR_NAME, DYNAMIC_COLUMN.value('./OFFERTA[1]','varchar(max)') AS VALUE 
from LEAD 
WHERE CMPG_ID = 12765 
UNION ALL 
select 'Attribute1' AS ATTR_NAME, DYNAMIC_COLUMN.value('./Attribute1[1]','varchar(max)') AS VALUE 
from LEAD 
WHERE CMPG_ID = 12765 

с другой стороны, если вы не знаете, все р имена осевых элементов (т. новые имена элементов могут быть введены в любой момент из внешнего источника), то это намного сложнее, так как вам нужно использовать своего рода «отражение» XML. Смотрите ссылки ниже:

http://www.jasonfollas.com/wiki/(X(1)S(te4lutlbagfz1qblpl3clbhm))/Default.aspx?Page=SQLXML_Tricks_ElementNames&AspxAutoDetectCookieSupport=1

http://sqlblog.com/blogs/peter_debetta/archive/2010/02/09/shredding-xml-into-hierarchyid-a-new-look.aspx

+0

Да, что является правильным столбец будет меняться в любое время внешним источником. –

+0

Проверьте 2-ую ссылку выше (от Peter DeBetta). Я попробовал это с вашим xml, и его код работал отлично. Единственное изменение, которое вам нужно сделать, это добавить корневой узел в ваш XML-документ следующим образом: declare @x xml = ' 20110508 7894568978' –

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