BCP 复制失败——数据类型转换和列级排序错误

BCP copy out failed -- data type conversion & column level collation errors

上下文: 我正在尝试通过 BCP 将 SQL 服务器中 table 的内容输出到 CSV 文件。我正在尝试通过执行 UNION ALL 显式命名 CSV 文件中的列 headers,因此 headers 列不为空。

问题:有人可以分享一些关于我为什么会出现这些错误的指示,特别是当我明确转换数据类型时的数据类型转换错误询问?

bcp "select 'col1', 'col2', 'col3' union all select cast(id as varchar(10)), name, cast(someinfo as varchar(28)) from Question1355876" queryout myTable.csv /SmyServer01 /c /t, -T
111

我遵循了上面建议的逻辑:export table to file with column headers (column names) using the bcp utility and SQL Server 2008

下面是不断失败的 T-SQL 片段:

exec master.dbo.xp_cmdshell 'bcp "SELECT ''cast(Company_ID as int)'', ''cast(MatterMark_URL as nvarchar(150))'', ''cast(Company_Name as nvarchar(100))'', ''cast(Domain as nvarchar(150))'' UNION ALL SELECT DISTINCT cast(id as int), cast(url as nvarchar(150)), cast(company_name as nvarchar(100)), cast(domain as nvarchar(150)) FROM ##jsonparsed" queryout C:\Users\ebarnes\etl_project\company_data.csv -c -T -t'

因为 Company_ID 中的一个值不是数字。喜欢 header.

尽量不要投射它。

Stu 对正在发生的事情是正确的,但是需要铸造一些东西,还有更多要补充。您得到的错误是因为您在第二个查询中显式转换了数据类型,因此 SQL 尝试转换第一个查询(隐式转换为 varchar 开始,直到 SQL 在您的第二个查询中遇到转换查询)也作为一个整数。但是,第一个查询中第一列中的值无法转换为 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'

请试试这个

    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'

如果失败,则意味着您的全局临时文件 table ##jsonparsed 包含无法转换的无效数据。

我只是将其全部转换为 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