2012-07-04 5 views
3

SQL Server로 가져 오기 XML 파일을 가져 오려고합니다. 일단 빈 테이블을 준비하면 전체 XML 파일을로드하고 해당 테이블을 채 웁니다. 아주 작은XML 파일을 SQL Server로 가져 오는 것이 너무 느립니다.

INSERT INTO Products (sku, product_desc) 
SELECT X.product.query('SKU').value('.', 'INT'), 
     X.product.query('Desc').value('.', 'VARCHAR(30)') 
FROM (
SELECT CAST(x AS XML) 
FROM OPENROWSET(
    BULK 'C:\Products.xml', 
    SINGLE_BLOB) AS T(x) 
    ) AS T(x) 
CROSS APPLY x.nodes('Products/Product') AS X(product); 

내 XML 파일 (30킬로바이트), 약 1860 노드를 계산하지만, 위의 절차 가져올 5 분 이상 소요 : 잘 실행 다음 코드를 테스트 그래서 나는 SQL 대량 삽입이 적합하다는 것을 발견 인터넷 검색 전체 파일. 이 과정을 시작할 기회가 있습니까? 또한 SQL Server 2008에는 대량 개체에 영향을주는 버그가 있음을 읽었습니다. 힌트가 있습니까?

+0

당신은 C# 또는 다른 언어로 XML을 구문 분석하고 응용 프로그램을 통해 그것을 가져 오는 것이 더 낫다보십시오. – Oded

+0

네가 맞다. 첫 번째 시도는 C#을 사용하여 XML을 가져 오는 것이었지만 SQL Server의 대량 프로 시저가 더 안정적이라고 생각했습니다. – Ras

+0

XML과 관계형 데이터베이스는 일반적으로 적합하지 않습니다. – Oded

답변

7

하면이 시도하지 - 난 그냥 53초에 디스크에서 4'096 레코드 파일을 수입 (일반 평균 데스크탑 컴퓨터에 - 더 높은 반환 한 서버)에

-- declare XML variable 
DECLARE @InputXML XML 

-- import file from disk 
SELECT @InputXML = CAST(x AS XML) 
FROM OPENROWSET(BULK 'D:\temp\Products.xml', SINGLE_BLOB) AS T(x) 

-- parse XML using XQuery and insert into the table  
INSERT INTO dbo.Products (sku, product_desc) 
    SELECT 
     product.value('(SKU)[1]', 'int'), 
     product.value('(Desc)[1]', 'varchar(30)') 
    FROM @InputXML.nodes('Products/Product') AS X(product) 
+0

매력처럼 작동합니다, 감사합니다! – Ras

+1

5MB XML 파일의 경우 8 시간에서 2 초까지입니다. 고맙습니다! –

2
declare @xml table (x xml) 
-- 
insert @xml 
select x 
FROM OPENROWSET(BULK 'D:\temp\Products.xml', SINGLE_BLOB) AS T(x) 

INSERT INTO dbo.Products (sku, product_desc) 
SELECT 
    RESULT.sku, RESULT.product_desc 
FROM @xml 
cross apply (
    select sku = z.value('SKU[1]', 'int'), 
      product_desc = z.value('Desc[1]','varchar(30)') 
    from x.nodes('Products/Product') Z1(z) 
) RESULT 

13000 기록 2 초 SQL Server 2008 R2. 데이터베이스 Compability가 100

또한, 데이터베이스 Compability가 90

관련 문제