sql >> Database teknologi >  >> RDS >> Sqlserver

Sender xml-strengparameter til SQL Server-lagret procedure

Definer din lagrede procedure for at tage en parameter af typen XML (brug ikke ntext længere! Det er forældet). Og brug ikke sp__ præfiks for dine lagrede procedurer - det er et reserveret præfiks til intern brug af Microsoft og forårsager ydeevneforringelse - brug noget andet! (eller brug slet ikke noget præfiks)

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

Prøv dette (ved hjælp af native). XQuery-metoder i SQL Server 2005 og nyere i stedet for den ret rodede OPENXML grænseflade....):

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

Jeg fandt ingen e-mail attribut i din XML - ikke sikker på, hvor du vil have det fra ....

Opdatering: ok, så det ser ud til at du også har elementer i dit virkelige XML ....

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

Dette ligner en DATETIMEOFFSET til mig - da den har +05:30 tidszone tilføjelse.

I så fald skal du bruge denne kode i stedet:

;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. Sådan returneres kun Datoen fra en SQL Server DateTime-datatype

  2. Dynamisk SQL LOOP

  3. Kom godt i gang med PostgreSQL 11 på Ubuntu 18.04

  4. Implementering af PostgreSQL på en Docker-container