У меня есть таблица, в которой хранятся значения через запятую в NVARCHAR (MAX).
Я создал представление, которое использует строковые манипуляции для преобразования этих значений через запятую в список xml. Затем я могу использовать этот столбец Xml для доступа к каждому элементу.
Запросы по этому столбцу получат большую выгоду, если я смогу его проиндексировать. Однако при попытке создать первичный XML-индекс я получаю сообщение «Представители XmlFoo не имеют кластеризованного первичного ключа. Для создания XML-индекса требуется кластеризованный первичный ключ для представления».
Можно ли сделать то, что мне нужно, и если да, то как я могу добавить первичный ключ к представлению при запросе? Я не думал, что это возможно.
Мой пример сценария выглядит следующим образом.
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, '&', '&'), '>', '>'), '<', '<'), '"', '"'), '''', '''), ',', '</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