sql >> Database >  >> RDS >> Sqlserver

XML-tekenreeksparameter doorgeven aan SQL Server opgeslagen procedure

Definieer uw opgeslagen procedure om een ​​parameter van het type XML te nemen (gebruik geen ntext meer! Het is afgekeurd). En gebruik niet de sp_ voorvoegsel voor uw opgeslagen procedures - het is een gereserveerd voorvoegsel voor intern gebruik door Microsoft en veroorzaakt prestatievermindering - gebruik iets anders! (of gebruik helemaal geen voorvoegsel)

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

Probeer dit (met behulp van de native XQuery-methoden in SQL Server 2005 en nieuwer, in plaats van het nogal rommelige OPENXML interface....):

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

Ik heb geen email gevonden attribuut in uw XML - niet zeker waar u dat vandaan wilt halen ....

Bijwerken: ok, dus je lijkt ook <last_updated> . te hebben elementen in je echte XML ....

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

Dit ziet eruit als een DATETIMEOFFSET voor mij - aangezien het de +05:30 . heeft tijdzone toevoeging.

Gebruik in dat geval deze code:

;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. moet twee sets gegevens retourneren met twee verschillende waar-clausules

  2. MAKETIME() Voorbeelden – MySQL

  3. MySQL - Maak een bestaand veld uniek

  4. Naam van SQL Server-variabele kolommen?