sql >> Databáze >  >> RDS >> Sqlserver

Předávání parametru řetězce xml do uložené procedury serveru SQL Server

Definujte svou uloženou proceduru tak, aby převzala parametr typu XML (nepoužívejte ntext už! Je to zastaralé). A nepoužívejte sp_ předpona pro vaše uložené procedury – je to vyhrazená předpona pro interní použití společností Microsoft a způsobuje snížení výkonu – použijte něco jiného! (nebo nepoužívejte vůbec žádnou předponu)

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

Zkuste to (pomocí nativního Metody XQuery v SQL Server 2005 a novější, místo poněkud chaotického OPENXML rozhraní....):

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

Nenašel jsem žádný email atribut ve vašem XML - nejste si jisti, odkud to chcete získat ....

Aktualizace: dobře, takže se zdá, že máte také <last_updated> prvky ve vašem skutečném XML ....

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

Vypadá to jako DATETIMEOFFSET mně - protože má +05:30 přidání časového pásma.

V takovém případě použijte tento kód:

;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. Proč není v PostgreSQL dostupné celé číslo bez znaménka?

  2. Jak nejlépe získat něčí „hodnost“ z tabulky skóre pomocí php a mysql bez zacyklení

  3. Import csv do mysql pomocí příkazového řádku

  4. Jak důležité je pořadí sloupců v indexech?