2009-06-10 6 views
2

J'ai une table qui stocke les valeurs séparées par des virgules dans un NVARCHAR (MAX).SQL Server - Ajout d'un index XML à une colonne calculée sur une vue

J'ai créé une vue qui utilise la manipulation de chaînes pour convertir ces valeurs séparées par des virgules en une liste XML. Je peux alors utiliser cette colonne Xml pour accéder à chaque élément.

Les requêtes sur cette colonne bénéficieront grandement si je pouvais l'indexer. Cependant, en essayant de créer un index XML primaire, je reçois le message suivant: "Voir les ennemis de XmlFoo n'ont pas de clé primaire en cluster La création d'un index XML nécessite une clé primaire en cluster sur la vue."

Est-il possible de faire ce que je veux, et si oui, comment puis-je ajouter une clé primaire à une vue comme elle le demande? Je ne pensais pas que c'était possible.

Mon exemple de script est le suivant.

CREATE TABLE [dbo].[Foo](
    [FooId] [int] IDENTITY(1,1) NOT NULL, 
    [FooValues] NVARCHAR(MAX), 
    CONSTRAINT [PK_Foo] PRIMARY KEY CLUSTERED 
    (
     [FooId] ASC 
    )ON [PRIMARY] 
) ON [PRIMARY] 
GO 

CREATE VIEW [dbo].[XmlFoo] WITH SCHEMABINDING 
AS 
SELECT 
    FooId, 
    FooValues, 
    CONVERT(xml, '<FooValues><FooValue>' + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(FooValues, '&', '&amp;'), '>', '&gt;'), '<', '&lt;'), '"', '&quot;'), '''', '&apos;'), ',', '</FooValue><FooValue>') + '</FooValue></FooValues>') AS XmFoolValues 
FROM 
    [dbo].[Foo] 
GO 

INSERT INTO XmlFoo (FooValues) VALUES ('A,B,C') 
INSERT INTO XmlFoo (FooValues) VALUES ('1,2') 
INSERT INTO XmlFoo (FooValues) VALUES ('X,Y') 
INSERT INTO XmlFoo (FooValues) VALUES ('I') 
INSERT INTO XmlFoo (FooValues) VALUES ('9,8,7,6,5') 
GO 
SELECT * FROM XmlFoo 

Répondre

1

Ok, j'ai répondu à ma propre question. Le message d'erreur est évidemment un refrain rouge, au lieu de simplement dire que vous ne pouvez pas indexer une colonne xml sur une vue, il mentionne une clé primaire!

Vous ne pouvez pas créer un index XML, primaire ou secondaire, sur une colonne xml dans une vue, sur une variable table avec des colonnes xml ou sur des variables de type xml.

Here's a Tech Net article talking about this.

Questions connexes