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