在INSERT INTO查询中为UNIQUEIDENTIFIER生成文字

时间:2012-06-26 16:51:11

标签: c# sql-server-2008

我正在编写一个实用程序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的观点,即重要的工作不是没有正确行事的借口,并且已经创建了一种生成参数化查询的方法,该方法现在工作正常。

非常感谢所有响应者。

3 个答案:

答案 0 :(得分:8)

literal UNIQUEIDENTIFIER in SQL Server看起来像这样:

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

如文档中所示:

  

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

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

答案 1 :(得分: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';

结果:

  

Msg 8152,Level 16,State 14,Line 7
字符串或二进制数据   被截断。
该声明已被终止。

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

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

答案 2 :(得分:0)

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

xxx, 
xxx,
convert(uniqueidentifier, 'A8AC30E7-B984-4E29-A97A-A434F2B2AB7C'), 
xxx, 
xxx