Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Melewati parameter string xml ke prosedur tersimpan SQL Server

Tentukan prosedur tersimpan Anda untuk mengambil parameter tipe XML (jangan gunakan ntext lagi! Itu sudah usang). Dan jangan gunakan sp_ awalan untuk prosedur tersimpan Anda - ini adalah awalan yang dicadangkan untuk penggunaan internal oleh Microsoft dan menyebabkan penurunan kinerja - gunakan yang lain! (atau tidak menggunakan awalan sama sekali)

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

Coba ini (menggunakan asli Metode XQuery di SQL Server 2005 dan yang lebih baru, sebagai ganti OPENXML yang agak berantakan antarmuka....):

;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)

Saya tidak menemukan email atribut dalam XML Anda - tidak yakin dari mana Anda ingin mendapatkannya ....

Pembaruan: ok, jadi sepertinya Anda juga memiliki <last_updated> elemen di nyata . Anda XML ....

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

Ini terlihat seperti DATETIMEOFFSET untuk saya - karena memiliki +05:30 penambahan zona waktu.

Dalam hal ini, gunakan kode ini sebagai gantinya:

;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. Len() vs panjang data() di SQL Server 2005

  2. Gagal memperbarui database .mdf karena database hanya-baca (aplikasi Windows)

  3. Bagaimana Stuff dan 'For Xml Path' bekerja di SQL Server?

  4. Pemeriksaan Cadangan SQL Server

  5. Buat Pekerjaan Agen Server SQL di Azure Data Studio