От varchar (36) до УНИКАЛЬНЫХ - PullRequest
1 голос
/ 23 апреля 2010

Я пытаюсь привести AuctionId, который является UNIQUEIDENTIFIER к varchar(36), а затем обратно к УНИКАЛЬНОМУ ВИДУ Пожалуйста, помогите мне.

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

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

Сообщение 8169, уровень 16, состояние 2, строка 647 Конверсия не удалась при конвертации из строка символов для UniqueIdentifier.

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

Ответы [ 3 ]

5 голосов
/ 23 апреля 2010

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

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

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

3 голосов
/ 23 апреля 2010

Ваша ошибка связана с вашим + '1' и вашей ПОДПИСЬЮ. Зачем тебе это?

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

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, что потенциально может вызвать всевозможные проблемы.

2 голосов
/ 23 апреля 2010

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

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

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

...