2012-01-15 85 views
4

在下面的表格:SQL Server 2008中的發現和XML列替換元素

CREATE TABLE [dbo].[GDB_ITEMS](
    [ObjectID] [int] NOT NULL, 
    [UUID] [uniqueidentifier] NOT NULL, 
    [Type] [uniqueidentifier] NOT NULL, 
    [Name] [nvarchar](226) NULL, 
    [PhysicalName] [nvarchar](226) NULL, 
    [Path] [nvarchar](512) NULL, 
    [Url] [nvarchar](255) NULL, 
    [Properties] [int] NULL, 
    [Defaults] [varbinary](max) NULL, 
    [DatasetSubtype1] [int] NULL, 
    [DatasetSubtype2] [int] NULL, 
    [DatasetInfo1] [nvarchar](255) NULL, 
    [DatasetInfo2] [nvarchar](255) NULL, 
    [Definition] [xml] NULL, 
    [Documentation] [xml] NULL, 
    [ItemInfo] [xml] NULL, 
    [Shape] [geometry] NULL, 
CONSTRAINT [R2_pk] PRIMARY KEY CLUSTERED 
(
    [ObjectID] ASC 
) 

ALTER TABLE [dbo].[GDB_ITEMS] WITH CHECK ADD CONSTRAINT [g1_ck] CHECK (([Shape].[STSrid]=(4326))) 
GO 

[Documentation]列包含幾百個XML的項目和元素。我想弄清楚到,與T-SQL,更換一個系列的元素:

<NPS_Info> 
    <MetaPurp>NPS</MetaPurp> 
    <NPS_Unit> 
     <UnitCode>MANDATORY for Data Store: NPS Alpha Unit Code (ACAD)</UnitCode> 
     <UnitType>MANDATORY for Data Store: NPS Unit Type (National Park, National Monument, etc)</UnitType> 
    </NPS_Unit> 
    </NPS_Info> 

有了這個:

<NPS_Info> 
    <MetaPurp>NPS</MetaPurp> 
    <MetaPurp>CSDGM</MetaPurp> 
    <MetaPurp>OnlineData</MetaPurp> 
    <NPS_Unit> 
    <UnitCode>ABCD</UnitCode> 
    <UnitType>Park</UnitType> 
    </NPS_Unit> 
    <DatStore> 
    <Category>Landscape</Category> 
    <Category>Monitoring</Category> 
    <Category>Resource Management</Category> 
    <DSteward> 
     <cntinfo> 
     <cntperp> 
      <cntper>Something</cntper> 
     </cntperp> 
     <cntaddr> 
      <addrtype>mailing and physical</addrtype> 
      <address>1 Smith Lane</address> 
      <address></address> 
      <city>Anywhere</city> 
      <state>ST</state> 
      <postal>12345</postal> 
     </cntaddr> 
     <cntemail>[email protected]</cntemail> 
     </cntinfo> 
    </DSteward> 
    </DatStore> 
</NPS_Info> 

請原諒我的笨拙切N」粘貼。這個表中有幾千行,但並不是所有的都有第一個代碼塊中描述的xml元素(這是一個全局表,它包含DB中所有表的描述,一些[Documentation]記錄將包含非 - 相關的xml對此操作不感興趣)。

回答

3

您可以使用XML Data Modification Language (XML DML)

此代碼將更改名爲NPS_Info與可變@XML的內容第一節點的內容。

-- Delete everything in node NPS_Info 
update YourTable 
set XMLCol.modify('delete //NPS_Info[1]/*') 

-- Insert @XML to node NPS_Info 
update YourTable 
set XMLCol.modify('insert sql:variable("@XML") into (//NPS_Info)[1]') 

工作樣品上SE Data

+0

嘿感謝!當我嘗試該代碼塊時,首先使用:dbname declare @T dbo.gdb_items(Documentation xml)我收到以下內容:Msg 102,Level 15,State 1,Line 5 'Documentation'附近的語法不正確。 Msg 1087,Level 15,State 2,Line 7 必須聲明表變量「@T」。 消息1087,級別15,狀態2,行54 必須聲明表變量「@T」。 Msg 1087,Level 15,State 2,Line 57 必須聲明表變量「@T」。 Msg 1087,Level 15,State 2,Line 61 必須聲明表變量「@T」我必須丟失一些非常明顯的東西 – tpcolson 2012-01-15 20:02:06

+1

沒關係....真的很明顯。我看到你在SE做了什麼,並改變了在非臨時環境中工作。謝謝一堆! – tpcolson 2012-01-15 20:08:02