SQL Server 2008 - используйте cmd для вывода с заголовками в .csv - PullRequest
2 голосов
/ 22 сентября 2010

У меня довольно простой вопрос (и это, как правило, те, которые я провожу большую часть своего времени, вырывая свои волосы).Я использую пакетный файл для выполнения всех запросов .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)

Это прекрасно работает, за исключением двух вещей.Во-первых, мне нужно также выводить заголовки столбцов.Поэтому я удаляю параметр "-h -1", который затем дает:

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

(10 rows affected)

, что прекрасно, за исключением того факта, что я не хочу горизонтальное правило "------" междузаголовок и первая строка данных.

Кроме того, я не хочу, чтобы выводилась строка "(затронуто 10 строк)".

Кто-нибудь знает, как мне этого добиться?

Спасибо
Карл

Ответы [ 3 ]

1 голос
/ 22 сентября 2010

попробуйте это:

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», и заголовки столбцов будут удалены, но «Имя»строка будет по-прежнему отображаться в наборе результатов первой.

0 голосов
/ 09 июля 2012

Вы можете использовать BCP вместо SQLCMD.Вот командный файл для запуска вашего запроса на нескольких серверах SQL.Скопируйте этот код в CSV.CMD в C: \ SCRIPT, затем создайте SERVERS.LST в той же папке с одним именем сервера в строке.затем попробуйте выполнить:

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, но вы можете изменить код по своему усмотрению.

0 голосов
/ 22 сентября 2010

Насколько я понимаю, вы не можете избавиться от строки "---" при использовании sqlcmd.

...