2009-08-18 2 views
0

Я работаю с 2 связанными таблицами в среде Microsoft SQL Server 2008, которые связаны с помощью GUID. В одной таблице поле имеет тип varchar(50), а другой - типа uniqueidentifier. Очевидно, это плохо, но я не могу сейчас это изменить, потому что это дает устаревшая часть программного обеспечения.Преобразование типа в стойке вычисляемой колонки

Преобразование SQL Server должно выполняться при каждом внутреннем соединении, поэтому запросы выполняются очень медленно, поскольку я вообще не могу использовать индексы. Я попытался добавить вычисленный столбец, который сохраняется, чтобы получить идентификатор, сохраненный как uniqueidentifer. Таким образом, я мог бы добавить индекс, чтобы он работал намного быстрее. Я провалил.

Кто-нибудь знает, могу ли я сохранить явно преобразованное значение в столбце компьютера. Если смогу, то какая формула здесь используется?

Приветствия, Matthias

ответ

3

Это работает для меня:

CREATE TABLE t_uuid (charid VARCHAR(50) NOT NULL, uuid AS CAST(charid AS UNIQUEIDENTIFIER)) 

CREATE INDEX IX_uuid_uuid ON t_uuid (uuid) 

INSERT 
INTO t_uuid (charid) 
VALUES (NEWID()) 

SELECT * 
FROM t_uuid 
+0

Спасибо, отлично работает. Запрос занимает 4 с вместо полчаса. :) –

1

CONVERT (UniqueIdentifier, your_varchar_here)

+0

Хорошо работает. Management Studio говорит: «Ошибка проверки формулы для столбца« MyColumn »., Но тем не менее сохраняет изменения и работает. Странный... –

1

В зависимости от того, как часто вам нужно сделать преобразование для присоединения, я бы используйте CTE для преобразования типов данных. Он построен быстрее, чем встроенное представление (следующий лучший временный вариант). В любом случае вы выставляете значение в качестве правильного типа данных в столбце результата из окна CTE/inline, чтобы вы могли присоединиться к нему. КТР Пример:

WITH example AS (
    SELECT t.guid 
      CONVERT(UniqueIdentifier, t.guid) 'cguid' 
    FROM TABLE t) 
SELECT t.* 
    FROM TABLE t 
    JOIN example e ON e.cguid = t.guid 

Инлайн пример вид:

SELECT t.* 
    FROM TABLE t 
    JOIN (SELECT t.guid 
       CONVERT(UniqueIdentifier, t.guid) 'cguid' 
      FROM TABLE t) e ON e.cguid = t.guid 

Это не собирается обойти, что индекс для идентификатора (при условии, один делает) не будет использоваться, но это также не очень хорошая привычка для выполнения преобразования типа данных в предложении WHERE.

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

  • Нет связанных вопросов^_^