4

我正在编写一个实用程序 C#,将包含大约 80 列的大型 CSV 导入 SQL Server 2008 表。

CSV 需要在导入之前进行操作,例如合并一些列、转换日期等。因此,我正在构建如下INSERT INTO语句:

INSERT INTO table VALUES ('abc','blah',...)

我的问题是该表包含一个类型的列UNIQUEINDENTIFIER。这是一个问题,因为我想重新使用现有的方法,该方法采用一组值并返回值的字符串以直接弹出到我的INSERT INTO语句中,处理撇号,消除注入攻击等。

有没有一种方法UNIQUEIDENTIFIER可以为我传递给这个方法的有效文字?我试过Guid.NewGuid.ToString()了,这给了我这样的文字'bfdb0297-2018-4555-ac12-88064944a671',但我的查询随后出现数据截断异常错误。我还尝试删除连字符。我预计 32 个十六进制字符可以工作。

我知道参数化查询是正确的方法,但这意味着对现有代码的重大返工。

我很擅长 C# 和 SQL Server 虚张声势。

[编辑]

我做了几件事。首先,编写一个查询,用 Guid.NewGuid 更新该列。因此,截断错误不是从那里开始的。检查 SQL Server 参考使我相信截断错误不是从 id 列中的错误值返回的,而是无效值错误。我还考虑了 Aaron 的评论,即重要的工作并不是不正确的借口,并创建了一种方法来生成参数化查询,该方法现在可以正常工作。

非常感谢所有响应者。

4

3 回答 3

14

SQL Server 中文字UNIQUEIDENTIFIER如下所示:

SELECT {guid'8DEC377B-6D75-424B-AE01-D3727993C7F6'}

如文档中所示:

它是由关键字GUID后跟十六进制数字形成的序列,格式称为注册表格式:8-4-4-4-12括在单引号中。

似乎没有人知道这一点。这是我见过的第一种实际上具有文字 GUID/UUID 的语言。

于 2015-10-05T19:26:24.577 回答
3

由于这工作正常:

DECLARE @x TABLE(y UNIQUEIDENTIFIER); 

INSERT @x SELECT 'bfdb0297-2018-4555-ac12-88064944a671';

这会因您当前收到的一般错误消息而失败:

DECLARE @x TABLE
(
  y UNIQUEIDENTIFIER,
  z CHAR(10)
); 

INSERT @x 
  SELECT 'bfdb0297-2018-4555-ac12-88064944a671',
         '0123456789A';

结果:

消息 8152、级别 16、状态 14、第 7 行
字符串或二进制数据将被截断。
该语句已终止。

我不得不质疑该错误是否真的发生在UNIQUEIDENTIFIER列上。我怀疑(a)错误发生在表中的不同列上,并且您尚未验证所有字符串长度,或者(b)表上有触发器并且错误正在那里发生。

如果您使用正确的参数而不是仅仅将一个字符串放在一起,您可以确保每个参数的定义与表中的完全一致。

于 2012-06-26T16:58:12.350 回答
1

可以修改 SQL INSERT 语句吗?为什么不将其设置为使用特定于该列的内容?

xxx, 
xxx,
convert(uniqueidentifier, 'A8AC30E7-B984-4E29-A97A-A434F2B2AB7C'), 
xxx, 
xxx
于 2012-06-26T16:56:13.487 回答