こんにちは、愛する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ファイルの作成に関する資料を見ることができます。
ご清聴ありがとうございました。誰かが助けてくれることを願っています。
カルマがある場合はテーマ別のブログに転送しますが、決定します。