0

バッチ ファイルを使用して、SQL コードを含むファイルを、MSSQL ユーティリティ bcp で使用する単一の環境変数に変換しようとしています。たとえば、InFile.sql に含まれている場合

-- This is a simple statement
SELECT *
    FROM table

の出力ECHO %query%SELECT * FROM people

以下のコードは、ほとんどの場合私にとってはうまくいきます

SETLOCAL=ENABLEDELAYEDEXPANSION 
:: Replace VarOld with VarNew
FOR /f "delims=" %%a IN ('TYPE InFile.sql') DO ( SET line=%%a & ECHO !line:table=people! >> TmpFile1 )

:: Remove comment lines starting with  '-'  and remove newline characters
(FOR /f "eol=- delims=" %%a in (TmpFile1) DO SET/p=%%a ) <nul >TmpFile2

:: Create variable 'Query'
FOR /f "delims=" %%a IN ('TYPE TmpFile2') DO SET query=%%a

ただし、最初の FOR ループでは各行の末尾に 3 つのスペース文字が追加され、2 番目の FOR ループでは別のスペース文字が追加されるため、結果は次のようになります。 SELECT * FROM people

長い SQL クエリと複数の置換手順でそれを使用しなければならないまで、追加のスペースに対処できました (私の純粋主義者は満足していませんでした!)。ファイルのすべての行に 12 個のスペース文字が追加されていました。追加のスペースは、結果のクエリの長​​さを約 8300 文字にするのに十分です。これは、バッチ ファイル行に対する Windows の 8196 文字制限には長すぎます。

これらの偽のスペースを削除する方法を誰かが見ることができますか?

4

2 に答える 2

1

ループで使用tokens=*すると、forinfile.sqlの行をキャプチャするときに空白が削除されます。これが概念実証であり%query%、トリミングを説明するために引用符で囲まれたエコーが含まれています。

@echo off
setlocal enabledelayedexpansion

set query=
if "%~1"=="" goto usage
if not exist "%~1" goto usage

for /f "usebackq eol=- tokens=*" %%I in ("%~f1") do (
    set "sub=%%I"
    set query=!query! !sub:table=people!
)

:: strip the leading space from %query%
echo "%query:~1%"
goto :EOF

:usage
echo Usage: %~nx0 sqlfile

出力例:

C:\Users\me\Desktop>type infile.sql
-- This is a simple statement
SELECT *
    FROM table

C:\Users\me\Desktop>test.bat infile.sql
"SELECT * FROM people"
于 2013-03-14T18:39:38.727 に答える
0

基本的な問題は、リダイレクタの前の SET ステートメントと ECHO ステートメントでは、末尾のスペースが重要であるということです。

コードでは、最初のスペースの後ろ%%aと後ろにあるスペースを削除する必要があります。people!FOR

FOR /f "delims=" %%a IN ('TYPE InFile.sql') DO (SET line=%%a&ECHO !line:table=people!>> TmpFile1)

次の問題はもう少し微妙です。の

(FOR /f "eol=- delims=" %%a in (TmpFile1) DO SET/p=%%a ) <nul >TmpFile2

次のスペース/p=%%aは必須です。TmpFile2 を構築するときに行から取得したテキスト間の区切りを提供するためです。これにより、余分な末尾スペースが発生します。Qそのスペースをたとえばに置き換えてみてください-テストのためだけに。

QUERYしたがって、最終的に構築された後、最終的なスペースを削除する必要がありますFOR

SET query=%query:~0,-1%
于 2013-03-14T23:44:54.493 に答える