Sql 连接XML属性

Sql 连接XML属性,sql,tsql,xquery,xquery-sql,Sql,Tsql,Xquery,Xquery Sql,我在varchar列中存储了一些xml,其中一些节点的属性中的id是另一个表中的键。如何在多个属性上进行连接?我知道下面的value方法只返回一个id,然后返回第一个id create table #table1 (id1 int, col1 varchar(50)); create table #table2 (id2 varchar(1), col2 varchar(4)); insert into #table1 (id1, col1) values ('1', '<a>&l

我在varchar列中存储了一些xml,其中一些节点的属性中的id是另一个表中的键。如何在多个属性上进行连接?我知道下面的value方法只返回一个id,然后返回第一个id

create table #table1 (id1 int, col1 varchar(50));
create table #table2 (id2 varchar(1), col2 varchar(4));

insert into #table1 (id1, col1) values
('1', '<a><b id="1"></b><b id="2"></b></a>');

insert into #table2 (id2, col2) values
('1', 'val1'),
('2', 'val2');

select * from #table1 t1
left join #table2 t2 on t2.id2 = cast(t1.col1 as xml).value('(/a/b/@id)[1]', 'varchar(1)')
返回

id1  col1                                   id2 col2
1    <a><b id="1"></b><b id="2"></b></a>    1   val1
如何返回表2的ID 2的另一行

1    <a><b id="1"></b><b id="2"></b></a>    2   val2

如果您的类型正确,这将容易得多:

    CREATE TABLE #table1 ( id1 INT, col1 VARCHAR(50) );
    CREATE TABLE #table2
        (
          id2 VARCHAR(1)
        , col2 VARCHAR(4)
        );

    INSERT  INTO #table1
            ( id1
            , col1
            )
    VALUES  ( '1'
            , '<a><b id="1"></b><b id="2"></b></a>'
            );

    INSERT  INTO #table2
            ( id2, col2 )
    VALUES  ( '1', 'val1' ),
            ( '2', 'val2' );
 ;
    WITH    c AS ( SELECT   id1
                          , col1 = CONVERT(XML, col1)
                   FROM     #table1 t
                 )
        SELECT  id1
              , col1
              , id2
              , col2
        FROM    c
                CROSS APPLY c.col1.nodes('(/a/b)') q ( x )
                LEFT JOIN #table2 t2 ON t2.ID2 = x.value('./@id', 'varchar(1)')


    DROP TABLE #table1, #table2