上下文:我正尝试通过BCP将SQL Server中表的内容输出到CSV文件。我试图通过执行UNION ALL来在CSV文件中显式命名列标题,以便列标题不为空。
问题:有人可以分享一些我为什么提出这些错误的指针,尤其是当我在查询中明确转换了数据类型时出现的数据类型转换错误吗?
true
我遵循了上面建议的逻辑:export table to file with column headers (column names) using the bcp utility and SQL Server 2008
下面是不断失败的T-SQL代码段:
fav
答案 0 :(得分:1)
Stu对发生的事情是正确的,但是需要强制执行某些操作,还需要添加更多内容。您得到的错误是因为您在第二个查询中显式转换了数据类型,因此SQL尝试将第一个查询(隐式转换为varchar来启动,直到SQL在第二个查询中遇到转换)也转换为int。但是,第一个查询的第一列中的值不能转换为int。这是一个varchar字符串“'cast(Company_ID as int)'”。
您必须在联合中获得第一个和第二个查询才能成为类似的数据类型。您永远不会让字符串“ cast(Company_ID as int)”成为整数,我建议将第二个查询中的列转换为char / varchar数据类型。您是否正在将数据发送到文本文件,对吗?您使用了bcp的-c选项,因此只需使第二个中的所有内容都匹配第一个,而反之亦然。
exec master.dbo.xp_cmdshell 'bcp "SELECT ''Company_ID'' UNION ALL SELECT DISTINCT cast(id as varchar( 12 ) ) FROM ##jsonparsed" queryout C:\Users\ebarnes\etl_project\company_data.csv -c -T -t'
答案 1 :(得分:0)
因为Company_ID
中的值之一不是数字。像标题一样。
尝试完全不进行投射。
答案 2 :(得分:0)
请尝试这个
exec master.dbo.xp_cmdshell 'bcp "SELECT DISTINCT cast(id as int) AS Company_ID, cast(url as nvarchar(150)) AS MatterMark_URL , cast(company_name as nvarchar(100)) AS Company_Name, cast(domain as nvarchar(150)) AS Domain FROM ##jsonparsed" queryout C:\Users\ebarnes\etl_project\company_data.csv -c -T -t'
如果失败,则意味着您的全局临时表## jsonparsed具有无法转换的无效数据。
答案 3 :(得分:0)
我只是将其全部转换为 nvarchar 并且我使用了一个函数,但您需要确保使用数据库名称。
Create or alter PROCEDURE [dbo].[Export]
AS
BEGIN
DECLARE @FileName varchar(50),
@bcpCommand varchar(8000)
SET @bcpCommand = 'bcp "Select * from [Database].dbo.Select()" queryout "C:\temp\Output'
+ CONVERT(VARCHAR, GETDATE(), 105) + '.csv" -U[Username] -P[Password] -S.\[Instance] -r\n -w'
PRINT @bcpCommand
EXEC master..xp_cmdshell @bcpCommand
END