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

Sim*_*mon 3 c# sql-server-2008

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

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

INSERT INTO table VALUES ('abc','blah',...)
Run Code Online (Sandbox Code Playgroud)

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

有没有一种方法可以生成一个有效的文字UNIQUEIDENTIFIER,我可以传递给这个方法?我试过Guid.NewGuid.ToString(),它给了我一个像这样的文字'bfdb0297-2018-4555-ac12-88064944a671',但我的查询然后错误与数据截断异常.我也尝试删除连字符.我希望32个十六进制字符可以工作.

我知道参数化查询是正确的方法,但这意味着现有代码的重要工作.

我非常擅长使用C#而且非常适合使用SQL Server.

[编辑]

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

非常感谢所有响应者.

Nic*_*ley 8

SQL Server中文字UNIQUEIDENTIFIER如下所示:

SELECT {guid'8DEC377B-6D75-424B-AE01-D3727993C7F6'}
Run Code Online (Sandbox Code Playgroud)

如文档中所示:

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

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

  • 文档链接将我带到一个名为“Entity SQL”的页面,根据同一页面上的链接,该页面与 T-SQL 不同。 (2认同)
  • 如前所述,您链接的文档适用于 Entity SQL,而不是 T-SQL。您在这里实际使用的不是 T-SQL,而是一个名为“Guid Escape Sequences”的 ODBC 扩展](https://learn.microsoft.com/en-us/sql/odbc/reference/appendixes/guid-转义序列?view=sql-server-ver15)。这可以在许多应用程序中使用,但我认为将其描述为“SQL Server 中的文字 UNIQUEIDENTIFIER”是不正确的。 (2认同)

Aar*_*and 4

由于这工作正常:

DECLARE @x TABLE(y UNIQUEIDENTIFIER); 

INSERT @x SELECT 'bfdb0297-2018-4555-ac12-88064944a671';
Run Code Online (Sandbox Code Playgroud)

这会失败并显示您当前收到的通用错误消息:

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

INSERT @x 
  SELECT 'bfdb0297-2018-4555-ac12-88064944a671',
         '0123456789A';
Run Code Online (Sandbox Code Playgroud)

结果:

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

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

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