0

我正在分享一些两个表结构,如下所示。

表名: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 列应该是从 LEAD.Dynamic 列中提取的值。

谢谢

4

1 回答 1

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

否则,您可以将这些值联合起来以避免使用 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

于 2013-04-02T16:05:07.837 回答