Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Предаване на параметър на xml низ към съхранената процедура на SQL Server

Дефинирайте вашата съхранена процедура, за да приемете параметър от тип 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)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Възстановете база данни в SQL Server 2017

  2. Разбиране на размера на съхранението „datetimeoffset“ в SQL Server

  3. Как да видите регистрационните файлове на транзакциите в SQL Server 2008

  4. SELECT заявка с условие CASE и SUM()

  5. Последователност като стойност по подразбиране за колона