2012-02-28 26 views
0

にXML文書を挿入する私は、SQL Serverに2008SQL Server 2008のデータベース

をxmlファイルを挿入する助けが必要私は、次の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ループコンテナを使用することをお勧めします。そこから、フォルダを指定して、それをストアドプロシージャの入力として使用することができます(または、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

stackoverflowの中で質問に答えるで[OK]を、最初の亀裂...

あなたは二つの問題があります: - まず、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を使用して気にしない場合は、一括挿入はパラメータを取り、あなたはありませんので、SQLの列にXMLファイルを変換することは少しトリッキーです、簡単です。 XML表の型にBULK INSERTすることはできません。 ONEファイルで使用できるコードは次のとおりです。

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 

ここで、ハードビットはこれら2つを組み合わせています。このコードを関数に取り入れるためにいくつかの方法を試しましたが、関数内で動的SQLまたはEXECを使用することはできず、関数からSPを呼び出すことはできず、コードを2つの別々のSPに入れることはできません。カスケーディングEXECステートメントを持っている、つまりEXECを実行して、その中にEXECがあるSPをEXECしようとすると...上記の2つのコードブロックを一緒に置くためにカーソルを使用する必要があります@FilesInAFolderは、各XMLFileName値を変数@XMLFileNameとして第2のコードブロックに渡すか、SSISまたはCLRを使用します。

申し訳ありませんが、パラメータとカーソルとしてディレクトリ名を持つ完全なSPを構築するために時間がなくなりましたが、それはかなり簡単です。ピー!

関連する問題