【问题标题】:SQL Server 2008 - use cmd to output with headers to .csvSQL Server 2008 - 使用 cmd 将标头输出到 .csv
【发布时间】:2010-09-22 12:44:59
【问题描述】:

我有一个非常简单的问题(这些问题通常是我大部分时间都在扯头发的问题)。我正在使用批处理文件来执行与批处理位于同一目录中的所有 .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 行)”行。

有人知道我如何做到这一点吗?

谢谢
卡尔

【问题讨论】:

    标签: sql-server-2008 csv batch-file cmd sqlcmd


    【解决方案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”参数,列标题将被移除,但“名称”行仍会首先出现在结果集中。

    【讨论】:

    • 嘿KM。谢谢那是一个相当创新的解决方案。不过,我不希望更改查询。
    【解决方案2】:

    据我所知,使用 sqlcmd 时不能去掉“---”行。

    【讨论】:

      【解决方案3】:

      您可以使用 BCP 代替 SQLCMD。这是一个批处理文件,用于在多个 SQL 服务器上运行您的查询。将此代码复制到 C:\SCRIPT 中的 CSV.CMD 中,然后在同一文件夹中创建一个 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 身份验证,但您可以根据需要更改代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-14
        • 2011-04-20
        • 2011-05-10
        • 2011-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多