Question

Je travaille avec 2 tables liées dans un environnement Microsoft SQL Server 2008 qui sont connectés via un GUID. Dans une table, le champ a le varchar(50) de type, l'autre est correctement types comme uniqueidentifier. Ceci est évidemment mauvais, mais je ne peux pas changer cela maintenant parce qu'il est donné par un morceau de l'héritage du logiciel.

La conversion SQL Server doit effectuer à chaque jointure interne fait des requêtes en cours d'exécution terriblement lent, puisque je ne peux pas utiliser des indices du tout. J'ai essayé d'ajouter une colonne calculée, qui est persisté, pour obtenir l'ID stocké en tant que uniqueidentifer. De cette façon, je pourrais ajouter un index pour le faire fonctionner beaucoup plus rapidement sans doute. J'échoué.

Quelqu'un sait si je peux stocker une valeur convertie explicitement dans une colonne d'ordinateur. Si je peux, quelle est la formule à utiliser ici?

Cordialement, Matthias

Était-ce utile?

La solution

Cela a fonctionné pour moi:

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

Autres conseils

CONVERT (uniqueidentifier, your_varchar_here)

En fonction de la fréquence à laquelle vous devez faire la conversion pour rejoindre, j'utiliser un CTE pour convertir le type de données (s). Il est construit plus rapidement qu'une vue en ligne (meilleure option temporaire). Dans les deux cas, vous exposer la valeur en tant que type de données correct dans une colonne de résultat de la vue CTE / en ligne de sorte que vous pouvez vous joindre à elle. CTE Exemple:

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

vue Inline exemple:

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

Il ne va pas de se déplacer que l'indice pour guid (en supposant que l'on fait) ne sera pas utilisé, mais il est pas non plus une bonne habitude à effectuer une conversion de type de données dans la clause WHERE.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top