15

次のようなテーブルがあるとします。

CREATE TABLE [dbo].[TBL_XML]
(
   [XmlFileID]       [BIGINT] IDENTITY (1, 1) NOT NULL,
   [FileName]        [NVARCHAR](500) NULL,   
   [XmlData]         [XML] NULL,
   [DateCreated]     [DATETIME] NOT NULL,
)

テーブルを埋めるために現在使用している方法は次のとおりです。

using (SqlCommand cmd = new SqlCommand())
{
    cmd.CommandText = @"INSERT INTO [dbo].[TBL_XML] 
                                    ( [XmlData] , 
                                    [FileName] , 
                                    [DateCreated]
                                    ) 
                        VALUES (@XMLData, @FileName, GETDATE())";

    using (var xmlReader = new XmlTextReader(new FileStream(item.XmlFileName, FileMode.Open)))
    {
        cmd.Parameters.Add("@FileName", SqlDbType.NVarChar, 500).Value = System.IO.Path.GetFileName(item.XmlFileName);
        cmd.Parameters.Add(
        new SqlParameter("@XMLData", SqlDbType.Xml)
        {
            Value = new SqlXml(xmlReader)
        });

        SetConnectionParameters(cmd);

        cmd.ExecuteScalar());
    }
}

ただし、ファイル全体がメモリに読み込まれ、OutOfMemory 例外が発生するため、これは非常に大きな XML では機能しません。

サーバーとは別のマシンで実行されている .net アプリケーションから、大きな (>100MB) XML ファイルを XMLData 列に挿入する最善の方法は何ですか?

SQL サーバーは XML ファイルにアクセスできないため、一括挿入は問題外です。

4

11 に答える 11

0

XML をデータベースにロードする最善の方法は、XML をデータベースにロードしないことです。本当にそれを行う必要がある場合 (そしておそらく必要ない場合) は、Cassandra や Mongo などの noSQL ソリューションを検討する必要があります。

XML を格納する必要がある場合は、別の場所で間違ったアーキテクチャを選択している可能性があります。情報を表現するためのより良い方法があるかどうかを検討してください。XML は交換フォーマットであり、情報を長期にわたって保持するのに適したフォーマットではありません。

そうは言っても、BCP またはストリーミングをサポートする OLEDB インターフェイスを使用できます。以下に例 を示します: 一括インポートの例

于 2014-01-03T22:19:32.660 に答える
0

この記事では、LOB を操作するための背景情報をいくつか提供します。 これをチェックして

xml フィールドを使用して OPENROWSET BULK 構文をテストしたところ、機能しました。SQL サーバーがファイルにアクセスできる場合、それは 1 つのオプションです (オプションではないことに気付いたので、さらに実験します)。それ以外の場合は、オフセット書き込みソリューションを試す必要があります。これまでのところ、その .WRITE メソッドを xml フィールドで動作させることはできません。

この記事では、BCP を使用して XML を挿入できることを示しています。これには、SQL Server クライアント ツールをインストールする必要があります。

于 2012-12-14T17:57:19.417 に答える
0

XML ファイルを FileTable に格納します。

于 2014-12-10T13:14:08.577 に答える
0

ストアド プロシージャを記述して、大きな xml ファイルをデータベースに挿入できます。そのストアド プロシージャでは、xml ファイルの入力を nvarchar(max) として送信できます。nvarchar(max) は最大 8000 文字を受け入れることに注意してください。

あなたのコードでは、メイン フローはファイル ストリームから xml を渡すことです。これは非常にコストのかかる作業です。

ファイルが nvarchar(max) よりも大きい場合は、ストアド プロシージャでより多くの入力パラメーターを使用し、これらの入力パラメーターを連結して、単一の値を xml ファイルとして挿入できます。

于 2013-11-21T17:00:38.053 に答える
0

@xmlstring入力xmlです

INSERT INTO @Temptbl           
   SELECT CONVERT(varchar(12), e.query('./Name/text()')) LogNumber             
   FROM @xmlstring.nodes('//RootNode/Root') AS n(e)     

select Temptbl     
于 2013-11-08T11:59:06.333 に答える
0

リモートの SQL Server にデータを保存する必要があるため、ファイル コンテンツ全体をネットワーク経由で転送する必要があります。一般に、次の 2 つの方法があります。

  • リモートサーバーにデータを転送します。
  • リモート サーバーは、ローカル ファイルからデータを読み取ります。

2 番目の方法は、この質問の範囲外です。最初の方法は、リモート サーバーにストアド プロシージャを実装すると仮定すると、いくつかの方法で実行できます。

  • データを部分的に転送し、サーバー側でそれらを結合してDBに保存する「アップロード」機能を実装します。
  • クライアント側で XML コンテンツをパックし、サーバー側でアンパックして保存します。
  • 上記の方法の組み合わせ。
于 2013-07-16T08:53:33.727 に答える
0

XML ファイルを SQL Server データベースにインポートするには、SSIS パッケージを作成する必要があると思います。次に、C# を使用する必要がある場合は、このパッケージをプログラムで実行できます。それはより効率的で、魔法のように機能します。

于 2014-06-06T13:02:21.810 に答える
-1

SQL xml バルク ローダーを使用して ください http://msdn.microsoft.com/en-us/library/ms171806.aspx

于 2014-06-10T00:56:20.730 に答える
-1

1) テーブルに挿入するストアド プロシージャを作成します。
2) C# コードから xml を varchar(max) として渡します。

また

2) ファイルをチャンクに分割します。
3) XML をパラメーターとして SP を実行します。

于 2014-02-21T07:46:07.347 に答える