От varchar(36) к UNIQUEIDENTIFIER

Я пытаюсь привести AuctionId, который является UNIQUEIDENTIFIER, к varchar(36), а затем обратно к UNIQUEIDENTIFIER. Пожалуйста помогите.

CAST((SUBSTRING(CAST([AuctionId] as VARCHAR(36)), 0, 35) + '1') AS UNIQUEIDENTIFIER)

Но я продолжаю получать эту ошибку:

Сообщение 8169, уровень 16, состояние 2, строка 647 Преобразование не удалось при преобразовании строки символов в уникальный идентификатор.

заранее спасибо


person user324169    schedule 23.04.2010    source источник
comment
Кстати, изменение произвольной цифры в представлении UUID не дает значения, безопасного для использования. Если вы пытаетесь создать новый UUID, используйте NEWID(), как упоминалось в @RobinDay.   -  person D.Shawley    schedule 23.04.2010


Ответы (3)


'1' не проблема. Очевидно, вы пытаетесь изменить последний символ GUID на 1. Не знаю почему, но это ваше требование.

Ваша проблема связана с подстрокой. В TSQL подстрока использует индекс, начинающийся с 1, не 0, как в C или C#. Это означает, что ваш оператор подстроки на самом деле возвращает строку из 34 символов (+1 дополнительный символ дает 35, и вам говорят, что строка из 35 символов не является GUID, что правильно).

Просто измените ,0,35 на 1,35

person David    schedule 23.04.2010

Ваша ошибка связана с вашим +'1' и вашей SUBSTRING. Для чего это у тебя там?

Это будет работать нормально

SELECT cast((cast(NEWID() as varchar(36))) as UNIQUEIDENTIFIER)

РЕДАКТИРОВАТЬ: Хорошо, поэтому, если вы хотите заменить последний символ на «1», это решение

SELECT CAST(SUBSTRING(CAST(NEWID() AS VARCHAR(36)), 1, 35) + '1' AS UNIQUEIDENTIFIER)

Единственное отличие состоит в том, что SUBSTRING в SQL начинается с позиции 1, а не с позиции 0, как у вас было.

P.S. Это опасный код. Выходные данные больше не являются GUID, поскольку они не будут соответствовать алгоритму, который использовался для создания GUID. Это может (хотя и маловероятно) привести к столкновению с GUID, что потенциально может вызвать всевозможные проблемы.

person Robin Day    schedule 23.04.2010
comment
Я полагаю, он пытается заменить последнюю цифру шестнадцатеричного представления GUID на 1? Хотя не знаю почему... - person David M; 23.04.2010

Как заметили другие, неясно, почему вы хотите делать то, что делаете.

Альтернативой SUBSTRING является команда STUFF:

SELECT stuff(cast([AuctionId] as varchar(36)),36,1,'1')

person Ed Harper    schedule 23.04.2010