MS SQL Server 2000/2005/2008テーブルをXMLファイルにエクスポート

こんにちは、愛するhabrasociety!



このトピックのタイトルになった問題について話しましょう。



設定:



さらなるニーズ(分析、他のコンポーネントおよびアプリケーションへのXMLの組み込みなど)のために、サーバー上のテーブルを目的のエンコードのXMLファイルに出力する必要性。 batスクリプトを使用します。





遭遇した困難



MS SQLを使用したさまざまなエンコーディングへのエクスポートのサポートの欠如。

XMLデータがデータベースに永続的に保存されている場合、SQL ServerはXMLエンコードを保持しません。 したがって、XMLデータのエクスポート時には、元のXMLフィールドエンコーディングは使用できません。 SQL ServerはUTF-16エンコードを使用してデータをエクスポートします。

©

さまざまなテーブルおよびデータベースのシンプルさと使用の速度。



実装手順



開始するには、 bcpユーティリティを使用します。このユーティリティは、MS SQL Serverのパッケージに含まれています(Expressバージョンでも)。 より詳細に

その機能のうち、要求の結果をファイルに出力するだけです。

例のキー値:

bcp "SELECT * FROM DB.SCHEMA.TABLE FOR XML AUTO, ROOT('ROOT')" queryout temp.xml -w -S %SERVERNAME% -U %DBUSER% -P %DBPASS%







チームの説明:



テーブルからすべてのデータを選択するSELECTクエリ(フルネームが表示されます)。

XML AUTOは、結果をXMLツリーに変換します。

ROOTは、このツリーのルート要素を割り当てます

queryoutは出力ファイルを設定します

-wは、一括コピーにUnicodeを使用することを指定します

-Sサーバーインスタンス名

-Pパスワード

-Uユーザー



このコマンドを使用すると UTF-16エンコードヘッダーなしのXMLファイルを取得できます。

ヘッダーを添付し、xmlを目的のエンコードにする必要があります。

内容を含むxml_header.xmlヘッダーテンプレートを作成します。

<? xml version ="1.0" encoding ="Windows-1251" ? >



* This source code was highlighted with Source Code Highlighter .








これでコマンドを実行するのに十分です

copy xml_header.xml + bcp_out.xml result.xml





有効なXMLドキュメントを取得します。



エンコーディングを変換するには、実装のiconvを使用します。 中平幸宏の Win32 APIで書かれた、Windows用の最もコンパクトでポータブルなソリューションを選びました。



スクリプトファイル:



@echo off



if "%1" == "" (

rem

echo Use with : db_name db_table [out_file]

exit /b 1

)



if "%2" == "" (

echo Use with : db_name db_table [out_file]

exit /b 1

)



rem settings.txt,

rem , bat-. -

rem .

call :read_settings %~dp0settings.txt || exit /b 1



set DBNAME=%1

set DBTABLE=%2

set OUTFILE=%3



echo;

echo ====== ECHO SETTINGS FROM CONFIG ======

echo;

echo ServerName : %SERVERNAME%

echo Schema : %SCHEMA%

echo Out codepage: %OUTCP%

echo User : %DBUSER%

echo Pass : ********

echo Iconv path : %ICONVPATH%

echo;

echo =======================================

echo;

echo ====== ECHO SETTINGS FROM CMD =========

echo;

echo DB Name = %1

echo DB Table = %2

echo Output file = %3

echo;

echo =======================================

echo;

echo ====== CALL TO BCP UTIL ===============

echo;

call :bcp_call

echo;

echo ====== CALL TO ICONV ==================

echo;

call :iconv_call

echo;

echo =======================================

echo;

echo See the log\log.txt for details

exit /b 0



rem

rem .

rem :

rem %1 -

:read_settings



set SETTINGSFILE=%1



rem

if not exist %SETTINGSFILE% (

echo FAIL: No such file %SETTINGSFILE%

exit /b 1

)



rem c



for /f "eol=# delims== tokens=1,2" %%i in (%SETTINGSFILE%) do (

set %%i=%%j

)



exit /b 0



rem

rem

:bcp_call



bcp "SELECT * FROM %DBNAME%.%SCHEMA%.%DBTABLE% FOR XML AUTO, ROOT('%DBTABLE%')" queryout temp.xml -w -r "" -S %SERVERNAME% -U %DBUSER% -P %DBPASS% > log\rawlog.txt



rem

%ICONVPATH% -f cp866 -t cp1251 log\rawlog.txt > log\log.txt

del log\rawlog.txt



copy lib \xml_header.xml + temp.xml temp2.xml > nul

del temp.xml



echo Finished.



exit /b 0



rem

rem

:iconv_call



rem

if "%OUTCP%" == "" (

set OUTCP=CP1251

)



rem

if "%OUTFILE%" == "" (

set OUTFILE=out\%DBTABLE%.xml

)



if not exist %ICONVPATH% (

echo FAIL: Check Iconv path !

exit /b /1

)



%ICONVPATH% -f UTF-16 -t %OUTCP% temp2.xml > %OUTFILE%

del temp2.xml



echo Finished.



exit /b 0




* This source code was highlighted with Source Code Highlighter .








コマンドラインパラメーターを通して、次を渡しますdatabase_name table_name [出力ファイル]

残りの設定はsettings.txtで指定されています:



#

SERVERNAME=WIND\SQLEXPRESS

#

SCHEMA=dbo

#

OUTCP=CP1251



#

DBUSER=dzhon

#

DBPASS=123



# iconv.exe

ICONVPATH=lib\win_iconv.exe









ロジックの場合、3つの関数がXMLファイルに作成されます。

最初は構成を解析し、2番目はbcpを呼び出し、3番目は結果ファイルのiconvを呼び出します。



おわりに



CP1251がデフォルトで使用され、bcpログがエンコードされていることがすぐにわかります。 これは、Windowsでの作業の利便性のために行われ、他の宗教的な好みではありません。 インターフェイスの説明で単純なルートPRINTを呼び出したときに、Windows XPがワニを示した時代を思い出します。したがって、私自身は常にUTF-8を好みます。 ただし、 xml_header.xmlに別の値を設定する必要がありますが、スクリプトは出力エンコーディングを置き換えるのに十分な柔軟性を備えています。



アーカイブを有効なソリューションと共にここからダウンロードできます(13 Kb)



SQL Server 2000では、スキーマの概念(オブジェクトコンテナという意味)が2005年からのみ導入されたという事実のため、いくつかの変更を行う必要があります。



また、構成を解析する機能が削除されたbatファイルの作成に関する資料を見ることができます。



ご清聴ありがとうございました。誰かが助けてくれることを願っています。

カルマがある場合はテーマ別のブログに転送しますが、決定します。




All Articles