2009-08-18 7 views
0

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

La conversion que SQL Server doit effectuer à chaque jointure interne rend les requêtes terriblement lentes, car je ne peux pas utiliser d'index du tout. J'ai essayé d'ajouter une colonne calculée, qui est persistante, pour obtenir l'ID stocké en tant que uniqueidentifer. De cette façon, je pourrais ajouter un index pour le faire fonctionner beaucoup plus vite probablement. J'ai échoué.

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

Cheers, Matthias

Répondre

3

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 
+0

Merci, cela fonctionne très bien. La requête prend 4sec au lieu d'une demi-heure maintenant. :) –

1

CONVERT (uniqueidentifier, your_varchar_here)

+0

Fonctionne bien. Management Studio indique 'Erreur lors de la validation de la formule pour la colonne 'MyColumn'.', mais enregistre néanmoins les modifications et cela fonctionne. Étrange... –

1

En fonction de la fréquence que vous devez faire la conversion pour l'assemblage, je utilisez un CTE pour convertir le (s) type (s) de données. Il est construit plus rapidement qu'une vue en ligne (meilleure option temporaire). Dans les deux cas, vous exposez la valeur comme le type de données correct dans une colonne de résultat de la vue CTE/inline afin que vous puissiez 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 

exemple de vue Inline:

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 la conversion de type de données dans la clause WHERE.