6

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に変換できないため、一致しないか、おそらくエラーがスローされる可能性がありますか?

4

2 に答える 2

3

タイプは、文字式からのuniqueidentifier変換の目的で文字タイプと見なされるため、文字タイプに変換するための切り捨て規則に従います。つまり、文字式が異なるサイズの文字データ型に変換されると、新しいデータ型に対して長すぎる値は切り捨てられます。

uniqueidentifierタイプは36文字に制限されているため、その長さを超える文字は切り捨てられます。

上記はMSDNから引用されていることに注意してください

于 2012-05-02T08:41:26.327 に答える
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)

すべて同じ結果が得られ、エラーは発生しません。

これは文書化された動作であるため、実際に文句を言うことはできません。

次の例は、変換されるデータ型に対して値が長すぎる場合のデータの切り捨てを示しています。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)
于 2012-05-02T08:39:32.597 に答える