Как # интерпретируется в Guid / UNIQUEIDENTIFIER (SQL Server) - PullRequest
4 голосов
/ 28 марта 2012

Вот поведение, о котором я узнал только по ошибке. В таблице в SQL Server есть столбец UNIQUEIDENTIFIER, и я выполнил запрос вроде:

SELECT * FROM Tbl WHERE GuidColumn = N'2B375CD8-D210-463F-A2FD-EAFB0D643664#1'

№ 1 в конце Guid попал туда по ошибке, поскольку я скопировал его с URL-адреса, который добавлял # 1, # 2, # 3 и т. Д., Представляющий подкачку.

Что меня удивило, так это то, что запрос выполнялся нормально, и я получил тот же результат, что и при запуске:

SELECT * FROM Tbl WHERE GuidColumn = N'2B375CD8-D210-463F-A2FD-EAFB0D643664'

Кто-нибудь знает, как # и что-либо после интерпретируется в таком сценарии?

Ответы [ 3 ]

5 голосов
/ 28 марта 2012

Это явно рассматривается в MSDN: http://msdn.microsoft.com/en-us/library/ms187942.aspx

Это не означает ничего - сервер SQL читает только первые 36 символов строки при преобразовании в Guid.

Разъяснение

После комментария Джона Гатого о деле '{GUID}[gibberish]' (и после принятия) я думаю, что могу немного расширить правило.

1) Если эта строка начинается с '{', то 38th ДОЛЖЕН быть '}' (пробуйте даже пробелы в начале и в конце - это не будет работать), в противном случае преобразование завершится неудачно. Затем 36 символов внутри преобразуются.

2) В противном случае используются первые 36 символов.

Таким образом, вы можете добавить :), << и antidisestablishmentarianism - после 38-го символа в 1) или 36-го в 2), без разницы.

2 голосов
/ 28 марта 2012

Я подозреваю, что механизм запросов видит, что он является уникальным идентификатором и внутренне просто усекается до 36 символов - так что все, что потом будет просто игнорироваться. Это также отлично работает, поэтому не имеет абсолютно никакого отношения к знаку #:

SELECT CONVERT(UNIQUEIDENTIFIER, 'F9B8E808-E589-499B-8E57-22B7CBB2D63E ...
       and here is some extra garbage for fun');

Результаты:

------------------------------------
F9B8E808-E589-499B-8E57-22B7CBB2D63E
2 голосов
/ 28 марта 2012

GUID имеет фиксированную ширину, поэтому дополнительный символ удаляется во время преобразования типа;

declare @g uniqueidentifier = '2B375CD8-D210-463F-A2FD-EAFB0D643664#1'
select @g
>> 2B375CD8-D210-463F-A2FD-EAFB0D643664
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...