OSQL (SQL Server 2000) を使用しており、html ソースを 8xxx バイトのデータに分割するバッチ ファイルがあります。チャンクをSQLレコードに戻すにはどうすればよいですか? 詳細は次のとおりです。
osql ステートメントのバッチ ファイル:
echo use database;>tempsql.sql
echo set indentity_insert tablename ON;>>tempsql.sql
echo insert into tablename (ID, Name, Date, Body_HTML)>>tempsql.sql
echo values ('%id%', '%name%', '%cdate%', '%body_html%');>>tempsql.sql
echo set indentity_insert tablename OFF;>>tempsql.sql
echo go>>tempsql.sql
osql -U user -P pass -d database < tempsql.sql -o sqloutput.rpt
すべての変数 %Body_Html% は 8k スタックに収まりますが、%body_html% のデータは 8k より大きい (最大 50k) ため、スタックに収まるように「チャンク」する必要があります。以下は、レビュー用のチャンク ルーチンの一部です (これについては jeb と dbenham に感謝します)。
@echo off
set count=0
setlocal EnableDelayedExpansion EnableExtensions
for /f "tokens=*" %%a in ("newhtml.htm") do set FileSize=%%~za
echo FileSize is %FileSize% bytes
if %FileSize% GTR 8159 goto split
rem skip regular insert routine, pick up at :split
:split
set count=0
set /a all_sub=%FileSize% / 8159
set /a all_rem=%FileSize% %% 8159
if %all_rem% NEQ 0 set /a all_ttl=%all_sub% + 1
echo %all_sub% full page(s), %all_rem% bytes(s) leftover, %all_ttl% total pages
chunk newhtml.htm basenam -s8159 -o
set count=0
:: now get accurate file count of basenam.*
for /f "tokens=1*" %%a in ('dir basenam.* ^| find "File"') do (
set setfiles=%%a
)
echo %setfiles%>setfiles
set count=0
::now show where the break is
echo Loop %count%
SETLOCAL DisableDelayedExpansion
set "all="
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ basenam.00%count%"`) do (
set "line=%%a"
SETLOCAL EnableDelayedExpansion
set "line=!line:#=#S!"
set "line=!line:*:=!"
for /F "delims=" %%p in ("!all!#L!line!") do (
ENDLOCAL
set "all=%%p"
)
)
SETLOCAL EnableDelayedExpansion
if defined all (
set "all=!all:~2!"
set ^"all=!all:#L=^
!"
set "all=!all:#S=#!")
:: now display file in 8159 byte chunks, does emit a blank line in between
echo !all!
set /a count=!count! + 1
for /f "tokens=*" %%m in (setfiles) do set setfiles=%%m
if %count% EQU !setfiles! goto end
goto loop1
:end
では、チャンク ルーチンを osql ルーチンとマージするにはどうすればよいでしょうか。おそらくいくつかの FOR ループをネストする必要があることはわかっていますが、上記のパラメーターに基づいてこれを行う方法を考えることができません。
とチャンクは、ここで見つけることができます: http://www.oldskool.org/pc/chunk
編集:したがって、osqlループでロジックを別の方法で考える必要があるように思われるかもしれません.1)複数の変数を読み取るか、2)変数 %body_html% としてoqsl結果ファイル(sqloutput. rpt)
次のようにエコーステートメントを分割する必要があります:
echo use database;>tempsql.sql
echo set indentity_insert tablename ON;>>tempsql.sql
echo insert into tablename (ID, Name, Date, Body_HTML)>>tempsql.sql
echo values ('%id%', '%name%', '%cdate%', '>>tempsql.sql
rem %body_html%
rem put chunk routine here
rem echo !All!>>tempsql.sql
echo ';>>tempsql.sql
echo set indentity_insert tablename OFF;>>tempsql.sql
echo go>>tempsql.sql
きれいではありませんが、今はうまくいくかもしれないと思います。後で私の結果を投稿します。