Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Truyền tham số chuỗi xml vào thủ tục được lưu trữ trên SQL Server

Xác định thủ tục được lưu trữ của bạn để nhận tham số kiểu XML (không sử dụng ntext nữa không! Nó không được dùng nữa). Và không sử dụng sp_ tiền tố cho các thủ tục được lưu trữ của bạn - đó là tiền tố dành riêng cho Microsoft sử dụng nội bộ và gây suy giảm hiệu suất - hãy sử dụng thứ khác! (hoặc hoàn toàn không sử dụng bất kỳ tiền tố nào)

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

Hãy thử điều này (sử dụng bản địa Các phương thức XQuery trong SQL Server 2005 và mới hơn, thay vì OPENXML khá lộn xộn giao diện ....):

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

Tôi không tìm thấy bất kỳ email trong XML của bạn - không chắc bạn muốn lấy thuộc tính đó từ đâu ....

Cập nhật: được rồi, vì vậy bạn dường như cũng có <last_updated> các yếu tố trong thực của bạn XML ....

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

Điều này trông giống như một DATETIMEOFFSET đối với tôi - vì nó có +05:30 bổ sung múi giờ.

Trong trường hợp đó, hãy sử dụng mã này thay thế:

;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 2008:Làm cách nào để cấp đặc quyền cho tên người dùng?

  2. Ví dụ về Chuyển đổi ‘smalldatetime’ thành ‘datetime’ trong SQL Server (T-SQL)

  3. Làm cách nào để chuyển đổi tích tắc sang định dạng ngày tháng?

  4. chèn số lượng lớn pyodbc cơ bản

  5. UNION ALL có đảm bảo thứ tự của tập kết quả không