Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用XML字符串更新表中的数据_Sql Server_Xml_Sql Server 2008 - Fatal编程技术网

Sql server 使用XML字符串更新表中的数据

Sql server 使用XML字符串更新表中的数据,sql-server,xml,sql-server-2008,Sql Server,Xml,Sql Server 2008,我有一个包含如下列的表 SiteID(identity\u Col) SiteName POrderID 位置 地址 集群 VenderName 我想使用xml字符串插入/更新/删除此表中的数据。除此列之外,XML字符串还包含一个列viz。行信息。此列将具有“未更改”、“更新”、“新建”、“删除”等值。应根据该值插入、更新和删除表中的行 我的XML字符串如下所示: <NewDataSet> <DataTable> <SiteID>2</

我有一个包含如下列的表

  • SiteID(identity\u Col)
  • SiteName
  • POrderID
  • 位置
  • 地址
  • 集群
  • VenderName
我想使用xml字符串插入/更新/删除此表中的数据。除此列之外,XML字符串还包含一个列viz。行信息。此列将具有“未更改”、“更新”、“新建”、“删除”等值。应根据该值插入、更新和删除表中的行

我的XML字符串如下所示:

<NewDataSet>
  <DataTable>
     <SiteID>2</SiteID>
     <SiteName>NIZAMPURA</SiteName>
     <POrderID>7</POrderID>
     <Location>NIZAMPURA</Location>
     <SiteAddress>Vadodara</SiteAddress>
     <Cluster>002</Cluster>
     <SubVendorName>Test Vender-1</SubVendorName>
     <RowInfo>UNCHANGED</RowInfo>
  </DataTable>
  <DataTable>
     <SiteID>16</SiteID>
     <SiteName>Site-1</SiteName>
     <POrderID>7</POrderID>
     <Location>Alkapuri</Location>
     <SiteAddress>test</SiteAddress>
     <Cluster>Test Cluster</Cluster>
     <SubVendorName>Test Vender12</SubVendorName>
     <RowInfo>UNCHANGED</RowInfo>
  </DataTable>
  <DataTable>
     <SiteID>17</SiteID>
     <SiteName>Site-3</SiteName>
     <POrderID>7</POrderID>
     <Location>Alkapuri123</Location>
     <SiteAddress>test123</SiteAddress>
     <Cluster>Test Cluster123</Cluster>
     <SubVendorName>Test Vender123</SubVendorName>
     <RowInfo>DELETE</RowInfo>
  </DataTable>
</NewDataSet>'
但我不知道如何使用XML更新/删除表中的记录。请引导
我是XML的新手,所以不知道。如果我做了一些幼稚的事情,请原谅。

我强烈建议不要再使用旧的、遗留的
OPENXML
东西了-有了SQL Server中的XML支持,使用内置的XPath/XQuery方法就容易多了

在您的例子中,我将使用CTE(公共表表达式)将XML分解为一个由行和列组成的“内联”表:

DECLARE @input XML = '<NewDataSet>
  <DataTable>
    <SiteID>2</SiteID>
    <SiteName>NIZAMPURA</SiteName>
    <POrderID>7</POrderID>
    <Location>NIZAMPURA</Location>
    <SiteAddress>Vadodara</SiteAddress>
    <Cluster>002</Cluster>
    <SubVendorName>Vender-1</SubVendorName>
    <RowInfo>UPDATE</RowInfo>
  </DataTable>
  <DataTable>
    <SiteName>Site-1</SiteName>
    <POrderID>7</POrderID>
    <Location>Alkapuri</Location>
    <SiteAddress>test</SiteAddress>
    <Cluster>Cluster-1</Cluster>
    <SubVendorName>Test Vender</SubVendorName>
    <RowInfo>NEW</RowInfo>
  </DataTable>
</NewDataSet>'

;WITH XMLData AS
(
    SELECT
        NDS.DT.value('(SiteID)[1]', 'int') AS 'SiteID',
        NDS.DT.value('(SiteName)[1]', 'varchar(50)') AS 'SiteName',
        NDS.DT.value('(POrderID)[1]', 'int') AS 'POrderID',
        NDS.DT.value('(Location)[1]', 'varchar(100)') AS 'Location',
        NDS.DT.value('(SiteAddress)[1]', 'varchar(100)') AS 'SiteAddress',
        NDS.DT.value('(Cluster)[1]', 'varchar(100)') AS 'Cluster',
        NDS.DT.value('(SubVendorName)[1]', 'varchar(100)') AS 'SubVendorName',
        NDS.DT.value('(RowInfo)[1]', 'varchar(20)') AS 'RowInfo'
    FROM 
        @input.nodes('/NewDataSet/DataTable') AS NDS(DT)
)
SELECT *
FROM XMLDATA
现在,若您使用的是SQL Server2008或更高版本,则基本上可以将其和在一条语句中执行
INSERT/UPDATE
相结合

如果您使用的是2005,则需要将此信息存储到存储过程中的临时表/表变量中,或者需要多次执行select;CTE只允许一个命令跟随它

更新:使用此CTE,您可以将其与
合并

;WITH XmlData AS 
(
    SELECT
        NDS.DT.value('(SiteID)[1]', 'int') AS 'SiteID',
        NDS.DT.value('(SiteName)[1]', 'varchar(50)') AS 'SiteName',
        NDS.DT.value('(POrderID)[1]', 'int') AS 'POrderID',
        NDS.DT.value('(Location)[1]', 'varchar(100)') AS 'Location',
        NDS.DT.value('(SiteAddress)[1]', 'varchar(100)') AS 'SiteAddress',
        NDS.DT.value('(Cluster)[1]', 'varchar(100)') AS 'Cluster',
        NDS.DT.value('(SubVendorName)[1]', 'varchar(100)') AS 'SubVendorName',
        NDS.DT.value('(RowInfo)[1]', 'varchar(20)') AS 'RowInfo'
    FROM 
        @input.nodes('/NewDataSet/DataTable') AS NDS(DT)
)
MERGE INTO dbo.SiteTRS t
USING XmlData x ON t.SiteID = x.SiteID
WHEN MATCHED AND x.RowInfo = 'UPDATE'
   THEN 
     UPDATE SET 
        t.SiteName = x.SiteName,
        t.POrderID = x.POrderID,
        t.Location = x.Location,
        t.SiteAddress = x.SiteAddress,
        t.Cluster = x.Cluster,
        t.SubVendorName = x.SubVendorName

WHEN MATCHED AND x.RowInfo = 'DELETE'
   THEN DELETE 

WHEN NOT MATCHED AND x.RowInfo = 'NEW'
   THEN 
      INSERT(SiteID, SiteName, POrderID, Location, SiteAddress, Cluster, SubVendorName)
      VALUES(x.SiteID, x.SiteName, x.POrderID, x.Location, x.SiteAddress, x.Cluster, x.SubVendorName)
;
请参阅更多参考资料:


@marc_s..您提供的合并命令链接在每个块中仅显示两个操作。但我想要全部三个,即插入/更新/删除。更多内容显示了使用简单查询而不是XML插入/更新/删除。你能详细说明你的答案吗?@Chirag Fanse:这些只是样品!当然,您可以有更多的条件来定义insert、update、delete和其他语句。浏览网页,在谷歌上搜索-你会发现大量的信息!我更新了我的答案,粗略地描述了你需要做什么…@marc_s..更新前你的答案中的“NDS.DT.value”是什么?我认为它是“/NewDataSet/DataTable”的别名,正如您所写的“从@input.nodes(“/NewDataSet/DataTable”)作为NDS(DT)”但当我复制粘贴的ans时,它显示错误“找不到列NDS或用户定义函数或聚合函数NDS.DT.VALUE,或名称不明确”@marc_.s..我尝试了很多事情,阅读您的链接,但仍然无法了解如何使用XMLsting编写insert/update/delete命令。你能根据我的数据提供代码吗?@chirag fanse:再次更新了我的答案-按原样打印出所有语句。MERGE语句将为每一行执行其中一个语句,假设
SiteID
是唯一标识每一行的唯一ID(主键)。由于它对源表中的每一行(您的CTE基于XML)执行此操作,因此它知道该命令正在执行的行(以及
SiteID
),这就是为什么您可以只编写
。。。然后删除
如果某个条件匹配-SQL Server将知道从源表中删除哪一行
SiteID  SiteName   POrderID Location   SiteAddress  Cluster    SubVendorName   RowInfo
  2     NIZAMPURA     7     NIZAMPURA  Vadodara     002        Vender-1        UPDATE
 NULL   Site-1        7     Alkapuri   test         Cluster-1  Test Vender     NEW
;WITH XmlData AS 
(
    SELECT
        NDS.DT.value('(SiteID)[1]', 'int') AS 'SiteID',
        NDS.DT.value('(SiteName)[1]', 'varchar(50)') AS 'SiteName',
        NDS.DT.value('(POrderID)[1]', 'int') AS 'POrderID',
        NDS.DT.value('(Location)[1]', 'varchar(100)') AS 'Location',
        NDS.DT.value('(SiteAddress)[1]', 'varchar(100)') AS 'SiteAddress',
        NDS.DT.value('(Cluster)[1]', 'varchar(100)') AS 'Cluster',
        NDS.DT.value('(SubVendorName)[1]', 'varchar(100)') AS 'SubVendorName',
        NDS.DT.value('(RowInfo)[1]', 'varchar(20)') AS 'RowInfo'
    FROM 
        @input.nodes('/NewDataSet/DataTable') AS NDS(DT)
)
MERGE INTO dbo.SiteTRS t
USING XmlData x ON t.SiteID = x.SiteID
WHEN MATCHED AND x.RowInfo = 'UPDATE'
   THEN 
     UPDATE SET 
        t.SiteName = x.SiteName,
        t.POrderID = x.POrderID,
        t.Location = x.Location,
        t.SiteAddress = x.SiteAddress,
        t.Cluster = x.Cluster,
        t.SubVendorName = x.SubVendorName

WHEN MATCHED AND x.RowInfo = 'DELETE'
   THEN DELETE 

WHEN NOT MATCHED AND x.RowInfo = 'NEW'
   THEN 
      INSERT(SiteID, SiteName, POrderID, Location, SiteAddress, Cluster, SubVendorName)
      VALUES(x.SiteID, x.SiteName, x.POrderID, x.Location, x.SiteAddress, x.Cluster, x.SubVendorName)
;