1

OpenXML:

DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc =
'<ROOT>
        <Employee EmployeeID = "1"  EmpStatus = "Full Time"/>
        <Employee EmployeeID = "2"  EmpStatus ="Part Time" />
        </ROOT>'
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
SELECT    *
FROM       OPENXML (@idoc, '/ROOT/Employee',1)
            WITH (EmployeeID  varchar(10),
                  EmpStatus varchar(20))

結果:

EmployeeID    EmpStatus
    1         Full Time
    2         Part Time

テーブルクエリ:

    SELECT hr.EmployeeID, hr.Title, c.FirstName,c.LastName 
    FROM HumanResources.Employee hr WITH (NOLOCK)
    INNER JOIN ContactInfo c WITH (NOLOCK)
    ON hr.ContactID = c.ContactID
    Where hr. EmployeeID IN ( 1, 2)

結果:

EmployeeID  Title         FirstName  LastName
    1   Engineering   Mike       Brown
    2   Programmer    Yves       Anthony

を使用してOpenXMLデータを内部結合クエリに結合するにはどうすればよいEmployeeIDですか?

4

2 に答える 2

1

OpenXMLの使用を主張しますか?それは古く、レガシーです-ネイティブXQuery関数を使用することは通常はるかに簡単です。

次のようなものを試してください。

DECLARE @Employees TABLE (EmployeeID INT, Title VARCHAR(20), FirstName VARCHAR(20),LastName VARCHAR(20))

INSERT INTO @Employees VALUES(1, 'Engineering', 'Mike', 'Brown')
INSERT INTO @Employees VALUES(2, 'Programmer', 'Yves', 'Anthony')

DECLARE @doc XML 
SET @doc = '<ROOT>
              <Employee EmployeeID = "1"  EmpStatus = "Full Time"/>
              <Employee EmployeeID = "2"  EmpStatus ="Part Time" />
            </ROOT>'

;WITH XmlCTE AS
(
    SELECT
        EmpID = Empl.value('@EmployeeID', 'int'),
        EmpStatus = Empl.value('@EmpStatus', 'varchar(10)')
    FROM @doc.nodes('/ROOT/Employee') AS Tbl(Empl)
)
SELECT 
    e.*, x.EmpStatus 
FROM 
    @Employees e
INNER JOIN  
    xmlcte x ON e.EmployeeID = x.EmpID

これにより、次の出力が得られます。

ここに画像の説明を入力してください

于 2012-10-10T19:49:41.820 に答える
0

openxml証拠を見つけることができず、とにかくそれを行う方法に対処することを気にしないという点で、非推奨のレベルを暗示する他の答えにもかかわらず...あなたは同時に使用することができます。openxmljoin

あなたの場合、それは次のようになります:

select
    x.*,
    hr.EmployeeID, hr.Title, c.FirstName, c.LastName 
from
    openxml (@IDoc, '/ROOT/Employee',1)
    with (
        EmployeeID  varchar(10),
        EmpStatus   varchar(20)
    ) as x
    inner join HumanResources.Employee hr with (nolock) on
        x.EmployeeID = hr.EmployeeID
    inner join Contactinfo c with (nolock)
        on hr.ContactID = c.ContactID;

h / t:http ://www.informit.com/articles/article.aspx?p=26499&seqNum=3

于 2016-11-01T11:02:44.297 に答える