我正在尝试使用在xp_cmdshell中的bcp中选择查询并将结果转换为.csv文件。我只在select文件中获得第一个查询的结果。第一个查询具有表中所有行的总和,这是csv文件的第一行,而.csv文件中的其余数据来自表。它是这样的
select count(col1),sum(col2)
from [Database1].[DBO].[Table1];
SELECT *
FROM [Database1].[DBO].[Table1]
答案 0 :(得分: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,以便联合起作用。
如果你有一个View语句,那么BCP会更短:
exec xp_cmdshell 'bcp [database].[schema].[view] out "C:\file.csv" -c -t, -T -Slocalhost'
注意:file.csv必须存在!至少作为csv结尾的空文件。
修改强> 正如你在你的提交中所说的列数不匹配 - 所以我尝试使用以下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 out到csv:
exec xp_cmdshell 'bcp [mydb].[dbo].[testview] out "C:\file.csv" -c -t, -T -Slocalhost'
它有效!唯一的问题是bcp给你这个消息: 错误= [Microsoft] [SQL Server的ODBC驱动程序11]警告:使用格式文件导入BCP会将分隔列中的空字符串转换为NULL。 但这不重要 - 它有效!