0

複数のテーブルに挿入したい、つまりCustomer, Account, AccountTransactions

編集

  • Entity - Customer1対1
  • Customer - Account1 対 1 としてマッピングされます
  • Account - AccountTransactions1 対多としてマッピングされます

Entity(EntityId, EntityType)EntityId 主キー 自動インクリメント

Customer(CustomerId, FName, LName) CustomerId = EntityId 主キー

Account(AccountId, AccountNo, CustomerId) AccountId PK、CustomerId FK

AccountTransactions(TransactionId, PaymentDate, CurrentBalance, AccountId)TransactionId PK、AccountId FK

私のXMLは次のとおりです。

<CustomerList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
       <Customer>
              <CustomerId/>
              <CustomerName>Abhishek</CustomerName>
              <AccountId/>
              <AccountNumber>eba5d378-b</AccountNumber>
              <Transactions>
                     <Transaction>
                <TransactionId/>
                            <PaymentDate>2/2/2012</PaymentDate>
                            <Amount>500</Amount>
                     </Transaction>
                     <Transaction>
                <TransactionId/>
                            <PaymentDate>2/2/2012</PaymentDate>
                            <Amount>500</Amount>
                     </Transaction>
              </Transactions>
          </Customer>
       <Customer>
              <CustomerId/>
              <CustomerName>Yash</CustomerName>
              <AccountId/>
              <AccountNumber>A101202</AccountNumber>
              <Transactions>
                     <Transaction>
                <TransactionId/>
                            <PaymentDate>2/2/2012</PaymentDate>
                            <Amount>500</Amount>
                     </Transaction>
                     <Transaction>
                <TransactionId/>
                            <PaymentDate>2/2/2012</PaymentDate>
                            <Amount>500</Amount>
                     </Transaction>
              </Transactions>
       </Customer>
</CustomerList>

xml の各顧客のテーブルに挿入したいのですがCustomer, Account, Transaction、顧客への挿入時にその ID を xml に保存Accountし、外部キーとしてテーブルでも使用する必要があります

唯一の方法は、ネストされたカーソルまたはネストされた while ループを使用することです。より良い方法はありますか?

4

2 に答える 2

2

適切なテーブルが配置されていると仮定すると、厄介なカーソルがなくても、反復的なアプローチを確実に実行できます。

このようなことを試してください-これは今のところ顧客とアカウントを処理しますが、これをトランザクションにも確実に拡張できます。

declare @input XML = '... your XML here .....';

CREATE TABLE #CustAcct (CustomerName VARCHAR(50), CustomerID INT, AcctNumber VARCHAR(50), AcctID INT);

-- first extract customer and account into from the XML, using a common table expression    
WITH CustomersAndAccounts AS
(
   SELECT
       CustomerName = CL.Cust.value('(CustomerName)[1]', 'varchar(50)'),
       AcctNumber = CL.Cust.value('(AccountNumber)[1]', 'varchar(50)')
   FROM 
       @input.nodes('/CustomerList/Customer') CL(Cust)
)
INSERT INTO #CustAcct(CustomerName, AcctNumber)
    SELECT CustomerName, AcctNUmber
    FROM CustomersAndAccounts

-- insert customers into 'Customer' table    
INSERT INTO Customer(CustomerName)
    SELECT CustomerName
    FROM #CustAcct

-- update the temporary working table with the appropriate ID's from the 'Customer' table    
UPDATE #CustAcct
SET CustomerID = c.CustomerID
FROM Customer c
WHERE #CustAcct.CustomerName = c.CustomerName

-- insert values into 'Account' table from the working table   
INSERT INTO Account(CustomerID, AccountNumber)
    SELECT CustomerID, AcctNumber
    FROM #CustAcct

-- update the working table from the values inserted
UPDATE #CustAcct
SET AcctID = a.AccountID
FROM Account a
WHERE #CustAcct.CustomerID = a.CustomerID AND #CustAcct.AcctNumber = a.AccountNumber

SELECT * FROM #CustAcct

次のステップでは、顧客とアカウントのペアごとにトランザクションを解析し、それらを適切なテーブルに挿入できます。

于 2012-09-13T20:13:56.700 に答える
0

SQLXML Bulkload コンポーネントを使用してこれを行うこともできます。

XML Bulk Load コンポーネントを使用して XML を SQL Server にインポートする方法
http://support.microsoft.com/kb/316005

于 2012-09-13T23:12:17.157 に答える