2013-02-28 133 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

相關問題