Asp.net SQL查询未按预期工作

Asp.net SQL查询未按预期工作,asp.net,sql-server,Asp.net,Sql Server,我在SQL Server中使用标准ASP.NET成员资格表结构,在Management studio中进行了一些手动查询,并运行了此查询 SELECT * FROM [aspnet_Users] WHERE UserId = '2ac5dd56-2630-406a-9fb8-d4445bc781da&cID=49' 请注意结尾处的&cID=49-我从一个查询字符串复制了它,但忘了删除该部分 然而,令我惊讶的是,它正确地返回了数据(有一个ID为2ac5dd56-2630-406a-9fb

我在SQL Server中使用标准ASP.NET成员资格表结构,在Management studio中进行了一些手动查询,并运行了此查询

SELECT *
FROM [aspnet_Users]
WHERE UserId = '2ac5dd56-2630-406a-9fb8-d4445bc781da&cID=49'
请注意结尾处的&cID=49-我从一个查询字符串复制了它,但忘了删除该部分

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

在将字符串文字转换为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)
所有结果都相同,没有错误

,所以我们不能抱怨:

下面的示例演示了当 值太长,无法转换为数据类型。因为 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)
出于从字符表达式转换的目的,该类型被视为字符类型,因此受转换为字符类型的截断规则的约束。也就是说,当字符表达式转换为不同大小的字符数据类型时,对于新数据类型来说过长的值将被截断

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

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

请注意,上面引用了

DB的值是多少?谢谢,这现在更有意义了,但我同意这很奇怪-如果我传入一个小于36个字符的值,那么我会得到一个转换错误,因此我的预期是,如果传入的值超过36个字符,那么它也会失败!谢谢,我现在明白了——不过这似乎很奇怪!