2010-10-12 58 views
2

我有存儲在XML列在一個表中的SQL Server的一些XML數據2005年的SqlServer中查詢在XML列不同的數據2005

記錄1將具有該列中的數據是這樣的:

<ArrayOfThings xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SomeCompany"> 
    <Things> 
    <Thing> 
     <Name>Monkey</Name> 
    </Thing> 
    <Thing> 
     <Name>Lion</Name> 
    </Thing> 
    <Thing> 
     <Name>Shoe</Name> 
    </Thing> 
    </Things> 
</ArrayOfThings> 

記錄2可能有這樣的數據,該列

<ArrayOfThings xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SomeCompany"> 
    <Things> 
    <Thing> 
     <Name>Monkey</Name> 
    </Thing> 
    <Thing> 
     <Name>Elephant</Name> 
    </Thing> 
    <Thing> 
     <Name>Hammer</Name> 
    </Thing> 
    <Thing> 
     <Name>Bucket</Name> 
    </Thing> 
    </Things> 
</ArrayOfThings> 

誰能幫我用什麼語法會想從該表中選擇不同的東西。

返回的結果是這樣的: 猴子 獅子 擦鞋 大象 錘 桶

顯然這不是生產數據:)

安裝腳本:

CREATE TABLE [SomeSchema].[MyTable](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [ThingData] [xml] NULL, 
CONSTRAINT [PK_Party] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
) 
) ON [PRIMARY] 
GO 

INSERT INTO [SomeSchema].[MyTable] 
      ([ThingData]) 
    VALUES 
      ( 
'<ArrayOfThings xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SomeCompany"> 
    <Things> 
    <Thing> 
     <Name>Monkey</Name> 
    </Thing> 
    <Thing> 
     <Name>Lion</Name> 
    </Thing> 
    <Thing> 
     <Name>Shoe</Name> 
    </Thing> 
    </Things> 
</ArrayOfThings> 
') 
GO 

INSERT INTO [SomeSchema].[MyTable] 
      ([ThingData]) 
    VALUES 
      (
'<ArrayOfThings xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SomeCompany"> 
    <Things> 
    <Thing> 
     <Name>Monkey</Name> 
    </Thing> 
    <Thing> 
     <Name>Elephant</Name> 
    </Thing> 
    <Thing> 
     <Name>Hammer</Name> 
    </Thing> 
    <Thing> 
     <Name>Bucket</Name> 
    </Thing> 
    </Things> 
</ArrayOfThings> 
') 
GO 

並且該選擇將違反表

0123中的列
+0

你希望他們在同一行? – 2010-10-12 14:23:53

+0

不,只是結果集中的那些值 – adev 2010-10-12 21:17:24

回答

1

create table #t1(id int not null identity(1,1),ThingData xml)

insert #t1(ThingData) values ( '<ArrayOfThings xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SomeCompany"> <Things> <Thing> <Name>Monkey</Name> </Thing> <Thing> <Name>Lion</Name> </Thing> <Thing> <Name>Shoe</Name> </Thing> </Things></ArrayOfThings>')

insert #t1(ThingData) values ( '<ArrayOfThings xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SomeCompany"> <Things> <Thing> <Name>Monkey</Name> </Thing> <Thing> <Name>Elephant</Name> </Thing> <Thing> <Name>Hammer</Name> </Thing> <Thing> <Name>Bucket</Name> </Thing> </Things></ArrayOfThings>')

;WITH XMLNAMESPACES('http://schemas.datacontract.org/2004/07/SomeCompany' AS ns) select DISTINCT Array.Things.value('(ns:Name)[1]', 'varchar(50)') from #t1 cross apply #t1.[ThingData].nodes('/ns:ArrayOfThings/ns:Things/ns:Thing') as Array(Things)

+0

我在這裏使用了一個臨時表,但我希望你明白。好藝術家複製,偉大的藝術家竊取。 – JoshRoss 2010-10-12 22:37:34

1

你也可以很容易地使用SQL Server 2005內置的XQuery語言,而不是笨重的OPENXML的東西,很容易獲得相同的結果:

DECLARE @input XML 
SET @input = '<ArrayOfThings xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SomeCompany"> 
    <Things> 
    <Thing> 
     <Name>Monkey</Name> 
    </Thing> 
    <Thing> 
     <Name>Elephant</Name> 
    </Thing> 
    <Thing> 
     <Name>Hammer</Name> 
    </Thing> 
    <Thing> 
     <Name>Bucket</Name> 
    </Thing> 
    </Things> 
</ArrayOfThings>' 

;WITH XMLNAMESPACES('http://schemas.datacontract.org/2004/07/SomeCompany' AS ns) 
SELECT 
    DISTINCT Array.Things.value('(ns:Name)[1]', 'varchar(50)') 
FROM 
    @input.nodes('/ns:ArrayOfThings/ns:Things/ns:Thing') AS Array(Things) 

基本上,你創建一個「僞表」之稱Array.Things對於指定類型的每個條目都包含一個「行」 - 這裏給出了結構中的<Thing>

然後,您可以觸及這些「行」並獲取各個元素,這裏是<Name>的值,您可以選擇這些元素並使用它們。

+0

Lion and Shoe在哪裏? – 2010-10-12 07:39:25

+0

@ vgv8:在輸入XML中,它們顯然是** NOT **,如OP所示(作爲記錄#2)所示...如果它們不在那裏,則無法檢索它們。 ..就這麼簡單..... – 2010-10-12 16:38:16

+0

我將它轉換爲使用我的示例中的表SELECT @input =來自[System]的thingdata。[mytable];它只返回來自第一條記錄的數據,並不考慮後續行中的數據。 – adev 2010-10-12 21:55:33

0

如果使用

安裝腳本:
CREATE TA 。BLE [SomeSchema] [MyTable的(....

從問題,那麼:

WITH XMLNAMESPACES('http://schemas.datacontract.org/2004/07/SomeCompany' AS ns) 
select DISTINCT Array.Things.value('(ns:Name)[1]', 'varchar(50)') Name 
FROM [SomeSchema].[MyTable] MT 
CROSS APPLY 
MT.ThingData.nodes('/ns:ArrayOfThings/ns:Things/ns:Thing') 
AS Array(Things)