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

问题描述 投票:0回答:3

我正在编写一个实用程序 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 的评论,即重要的工作并不是不做正确事情的借口,并且创建了一种方法来生成参数化查询,该方法现在运行良好。

非常感谢所有回复者。

c# sql-server-2008
3个回答
20
投票
SQL Server 中的

文字

UNIQUEIDENTIFIER
看起来像这样:

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

如文档中所示:

它是由 关键字

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

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


4
投票

因为这工作正常:

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)表上有一个触发器并且错误发生在那里。

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


1
投票

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

xxx, 
xxx,
convert(uniqueidentifier, 'A8AC30E7-B984-4E29-A97A-A434F2B2AB7C'), 
xxx, 
xxx
© www.soinside.com 2019 - 2024. All rights reserved.