Сравните Varchar и UniqueIdentifier - PullRequest
       10

Сравните Varchar и UniqueIdentifier

10 голосов
/ 10 августа 2009

Из-за довольно блестящего недосмотра в моем текущем проекте у нас есть несколько направляющих, хранящихся в столбце varchar в одной таблице, которые необходимо сравнить со столбцом uniqueidentifier в другой.

Как я могу это сделать? SQL-сервер просто говорит, что не может преобразовать символьную строку в уникальный идентификатор.

Ответы [ 4 ]

18 голосов
/ 10 августа 2009

Если SQL жалуется, что не может его привести, это означает, что вы не только сохранили уникальный идентификатор как varchar, вы использовали другой формат, чем SQL Server (например, вы добавили '{' и '}'). SQL прекрасно способен преобразовывать строку в uniqueidentifier при правильном форматировании:

declare @u uniqueidentifier;
declare @s varchar(64);

select @u = NEWID();
select @s = CAST(@u as varchar(64));
select CAST(@s as uniqueidentifier), @u, @s;

В зависимости от того, как вы на самом деле сохранили уникальный идентификатор, вам, скорее всего, придется изменить данные и код в соответствии с форматом SQL (нет {}).

5 голосов
/ 10 августа 2009

Преобразовать уникальный идентификатор в varchar:

CAST( uniqueidentifier_col_name as varchar)
4 голосов
/ 10 августа 2009

Я только что разработал следующий тестовый скрипт:

DECLARE
  @Foo Uniqueidentifier
 ,@Foo2 varchar(50)

SET @Foo = newid()
SET @Foo2 = newId()

print @Foo
print @Foo2

if @Foo = @Foo2
    print 'Yes'
else
    print 'No'

set @Foo = @Foo2

if @Foo = @Foo2
    print 'Yes'
else
    print 'No'

Запускается в окне SSMS или через файл slqcmd -i, результаты совпадают - SQL (2005) выполняет неявное преобразование Это поддерживает то, что я помню из SQL 2000, когда у меня была похожая проблема много лет назад.

Ключевым моментом является то, что строка varchar должна соответствовать шаблону guid:

  • 8 шестнадцатеричных цифр
  • тире
  • 4 шестнадцатеричных цифры
  • черточки
  • 4 шестнадцатеричных цифры
  • 1019 * черточки *
  • 4 шестнадцатеричных цифры
  • черточки
  • 12 шестнадцатеричных цифр
1 голос
/ 10 августа 2009

Вам придется наложить другой уникальный идентификатор на varchar.

SQL Server, вероятно, пытается преобразовать такие вещи, как "bob" в uniqueidentifier, и это не удается. Согласно CAST / CONVERT это разрешено, поэтому это должны быть значения в столбце varchar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...