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ファイルの作成に関する資料を見ることができます。

ご清聴ありがとうございました。誰かが助けてくれることを願っています。
カルマがある場合はテーマ別のブログに転送しますが、決定します。

Source: https://habr.com/ru/post/J71507/


All Articles