我正尝试使用xp_cmdshell中的bcp选择查询并将结果获取到.csv文件。我只在选择文件中得到第一个查询的结果。第一个查询包含表中所有行的总数,这是csv文件的第一行,而.csv文件中的其余数据来自表。它是这样的xp_cmdshell中的多个select语句
select count(col1),sum(col2)
from [Database1].[DBO].[Table1];
SELECT *
FROM [Database1].[DBO].[Table1]
我正尝试使用xp_cmdshell中的bcp选择查询并将结果获取到.csv文件。我只在选择文件中得到第一个查询的结果。第一个查询包含表中所有行的总数,这是csv文件的第一行,而.csv文件中的其余数据来自表。它是这样的xp_cmdshell中的多个select语句
select count(col1),sum(col2)
from [Database1].[DBO].[Table1];
SELECT *
FROM [Database1].[DBO].[Table1]
我不知道这是否是你想要什么,但你可以用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。 但这应该不重要 - 它的工作原理!
对我来说,将这两个查询合并为一个输出将意味着您的CSV文件将不会“有效”... – gvee
嗨我有这样的要求。 CSV文件必须采用此格式 – Rajat