使用xml作为输入的存储过程插入数据不存在时

时间:2014-05-14 06:16:06

标签: xml stored-procedures sql-server-2008-r2

我有xml作为输入传递给批量插入的存储过程。我的xml如下,

NewDataSet>
- <Table1>
  <StationId>1</StationId> 
  <DateOfEvent>2013-11-15</DateOfEvent> 
  <Year>2013</Year> 
  <WeekOfYear>46</WeekOfYear> 
  <MonthOfYear>11</MonthOfYear> 
  <ItemType>CATEGORY</ItemType> 
  <ItemName>10234</ItemName> 
  <Clicks>1</Clicks> 
  <SiteName>sandvikas</SiteName> 
  </Table1>

我编写了一个存储过程,如下所示,

ALTER PROCEDURE [dbo].[InsertQuestion]
    (

        @XmlQuestionMeasurements xml

    )
AS
BEGIN


    DECLARE @docHandle int

    EXEC sp_xml_preparedocument @docHandle OUTPUT, @XmlQuestionMeasurements

    --insert data in to EP_QuestionMeasurement table
    Insert into Analytics(StationId,DateOfEvent,Year,WeekOfYear,MonthOfYear,ItemType,ItemName,Clicks,SiteName)
    SELECT StationId,DateOfEvent,Year,WeekOfYear,MonthOfYear,ItemType,ItemName,Clicks,SiteName
    FROM Openxml( @docHandle, '/NewDataSet/Table1', 2) 
    WITH ( StationId int,DateOfEvent date,  Year int ,WeekOfYear int,MonthOfYear int, ItemType VARCHAR(50),ItemName VARCHAR(50),Clicks int,SiteName VARCHAR(50)  ) 

END

它的插入效果很好。现在我的问题是如何修改存储过程以防止插入,如果再次传递相同的xml集,要检查是否存在相同的数据,然后阻止插入。 需要检查条件,如果此项目名称在此日期中存在,则无法插入。

此致

1 个答案:

答案 0 :(得分:0)

您可以执行MERGE - 如果数据尚未存在则会插入,如果数据存在则会更新。

如果这不适合你,你也可以尝试从XML插入临时表,然后从临时表插入到分析where tempTable.ItemName NOT IN(SELECT ItemName FROM Analytics)(假设我正确理解你{{1} }对于所有分析而言将是独特的)