【发布时间】:2018-11-04 01:26:03
【问题描述】:
我正在使用一个旧代码库,该代码库设置一个带有测试数据的 SQL 数据库。该代码有一些批处理文件和 SQL 文件进行设置,我无法弄清楚为什么它无法添加数据。重要的是,这是我之前使用过的安装过程的一部分,以前可以正常工作。我已经重新安装了 Windows(Windows 10 Enterprise,以前是 Windows 7 Pro)。该项目使用 SQL Server 2008 R2 (10.50.4042.0)。
这是创建表的 SQL
PRINT 'Creating Table VersionHistory'
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[VersionHistory](
[Id] [uniqueidentifier] NOT NULL,
[VersionNumber] [varchar](50) NOT NULL,
[VersionSequence] [int] NOT NULL,
CONSTRAINT [PK_VersionHistory] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
这是输入数据(制表符分隔):
42E8397A-F913-402C-9F5D-013B0D78215C 1.0.1.13060 1
8BA50B6A-1813-42D5-A7F0-2EEC55D8A7CC 1.0.11.15222 13
B296B89F-CF3E-4A68-8A19-3440B67AEB84 1.0.9.14324 11
3299D4CD-E949-464B-B65B-4597FA5ED9D0 1.0.10.15091 12
ADE81361-41B9-42F8-BBF8-4A9A3E32AF2F 1.0.5.13331 7
4EFB3E84-DE22-4D34-BD7B-7E7294540487 1.0.1.13087 2
5AF55EE2-8D35-43F8-929C-9AD4BA256EC6 1.0.8.14233 10
97F98EAF-2CC1-42A2-A331-9B5E62AD52DF 1.0.3.13234 6
B31E1B3C-C556-431B-BE69-BF49758FF649 1.0.7.14146 9
1AA59F90-5F90-4058-8359-CBF79405649B 1.0.6.14056 8
46C3FD09-2E9E-4BBF-B800-D19DFB730A17 1.0.1.13150 5
D69E8D07-76DF-4698-ADBB-D48A7B8290B7 1.0.1.13105 3
31C975EA-FEF5-482D-B022-E631F56159CE 1.0.1.13116 4
批处理文件尝试使用以下行添加输入数据:
bcp CLIENTDB.dbo.VersionHistory in "H:\PATH\TO\FILE\VersionHistory_Data.txt" -S .\sql2008r2 -U user -P password -E -c -e errors.txt
这失败并出现以下错误:
Starting copy...
SQLState = 22005, NativeError = 0
Error = [Microsoft][SQL Server Native Client 10.0]Invalid character value for cast specification
并且在错误文件中:
#@ Row 1, Column 3: Invalid character value for cast specification @#
所以这听起来像是在文件中强制转换整数类型。这也只是整体问题的一个示例,即以这种方式添加了数十个表,并且由于某种原因它们都失败了。有一些 bcp 调用不会产生任何错误,但只添加了一行。
我确保正在使用的 bcp 版本是由 SQL Server 2008 安装的
> where bcp
C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe
因此,解释需要更改哪些内容才能使此调用正常工作的答案将是一个适当的解决方案。一个答案表明为什么这可能曾经毫无问题地起作用,或者最终表明它永远不会起作用,这将是令人难以置信的。感谢您的宝贵时间。
常见问题:
问:为什么使用 SQL Server 2008 R2
A: 原来项目用的,时间紧迫,有几十个sql文件和存储过程,我没信心有时间研究需要改什么才能使用较新版本的 SQL Server。
更新:
解决方案
制表符分隔的数据文件在提交 repo 之前具有 CR+LF 行结尾并切换到 unix 样式的行结尾。我已经意识到这发生在某些文件上,但不知道它在提交时发生在整个代码库中。如果文件返回到 CR+LF 结尾,或者将附加标志 -r 0x0a 应用于 BCP 命令,则 BCP 命令执行没有问题。
【问题讨论】:
-
如果我将行尾更改为仅 CR (Macintosh) 或仅 LF (Unix) 而不是 Windows 上通常的 CR + LF,我可以完美地重现您的问题。验证您的文件在任何地方都使用正确的行尾。 (如果所有行都以 CR + LF 结尾,我也可以很好地导入文件。)您可能还想验证没有不可见的空格字符可能会弄乱作品,尽管这似乎不太可能。
-
@RBarryYoung:Unicode 是我的第二个想法(实际上是带有 BOM 的 UTF-8),但在这种情况下,BCP 仅在第一行的第一列上失败,而不是第三列。没有 BOM 的 UTF-16 会因 EOF 而失败。 (即便如此,检查代码页和/或使用
-C明确指定它可能是值得的,因为这也可能是一个问题,尽管不可否认这里提供的 ASCII 兼容数据。) -
如果是这个问题,另请参阅this question,如果回购是 Git 回购,请参阅this one。 ...我差点忘了,但如果您对更改文件不感兴趣,使用
-r 0x0a应该指示 BCP 仅使用 LF 作为行终止符。 (但不确定这是否适用于 2008R2 BCP。) -
@JeroenMostert 我已经测试过了,这完全是问题所在。如果我将文件切换到 CR + LF 结尾或使用附加标志 -r 0x0a 非常感谢!!!
-
我确信这个问题必须与其他一些 bcp 问题重复,因为您不可能是第一个在 SO 上遇到这个问题的人,但如果我可以找到一个实际的副本。以防万一,我会准备一个答案。
标签: sql-server sql-server-2008-r2 bcp