C# 在INSERT INTO查询中为UNIQUEIDENTIFIER生成文本

C# 在INSERT INTO查询中为UNIQUEIDENTIFIER生成文本,c#,sql-server-2008,C#,Sql Server 2008,我正在编写一个实用程序C#,用于将一个包含大约80列的大型CSV导入SQL Server 2008表 CSV需要在导入前进行操作,例如合并某些列、转换日期等。因此,我正在将插入到语句中,如下所示: INSERT INTO table VALUES ('abc','blah',...) 我的问题是该表包含类型为uniquedentifier的列。这是一个问题,因为我想重新使用一个现有的方法,该方法获取一组值并返回值字符串,直接弹出到我的INSERT-into语句中,并处理撇号、消除注入攻击等 是

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

CSV需要在导入前进行操作,例如合并某些列、转换日期等。因此,我正在将
插入到
语句中,如下所示:

INSERT INTO table VALUES ('abc','blah',...)
我的问题是该表包含类型为
uniquedentifier
的列。这是一个问题,因为我想重新使用一个现有的方法,该方法获取一组值并返回值字符串,直接弹出到我的
INSERT-into
语句中,并处理撇号、消除注入攻击等

是否有一种方法可以为我可以传递给此方法的
唯一标识符
生成有效的文本?我尝试了
Guid.NewGuid.ToString()
,这给了我一个类似于“bfdb0297-2018-4555-ac12-88064944a671”的文本,但我的查询随后出现错误,出现了数据截断异常。我也试过去掉连字符。我希望32个十六进制字符可以工作

我知道参数化查询是正确的方法,但这将意味着对现有代码进行大量的重新工作

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

[编辑]

我做过几件事。首先,编写了一个查询,用Guid.NewGuid更新该列。因此,截断误差并非来自于此。检查SQL Server引用使我相信截断错误不是从id列中的错误值返回的,而是无效值错误。我还考虑了Aaron的评论,即重要的工作并不是做得不好的借口,并且创建了一个方法来生成一个参数化查询,该方法现在运行良好


非常感谢所有响应者。

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

xxx, 
xxx,
convert(uniqueidentifier, 'A8AC30E7-B984-4E29-A97A-A434F2B2AB7C'), 
xxx, 
xxx
因为这很好用:

DECLARE@x表(y唯一标识符);
插入@x选择“bfdb0297-2018-4555-ac12-88064944a671”;
此操作失败,并显示您当前收到的一般错误消息:

DECLARE@x表
(
y唯一标识符,
z字符(10)
); 
插入@x
选择“bfdb0297-2018-4555-ac12-8806944A671”,
‘0123456789A’;
结果:

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

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

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

a如下所示:

SELECT {guid'8DEC377B-6D75-424B-AE01-D3727993C7F6'}
如文件所示:

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


似乎没有人知道这一点。这是我所看到的第一种实际具有文本GUID/UUID的语言。

能否显示表结构、失败的示例insert语句以及确切的错误消息?这对我来说很好:
DECLARE@x表(y UNIQUEIDENTIFIER);插入@x选择“bfdb0297-2018-4555-ac12-88064944a671”-我猜可能是另一个列导致了问题,或者可能是触发器。此外,“工作量”不应该是“正确操作”的最高级别标准……这确实有效,但文档链接会让我投票。如果有人需要GUID生成器:很好,文档链接不仅显示了这一点,还显示了类似的时间、日期时间等前缀。美好的文档链接将我带到一个名为“实体SQL”的页面,根据该页面上的链接,该页面与T-SQL不同。请注意,需要包含
{
}
字符。