2

私は非常に簡単な質問があります(そしてこれらは通常、私の髪を引き裂くのにほとんどの時間を費やすものです)。バッチファイルを使用して、バッチと同じディレクトリにあるすべての.sqlクエリを実行し、そのすべての結果をさまざまな.csvファイルに保存しています。

これが私のコードです:

@echo off

REM Check that all parameters are present
@IF "%1"=="" goto error
@IF "%2"=="" goto error
@IF "%3"=="" goto error
@IF "%4"=="" goto error

REM For every *.sql file in this folder "." and all its subfolders (/R), do the following: 
@for /R "." %%F in (*.sql) do (
REM Print the command to be executed:
@echo Database : @SqlCmd -S %1 -U %2 -P %3 -d %4 -I -l60 -i "%%F" -o "%%F.output.csv"  -h-1 -s"," -w 1000 -W
REM Execute the command:
@SqlCmd -S %1 -U %2 -P %3 -d %4 -I -l60 -i "%%F" -o "%%F.output.csv" -h-1 -s"," -w 1000 -W
)

goto :EOF

:error

@echo Incorrect syntax : 
@echo     extract.cmd [servername] [user id] [password] [databasename]
@echo   
@pause

goto :EOF

テストとして、次のクエリを実行します。

select top(10) [name] from sysobjects 

出力:

sysrscols
sysrowsets
sysallocunits
sysfiles1
syspriorities
sysfgfrag
sysphfg
sysprufiles
sysftinds
sysowners

(10 rows affected)

これは、2つのことを除いて、正常に機能します。まず、列ヘッダーも出力する必要があります。そこで、「-h -1」パラメータを削除すると、次のようになります。

name
----
sysrscols
sysrowsets
sysallocunits
sysfiles1
syspriorities
sysfgfrag
sysphfg
sysprufiles
sysftinds
sysowners

(10 rows affected)

これは、見出しとデータの最初の行の間に水平方向のルール「------」が必要ないという事実を除いて、すばらしいことです。

また、「(10行が影響を受ける)」行を出力したくありません。

誰かが私がこれを達成する方法を知っていますか?

ありがとう
カール

4

3 に答える 3

1

これを試して:

SET NOCOUNT ON;
SELECT
    [Name]
    FROM (SELECT TOP(10)
              2 AS SortBy, [name]
              FROM sysobjects 
          UNION
          SELECT 1, 'Name'
         ) dt
    ORDER BY [Name]

SSMSからの出力:

Name
----------------------------------------------
Name
sysallocunits
sysfiles1
sysftinds
syshobtcolumns
syshobts
sysowners
sysprivs
sysrowsetcolumns
sysrowsets
sysserefs

「-h-1」パラメータをそのままにしておくと、列見出しは削除されますが、「名前」行は引き続き結果セットの最初に表示されます。

于 2010-09-22T12:59:26.177 に答える
0

私が見る限り、sqlcmdを使用すると「---」行を削除できません。

于 2010-09-22T19:24:12.870 に答える
0

SQLCMDの代わりにBCPを使用できます。これは、複数のSQLサーバーでクエリを実行するためのバッチファイルです。このコードをC:\ SCRIPTのCSV.CMDにコピーしてから、同じフォルダーにSERVERS.LSTを作成し、1行に1つのサーバー名を付けます。次に、実行してみてください。

CSV.CMD "select * from master..sysdatabases"

@echo off
REM Execute a SQL command or a SQL file on multiple instances.
REM Pollus Brodeur January 2007

if not x==%1x goto MAIN
echo Error  : You need to pass a query in parameter
echo Exemple: C:\>csv.bat "select * from table"
goto END

:MAIN

echo ===============================================================================
echo CSV) Execute a TSQL command on multiple servers and consolidate the result
echo ===============================================================================

set QUERY=%1

echo For the following query :
echo %QUERY%

:EXEC
echo ===============================================================================
echo On the followinf instances:
type servers.lst
echo ===============================================================================
echo To modify list : Ctrl+C notepad c:\script\servers.lst
echo ===============================================================================
PAUSE

echo Executing...
if NOT EXIST .\out mkdir out
if EXIST out\output.csv (del out\output.csv)
FOR /F %%s in (servers.lst) DO echo %%s & bcp %QUERY% queryout out\csv.%%s.out -S %%s -T -c -t;

:ENDEXEC
type out\csv.*.out >> out\output.csv
echo ===============================================================================
echo Execution finished
echo To view results with MORE      : more /E /C out\csv.*.out.*.txt
echo ===============================================================================

:END
DEL out\csv.*.out
PAUSE
out\output.csv

これはWindows認証でのみ機能しますが、必要に応じてコードを変更できます。

于 2012-07-09T16:01:59.117 に答える