XMLファイルを登録する

いままでXMLファイルをDBで管理・検索するのに、テーブルに検索対象としたい要素ごとのカラムを用意してインサートしていました。わりとフラットな構造のXMLだったのでそれほど困っていないのですが、SQL ServerにはXML型データとして持つこともできるので、どんな感じか試してます。

まずT-SQLでファイルからDBに登録する方法。OpenRowsetを使います。

SELECT CAST(x as XML) from OpenRowset(BULK 'test.xml' , SINGLE_BLOB) R(x)

テストのために、特定のフォルダにあるxmlファイルを全部登録するためのクエリ。

DECLARE @name varchar(40) , @path varchar(100), @sql varchar(1000)

/* XMLファイルのあるフォルダ */
SET @path = 'C:\data\xml\'

/* ファイル一覧を取得して#filesテーブルに入れる */
CREATE TABLE #files(filename varchar(100))

SET @sql = 'master..xp_cmdshell ''dir /B ' + @path + ' *.xml'''
INSERT INTO #files EXEC(@sql)

DECLARE file_cursor CURSOR FOR SELECT filename FROM #files WHERE filename IS NOT NULL

OPEN file_cursor

FETCH NEXT FROM file_cursor INTO @name
WHILE (@@fetch_status <> -1)
BEGIN
	IF (@@fetch_status <> -2)
	BEGIN
		print @path + @name

		SET @sql = 'INSERT INTO xml_files
		select ''' + @name + ''' AS filename, CAST(x as XML) AS contents 
		from OpenRowset(BULK ''' + @path + @name +  ''' , SINGLE_BLOB) R(x)'
		EXEC(@sql);
	END
	FETCH NEXT FROM xml_cursor INTO @name
END

CLOSE file_cursor
DEALLOCATE file_cursor

DROP TABLE #files

xp_cmdshellで"dir"コマンドを実行してデータのあるフォルダのファイル一覧を取得し、#filesという一時テーブルに入れています。
あとxp_cmdshellとOpenRowsetの引数には、変数を入れられないようだったので、文字列でクエリを作成してEXECで実行しています。
xml_filesテーブルはこんな感じです。

CREATE TABLE [dbo].[xml_files](
	[filename] [varchar](50) PRIMARY_KEY,
	[contents] [xml] NULL)