2013-02-28 197 views
2

我将一个xml字符串传递给SQL Server中的存储过程,以便将10000条记录插入到我的表中。在这个时候我调用这个存储过程。想要检查SQL Server表与我正在传递的xml字符串,如果记录存在,我不想插入,如果它是单独记录的新记录必须插入。给出一些解决方案。谢谢。将xml字符串参数传递给SQL Server存储过程

ALTER procedure [dbo].[SP_CMSUSER1] 
     (@xmlString ntext) 
    as 
    begin 

     DECLARE @idoc INT 
     DECLARE @data nvarchar(100) 

     EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlString 

    INSERT INTO dbo.Seg_RecipientsTemp (ContactID,first_name,last_name,company,email,last_updated) 
    SELECT ContactID, 
    first_name, 
    last_name, 
    company, 
    email, 
    last_updated FROM OPENXML(@idoc, 

    '/NewDataSet/ContactData', 6) 

    WITH 

    (ContactID int , 
    first_name nvarchar(50), 
    last_name nvarchar(50), 
    company nvarchar(max), 
    email nvarchar(100), 
    last_updated datetime 



    ) 
    end 

我的XML是:

<NewDataSet> 
    <Table> 
    <ContactID>2</ContactID> 
    <last_name>klklk</last_name> 
    </Table> 
    <Table> 
    <ContactID>4</ContactID> 
    <first_name>k</first_name> 
    <last_name>kk</last_name> 
    <company>k</company> 
    </Table> 
    <Table> 
    <ContactID>6</ContactID> 
    <first_name>naveen</first_name> 
    <last_name /> 
    <company>inno</company> 
    </Table> 
    <Table> 
    <ContactID>7</ContactID> 
    <first_name>sridar</first_name> 
    <last_name /> 
    <company>mahindara</company> 
    </Table> 
    <Table> 
    <ContactID>1</ContactID> 
    <first_name>terst</first_name> 
    </Table> 
    <Table> 
    <ContactID>2</ContactID> 
    <first_name /> 
    <last_name>ask</last_name> 
    <company /> 
    </Table> 
</NewDataSet> 
+3

这将是有益的**看一个示例XML **,并得到你想要从中提取什么解释! – 2013-02-28 06:37:57

+0

我想检查contactid是否存在于sql表中与xml字符串,如果已经存在我不想插入,新记录只需要插入,我需要如果不存在(select * from dbo.Seg_RecipientsTemp where Contact_Id =(this in我需要使用xml conatacid进行检查) – 2013-02-28 06:41:24

+0

您是否想为'dbo.Seg_RecipientsTemp'中不存在的'ContactID'的记录插入数据,但存在于XML数据中?是否要更新'dbo.Seg_RecipientsTemp '对于'XML数据中确实存在的'ContactID'? – 2013-02-28 06:47:31

回答

9

定义存储过程采取型XML的参数(不使用ntext了它的过时!)。并且不要为存储过程使用sp_前缀 - 它是一个保留的前缀,供Microsoft内部使用并导致性能下降 - 使用其他内容! (或不使用任何前缀的话)

ALTER procedure [dbo].InsertCmsUser 
     @xmlString XML 
AS 
    ...... 

试试这个(使用SQL Server中的本地 XQuery的方法和更新,而不是相当混乱OPENXML接口....):

;WITH CTE AS 
(
    SELECT 
     ContactID = XTbl.value('(ContactID)[1]', 'int'), 
     FirstName = XTbl.value('(first_name)[1]', 'varchar(50)'), 
     LastName = XTbl.value('(last_name)[1]', 'varchar(50)'), 
     Company = XTbl.value('(company)[1]', 'varchar(50)') 
    FROM 
     @input.nodes('/NewDataSet/Table') AS XD(XTbl) 
) 
INSERT INTO 
    dbo.Seg_RecipientsTemp (ContactID, first_name, last_name, company, last_updated) 
    SELECT 
     ContactID, 
     FirstName, 
     LastName, 
     Company, 
     GETDATE() 
    FROM 
     CTE 
    WHERE 
     NOT EXISTS (SELECT * FROM dbo.Seg_RecipientsTemp WHERE ContactID = CTE.ContactID) 

我没有找到您的XML任何email属性 - 不知道在哪里,你想从....

Updat E:好了,你似乎也有<last_updated>元素在你的真正 XML ....

<last_updated>2012-09-12T22:59:10.813+05:30</last_updated> 

这看起来像一个DATETIMEOFFSET我 - 因为它具有+05:30时区除。

在这种情况下,使用此代码来代替:

;WITH CTE AS 
(
    SELECT 
     ContactID = XTbl.value('(ContactID)[1]', 'int'), 
     FirstName = XTbl.value('(first_name)[1]', 'varchar(50)'), 
     LastName = XTbl.value('(last_name)[1]', 'varchar(50)'), 
     Company = XTbl.value('(company)[1]', 'varchar(50)'), 
      LastUpdated = XTbl.value('(last_updated)[1]', 'datetimeoffset') 
    FROM 
     @input.nodes('/NewDataSet/Table') AS XD(XTbl) 
) 
INSERT INTO 
    dbo.Seg_RecipientsTemp (ContactID, first_name, last_name, company, last_updated) 
    SELECT 
     ContactID, 
     FirstName, 
     LastName, 
     Company, 
     LastUpdated 
    FROM 
     CTE 
    WHERE 
     NOT EXISTS (SELECT * FROM dbo.Seg_RecipientsTemp WHERE ContactID = CTE.ContactID) 
+0

Thanx为您的response.Sorry电子邮件ID那里我didnot添加在xml为测试目的,我得到了一个错误,我得到了另一个问题转换失败时,从字符串转换datedate从字符串为lastupdated字段,在XML我得到下面的标记 2012 -09-12T22:59:10.813 + 05:30 ..请给出一些解决方案 – 2013-02-28 10:03:30

+0

@ Kamalakannan.M:在您发布的示例中看到这样一个标签会很高兴!请参阅我的更新回复 – 2013-02-28 10:09:56

+0

XML解析:第76442行,字符53,非法xml字符 – 2013-03-06 07:00:04

相关问题