2013-02-28 4 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 ** и получить объяснение того, что вы хотите, чтобы извлечь из него! –

+0

Я хочу проверить, существует ли contactid в таблице sql с xml-строкой, если он уже существует, я не хочу вставлять, новая запись должна быть вставлена, мне нужно, если не существует (выберите * из dbo.Seg_RecipientsTemp где Contact_Id = (в этом мне нужно проверить с помощью xml conatacid) –

+0

Вы хотите ВСТАВИТЬ записи для 'ContactID', которые не существуют в' dbo.Seg_RecipientsTemp', но существуют в XML-данных? Вы хотите ОБНОВИТЬ данные в 'dbo.Seg_RecipientsTemp 'для' ContactID', которые существуют в XML-данных? –

ответ

9

Определить хранимую процедуру, чтобы принять параметр типа XML (не используйте ntext больше Это не рекомендуется!). И не используйте префикс sp_ для ваших хранимых процедур - это зарезервированный префикс для внутреннего использования Microsoft и приводит к ухудшению производительности - используйте что-то еще! (Или не использовать какой-либо префикс вообще)

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

Попробуйте это (используя родные методы XQuery в SQL Server 2005 и новее, а довольно грязный 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) 

я не нашел email атрибут в вашем XML - не знаете, где вы хотите, чтобы получить это от ....

Обновит е: нормально, так что вы, кажется, также <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 для вашего ответа. Искренний идентификатор электронной почты там, где я не добавил в xml для цели тестирования, я получил ошибку, я получил еще одну проблему. Ошибка преобразования при преобразовании datetime из символьной строки для lastupdated поля ,, в xml i ниже тега 2012 -09-12T22: 59: 10.813 + 05: 30 ..please дать некоторое решение –

+0

@ Kamalakannan.M: было бы неплохо увидеть такой тег '' в ответе, который вы отправили! См. Мой обновленный ответ –

+0

Анализ XML: строка 76442, символ 53, незаконный символ xml –

Смежные вопросы