2010-04-23 1 views
1

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

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

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

Msg 8169, Level 16, State 2, Line 647 Conversion failed when converting from a character string to uniqueidentifier.

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

+3

BTW - изменение произвольной цифры в UUID представления не дает значение, которое является безопасным для использования. Если вы пытаетесь создать новый UUID, используйте 'NEWID()', как указано в @RobinDay. –

ответ

5

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

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

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

3

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

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

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

EDIT: Хорошо, так что если вы хотите, чтобы заменить последний символ с «1», то это решение

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

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

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

+0

Он пытается заменить последнюю цифру шестнадцатеричного представления GUID на «1», я полагаю? Не знаю, почему, хотя ... –

2

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

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

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

Смежные вопросы