3

SQL Server に 2 つのテーブルがあります

表1

   ID   - Name  - Phone
   1      HK      999    
   2      RK      888
   3      SK      777
   4      PK      666

表2

   ID   - XMLCol
   1      XMLVal1

XMLVal1

   <Root>
    <Data1>
     <ID>1</ID>
     <Name>HK</Name> 
     </Data1>
    <Data1>
     <ID>2</ID>
     <Name>RK</Name>
     </Data1>
    </Root>

今、GUID 列をTable1に挿入しています。

表1

   ID   - Name  - Phone  - GUID
   1      HK      999      HJHHKHJHJHKJH8788 
   2      RK      888      OONMNy7878HJHJHSD
   3      SK      777      POMSDHBSNB775SD87
   4      PK      666      HRBMASJMN76448NDN

XML 列で、要素名を変更せずに新しい GUID 値でノードTable2を更新したいと考えています。ID

したがって、XMLは次のようになります

   <Root>
    <Data1>
     <ID>HJHHKHJHJHKJH8788</ID>
     <Name>HK</Name> 
     </Data1>
    <Data1>
     <ID>OONMNy7878HJHJHSD</ID>
     <Name>RK</Name>
     </Data1>
    </Root>

これは、 のすべての行で発生しますTable2

これについてのクエリを手伝ってください。

4

3 に答える 3

0

そのうちの1つを更新しました。

閉じますが、葉巻はありません。しかし、それは一日の終わりです。

IF OBJECT_ID('tempdb..#XmlHolderTable') IS NOT NULL
begin
        drop table #XmlHolderTable
end



IF OBJECT_ID('tempdb..#ScalarHolderTable') IS NOT NULL
begin
        drop table #ScalarHolderTable
end



CREATE TABLE #ScalarHolderTable
(
ScalarKey int not null , 
Name varchar(16) , 
Phone varchar(16) , 
UUID uniqueidentifier 
)


CREATE TABLE #XmlHolderTable
(
XmlSurrogateIdentityKey int not null identity (1001, 1), 
TheXml xml
)


INSERT INTO #ScalarHolderTable 
( ScalarKey , Name , Phone , UUID )
            select  1   ,  'HK' ,    999 , NEWID() 
union all   select  2   ,  'RK' ,    888 , NEWID()
union all   select  3   ,  'SK' ,    777 , NEWID()
union all   select  4   ,  'PK' ,    66  , NEWID()


-- Declare XML variable

DECLARE @data XML;

-- Element-centered XML

SET @data = N'


 <Root>
    <Data1>
        <ID>1</ID>
        <Name>HK</Name> 
    </Data1>
    <Data1>
        <ID>2</ID>
        <Name>RK</Name>
    </Data1>
</Root>

';


INSERT INTO #XmlHolderTable ( TheXml) values ( @data )



select TheXml.value('(//Data1/ID)[1]','int') ,  * from #XmlHolderTable


SELECT Data.Col.value('(.)[1]','Int') AS Id
FROM #XmlHolderTable xmlHolder
CROSS APPLY
TheXml.nodes('//Data1/ID') AS Data(Col)

/*
SELECT Data.Col.value('(Id)[1]','Int') AS Id
FROM @Data.nodes('/Root/Data') AS Data(Col)
*/



declare @counter int
select @counter = 0

/*
WHILE ( 
            exists ( select top 1 null
                    From
                        #XmlHolderTable xmlHolder
                    CROSS APPLY
                    TheXml.nodes('//Data1/ID') AS Data(Col) , #ScalarHolderTable scalarHolder
            Where
                ISNUMERIC (     Data.Col.value('(.)[1]','varchar(40)')      ) > 0 

                    )
    )
BEGIN

    select @counter= @counter + 1
    print '/@counter/'
    print @counter
    print ''
*/



UPDATE 
   #XmlHolderTable
SET 
   TheXml.modify('replace value of (//Data1/ID/text())[1] with sql:column("scalarHolder.UUID")') 

--select Data.Col.value('(.)[1]','Int') as MyValue , scalarHolder.ScalarKey

From
    #XmlHolderTable xmlHolder CROSS APPLY TheXml.nodes('//Data1/ID') AS Data(Col) 
    , #ScalarHolderTable scalarHolder
Where
    Data.Col.value('(.)[1]','Int') = scalarHolder.ScalarKey


/*
END
*/



select * from #ScalarHolderTable
select TheXml from #XmlHolderTable




IF OBJECT_ID('tempdb..#XmlHolderTable') IS NOT NULL
begin
        drop table #XmlHolderTable
end



IF OBJECT_ID('tempdb..#ScalarHolderTable') IS NOT NULL
begin
        drop table #ScalarHolderTable
end
于 2013-08-08T20:41:41.233 に答える