2012-02-28 6 views
0

나는 SQL 서버에 XML 파일을 삽입 도움이 필요 2008 년삽입 XML 문서 2008 데이터베이스

나는 다음과 같은 SQL 문이 : 기본적으로 컬럼에있는 XML 문서를 갈가리 찢는

insert into dbo.articles(id, title, contents) 
    SELECT X.article.query('id').value('.', 'INT'), 
     X.article.query('article').value('.', 'VARCHAR(50)'), 
     X.article.query('/doc/text()').value('.', 'VARCHAR(MAX)') 
    FROM (
    SELECT CAST(x AS XML) 
    FROM OPENROWSET(
      BULK 'E:\test\test_files\1000006.xml', 
      SINGLE_BLOB) AS T(x) 
     ) AS T(x) 
CROSS APPLY x.nodes('doc') AS X(article); 

합니다. 그러나 폴더에있는 모든 파일을 삽입 할 수 있고이 경우 E : \ test \ test_files \ 1000006.xml 파일을 수동으로 지정하지 못하도록하고 싶습니다.

답변

0

저장 프로 시저를 사용하고 있습니까? 파일 이름을 매개 변수로 지정할 수 있습니다.

뭔가 같은 ...

CREATE PROCEDURE sp_XMLLoad 
    @FileName 
AS SET NOCOUNT ON 
SELECT X.article.query('id').value('.', 'INT'), 
     X.article.query('article').value('.', 'VARCHAR(50)'), 
     X.article.query('/doc/text()').value('.', 'VARCHAR(MAX)') 
FROM (
     SELECT CAST(x AS XML) 
     FROM OPENROWSET(
      BULK @FileName, 
      SINGLE_BLOB) AS T(x) 

아니 정확히 같은 ... 당신은 내가 내기 @filename 주위에 따옴표를 추가해야합니다. 어쩌면 따옴표로 묶은 다음 그 변수를 사용하십시오.

SSIS를 사용하는 경우 디렉터리의 모든 파일을 저장 프로 시저 또는 사용되는 SSIS 코드로 펌핑 할 수 있습니다.

+0

그럼이 절차는 어디에서 파일을 가져 옵니까? java 또는 다른 것이 아닌 SQL Server를 사용하여 코드를 실행하려고합니다. –

+0

RealUlysee는 파일 이름을 가져올 것을 제안했지만 SSIS를 사용하고 Foreach 루프 컨테이너를 사용하는 것이 좋습니다. 거기에서 폴더를 지정하고이를 저장된 proc의 입력으로 사용할 수 있습니다 (또는 SQL 코드를 SSIS에 그대로 저장) – thursdaysgeek

0

커서 및 xp_cmdshell을 사용하여이 작업을 수행 할 수 있다고 생각합니다. xp_cmdshell을 사용하는 것을 권장하지는 않습니다.

DECLARE @FilesInAFolder TABLE (FileNames VARCHAR(500)) 
DECLARE @File VARCHAR(500) 
INSERT INTO @FilesInAFolder 
EXEC MASTER..xp_cmdshell 'dir /b c:\' 


DECLARE CU CURSOR FOR 
SELECT 'c:\' + FileNames 
FROM @FilesInAFolder 
WHERE RIGHT(FileNames,4) = '.xml' 

OPEN CU 
FETCH NEXT FROM CU INTO @File 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    INSERT INTO dbo.articles(id, title, contents) 
    SELECT X.article.query('id').value('.', 'INT'), 
      X.article.query('article').value('.', 'VARCHAR(50)'), 
      X.article.query('/doc/text()').value('.', 'VARCHAR(MAX)') 
    FROM (
      SELECT CAST(x AS XML) 
      FROM OPENROWSET(
        BULK @File, 
        SINGLE_BLOB) AS T(x) 
     ) AS T(x) 
    CROSS APPLY x.nodes('doc') AS X(article); 

    FETCH NEXT FROM CU INTO @File 
END 

CLOSE CU 
DEALLOCATE CU 
1
유래의 질문에 대답에서

좋아, 첫 번째 균열 ...

당신은 두 가지 문제가 있습니다 - 먼저 SQL 테이블 또는 테이블 변수로 폴더에서 파일 이름을 받고, 다음 XML을 읽는 각각에서. 당신이 대량 INSERT 당신을 매개 변수를 가지고하지 않기 때문에 조금 까다은 SQL 행에 XML 파일입니다 변환,

DECLARE @Folder   VARCHAR(255) = 'C:\temp\*.xml' 
DECLARE @Command  VARCHAR(255) 
DECLARE @FilesInAFolder TABLE (XMLFileName VARCHAR(500)) 

-- 
SET @Command = 'DIR ' + @Folder + ' /TC /b' 
-- 
INSERT INTO @FilesInAFolder 
EXEC MASTER..xp_cmdshell @Command 
-- 
SELECT * FROM @FilesInAFolder 
WHERE XMLFileName IS NOT NULL 

두 번째 부분을 xp_cmdshell을 사용하여 괜찮다면

첫 번째는 쉽다 XML 표 유형으로 BULK INSERT를 수행 할 수 없습니다. 다음은 하나의 파일에서 작동하는 코드입니다 ...

DECLARE @x    xml 
DECLARE @Results  TABLE (result xml) 
DECLARE @xmlFileName NVARCHAR(300) = 'C:\temp\YourXMLFile.xml' 
DECLARE @TempTable  TABLE 
    (
    ID     INT,   
    Article    NVARCHAR(50), 
    doctext    NVARCHAR(MAX) 
    ) 

/* ---- HAVE TO USE DYNAMIC sql BECAUSE BULK INSERT WON'T TAKE A PARAMETER---------*/ 
DECLARE @sql NVARCHAR(4000) = 
'SELECT * FROM OPENROWSET (BULK ''' + @xmlFileName + ''', SINGLE_BLOB)AS xmlData' 

/* ---- have to use a normal table variable because we can't directly bulk insert 
     into an XML type table variable ------------------------------------------*/ 
INSERT INTO @results EXEC(@SQL) 

SELECT @x = result FROM @Results 

/* ---- this is MUCH faster than using a cross-apply ------------------------------*/ 
INSERT INTO @TempTable(ID,Article,doctext)            
SELECT 
       x.value('ID[1]',  'INT'   ),  
       x.value('Article[1]', 'NVARCHAR(50)' ),      
       x.value('doctext[1]', 'NVARCHAR(MAX)') 
FROM @x.nodes(N'/doc')  t(x) 

SELECT * FROM @TempTable 

이제 하드 비트가이 두 가지를 넣고 있습니다. 이 코드를 함수에 넣으려면 여러 가지 방법을 시도했지만 함수에서 동적 SQL 또는 EXEC를 사용할 수없고 함수에서 SP를 호출 할 수 없으며 코드를 두 개의 별도 SP에 넣을 수 없습니다. 계단식 EXEC 명령문이 있습니다. 예를 들어, EXEC에 EXEC가있는 코드를 EXEC에 넣으십시오. 두 코드 블록을 함께 넣으려면 커서를 사용해야합니다. @FilesInAFolder는 각 XMLFileName 값을 변수 @XMLFileName으로 두 번째 코드 블록에 전달하거나 SSIS 또는 CLR을 사용합니다.

죄송합니다. 매개 변수와 커서로 디렉토리 이름을 사용하여 완전한 SP를 작성하는 데 시간이 모자 럽습니다.하지만 이것은 매우 간단합니다. 휴!