2015-06-17 48 views
0

我正尝试使用xp_cmdshell中的bcp选择查询并将结果获取到.csv文件。我只在选择文件中得到第一个查询的结果。第一个查询包含表中所有行的总数,这是csv文件的第一行,而.csv文件中的其余数据来自表。它是这样的xp_cmdshell中的多个select语句

select count(col1),sum(col2) 
from [Database1].[DBO].[Table1]; 
SELECT * 
FROM [Database1].[DBO].[Table1] 
+1

对我来说,将这两个查询合并为一个输出将意味着您的CSV文件将不会“有效”... – gvee

+0

嗨我有这样的要求。 CSV文件必须采用此格式 – Rajat

回答

0

我不知道这是否是你想要什么,但你可以用UNION(或UNION ALL)

拼接的结果集,如果col1和col2上的数字列:

exec xp_cmdshell 'bcp "SELECT COUNT(col1), SUM(col2) FROM [database].[schema].[table] UNION ALL SELECT col1,col2 FROM [database].[schema].[table]" queryout "C:\file.csv" -c -t, -T -Slocalhost' 

否则,您应该将COUNT(col1)或/和SUM(col2)作为VARCHAR转换,以便联合工作。

最好的,如果你有语句中的视图会,然后BCP是一个有点短:

exec xp_cmdshell 'bcp [database].[schema].[view] out "C:\file.csv" -c -t, -T -Slocalhost' 

:FILE.CSV必须存在!至少作为一个csv结尾的空文件。

编辑: ,正如你在commment说的列数不匹配 - 所以我有以下TESTDATA试了一下:

create table dbo.testtable 
(
    charcol VARCHAR(9), 
    intcol INT, 
    charcol2 VARCHAR(50), 
    floatcol FLOAT 
) 

INSERT INTO dbo.testtable 
VALUES ('abcd',1,'a longer text',1.1235), 
     ('efgh',1,'a longer longer text',1.1235), 
     ('ijkl',1,'a bit more text',1.1235), 
     ('mnop',1,'pfff anoying',1.1235), 
     ('qrstuvw',1,'please weekend come soon',1.1235) 
GO 

然后我创建了获取数据的视图 - 注意:我投NULL作为假定值:

CREATE VIEW dbo.testview 
AS 
SELECT CAST(COUNT(charcol) AS varchar(9)) AS charcol, 
     CAST(SUM(intcol) AS int) AS intcol, 
     CAST(NULL AS VARCHAR(50)) AS charcol2, 
     CAST(NULL AS float) AS floatcol 
FROM dbo.testtable 
UNION ALL 
SELECT charcol, 
     intcol, 
     charcol2, 
     floatcol 
FROM dbo.testtable 

最后BCP出来CSV:

exec xp_cmdshell 'bcp [mydb].[dbo].[testview] out "C:\file.csv" -c -t, -T -Slocalhost' 

它的工作原理!唯一的是,bcp给你这个消息: 错误= [Microsoft] [SQL Server的ODBC驱动程序11]警告:具有格式文件的BCP导入会将分隔列中的空字符串转换为NULL。 但这应该不重要 - 它的工作原理!

+0

由于列数不同,所有联合将不起作用。我尝试将上面的列作为null传递,但仍然没有成功。我尝试将注释放入存储过程中,但仍然无法工作。 – Rajat

+0

请检查编辑答案。 – CeOnSql