【问题标题】:bcp issues with special characters when inserting tables插入表格时出现特殊字符的 bcp 问题
【发布时间】:2020-03-06 20:15:19
【问题描述】:

我有一个带有特殊字符的文本文件

#ID^&^DESCRIPTION^&^DATEINS
1^&^This is a test rec^&^12/23/2019 11:31:48
2^&^A Unique identification number (IČO) ^&^10/21/2019 07:36:48
4^&^Test 3 row known as ÖNACE 2020^&^11/02/2009 07:36:48

这是我创建的表

CREATE TABLE [dbo].[TESTtbl](
    [id] [int] NOT NULL,
    [desc] [nvarchar](MAX) collate Latin1_General_CI_AS,
    [DATEINS] [datetime] NULL,
 ) 
 ON [PRIMARY]

我在下面构建了格式文件

10.0
3
1       SQLCHAR             0       12      "^&^"      1     cd_val_id                                ""
2       SQLNCHAR            0       0       "^&^"      2     bus_desc                                 SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR             0       24      "\r\n"     3     DateIns                                  ""

我没有在表格中看到“bus_desc”列的正确字符。我该如何解决这个问题?

这是我使用的 bcp 命令

bcp.exe DBNAME.[dbo].[TESTtbl] in "c:\temp\some.txt" -T -f "c:\temp\formatfile.fmt"  -C -S"SERVERNAME\INSTANCENAME" -F2 -t "^&^"  -e "c:\temp\err.txt" -o "c:\temp\bcpout.txt"

【问题讨论】:

  • 您还应该包含用于加载数据的 bcp 命令。
  • 您在 bcp 文件 ("bus_desc") 中定义的第二个字段设置为进入只有 24 个字节的第 3 列。您也应该丢失 DATEINS 数据。格式文件的最后一列应该是 1、2、3... 而不是 1、3、11。当您告诉 BCP 将输入数据的第 3 列放入表的第 11 字段时,我很惊讶 BCP 没有失败。没有字段 11,对吧?
  • @jamie,我更正了格式文件并添加了 bcp 命令
  • 您的 bcp 命令没有使用 -f 选项? -f 选项用于指定格式文件的位置。现在不是将其添加为答案,您能否确认该 bcp 命令确实是您使用的命令,并确认您是否真的打算使用格式文件?我认为您只是在滥用 bcp 命令。
  • 哎呀,我试过“-c without format file”和“-f formatfile”。两者都没有工作。我更新了 bcp 命令

标签: sql-server bcp


【解决方案1】:

一种方法是将所有数据加载到表中并稍后进行操作。请在下面找到代码:

drop table if exists [dbo].[TESTtbl]

CREATE TABLE [dbo].[TESTtbl](
    [id] [int] NOT NULL,
    [desc] [nvarchar](MAX),
    [DATEINS] [datetime] NULL,
 ) 

drop table if exists [dbo].TESTtbl_new

CREATE TABLE [dbo].[TESTtbl_new](
    [desc] [nvarchar](MAX) 
 ) 

declare @cmd nvarchar(100) = 'bcp DBNAME.dbo.[TESTtbl_new] in "FILE_PATH" -T -c -C 65001 -S SERVERNAME\INSTANCENAME'
exec xp_cmdshell @cmd

select * from [TESTtbl_new]

update [TESTtbl_new]
set [desc] = replace([desc], '^&^', '@')    --assuming actual data wouldn't have '@'

;WITH C AS(
SELECT [desc] AS ID
      ,value 
      ,ROW_NUMBER() OVER(PARTITION BY [desc] ORDER BY (SELECT NULL)) as rn
FROM [TESTtbl_new] TT
    CROSS APPLY STRING_SPLIT([desc], '@')t
)
INSERT INTO [TESTtbl]
SELECT [1] AS ID
      ,[2] AS [DESCRIPTION]
      ,[3] AS [DATEINS]
FROM C
PIVOT(
    MAX(VALUE)
    FOR RN IN([1],[2],[3])  
) as PVT
WHERE [1] <> '#ID'

select * from [TESTtbl]

结果:

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 2016-11-24
    相关资源
    最近更新 更多