Pregunta

Estoy trabajando con 2 mesas relacionados en un entorno de Microsoft SQL Server 2008 que están conectados a través de un GUID. En una tabla, el campo tiene el tipo varchar(50), el otro es propiamente tipos como uniqueidentifier. Obviamente, esto es malo, pero no puede cambiar esto ahora porque está dada por una pieza legado de software.

La conversión de SQL Server necesita para llevar a cabo al unir cada interno hace ejecutar consultas terriblemente lento, ya que no puedo utilizar índices en absoluto. He intentado añadir una columna calculada, que se persistió, para obtener el ID almacenado como un uniqueidentifer. Esta manera de que pudiera añadir un índice para ponerlo en marcha mucho más rápido, probablemente. Fallé.

¿Alguien sabe si puedo almacenar un valor explícitamente convertida en una columna de ordenador. Si yo puedo, ¿cuál es la fórmula para usar aquí?

Cheers, Matthias

¿Fue útil?

Solución

Esto funcionó para mí:

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

Otros consejos

CONVERT (uniqueidentifier, your_varchar_here)

En función de la frecuencia con la que necesita para hacer la conversión para la unión, que haría uso de un CTE para convertir el tipo (s) de datos. Su construcción es más rápido que una vista en línea (siguiente mejor opción temporal). En cualquier caso, te expones valor que el tipo de datos correcto en una columna de resultados de la vista / CTE en línea así que usted puede unirse a ella. CTE Ejemplo:

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

Inline vista ejemplo:

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

No va a obtener en torno a que el índice de GUID (suponiendo que uno hace) no será utilizada, pero tampoco es un buen hábito que se realiza la conversión de tipos de datos en la cláusula WHERE.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top