sql >> データベース >  >> RDS >> Sqlserver

xml文字列パラメータをSQLServerストアドプロシージャに渡す

    タイプXMLのパラメータを取るようにストアドプロシージャを定義します (ntextは使用しないでください もう!非推奨です)。また、sp_は使用しないでください ストアドプロシージャのプレフィックス-これはMicrosoftによる内部使用のために予約されたプレフィックスであり、パフォーマンスの低下を引き起こします-他のものを使用してください! (またはプレフィックスをまったく使用しないでください)

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

    これを試してください(ネイティブを使用) SQLServerのXQueryメソッド2005 かなり厄介なOPENXMLの代わりに、より新しい インターフェイス....):

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

    emailが見つかりませんでした XMLの属性-どこから取得したいかわからない....

    更新: わかりました。<last_updated>もあるようです。 実際のの要素 XML ....

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

    これはDATETIMEOFFSETのように見えます 私にとって-+05:30があるので タイムゾーンの追加。

    その場合は、代わりに次のコードを使用してください:

    ;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. MSSQLServerに接続する際のRODBC一時テーブルの問題

    2. 非常に大きなテーブルでの(列ストア)圧縮の楽しみ–パート3

    3. 2つの日付の間の金曜日の数

    4. Oracleでnull値の列を合計する