SQL查询无法按预期工作

时间:2012-05-02 08:33:08

标签: asp.net sql-server

我在SQL Server中使用标准的ASP.NET Membership表结构,并且正在管理工作室中进行一些手动查询并运行此查询

SELECT *
FROM [aspnet_Users]
WHERE UserId = '2ac5dd56-2630-406a-9fb8-d4445bc781da&cID=49'

注意最后的& cID = 49 - 我从查询字符串复制了这个并忘记删除该部分。

然而,令我惊讶的是它正确地返回了数据(有一个ID为2ac5dd56-2630-406a-9fb8-d4445bc781da的用户) - 任何想法为什么会这样做?在我看来它不应该匹配或者更可能抛出错误,因为它不能转换为Guid?

2 个答案:

答案 0 :(得分:3)

uniqueidentifier类型被认为是用于从字符表达式转换的字符类型,因此受到转换为字符类型的截断规则的约束。也就是说,当字符表达式转换为不同大小的字符数据类型时,对于新数据类型而言太长的值将被截断

由于uniqueidentifier类型限制为36个字符,超出该长度的字符将被截断。

请注意,上述内容来自MSDN

答案 1 :(得分:2)

在将字符串文字转换为guid文字时,解析器(显着)是宽松的,显然:

SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52' AS uniqueidentifier)
SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52a' AS uniqueidentifier)
SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52-!' AS uniqueidentifier)
SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52~#5' AS uniqueidentifier)
SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52$3%] ' AS uniqueidentifier)

都给出相同的结果,没有错误。

This is documented behaviour,所以我们无法抱怨:

  

以下示例演示了截断数据时的情况   转换为的数据类型的值太长。因为   uniqueidentifier类型限制为36个字符,即字符   超过那个长度被截断。

DECLARE @ID nvarchar(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue;
     

这是结果集。

String                                       TruncatedValue
-------------------------------------------- ------------------------------------
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong    0E984725-C51C-4BF4-9960-E1C80E27ABA0

(1 row(s) affected)