Другой вариант, на который вы можете посмотреть - это вычисляемые столбцы, особенно если у вас есть один или несколько часто используемых столбцов.
В общем случае вычисляемый столбец - это просто столбец, значение которого вычисляется из чего-то другого и является актуальным в любое время, при этом вам не нужно постоянно его обновлять.
В сочетании с XML вы можете написать небольшую хранимую функцию и использовать ее для создания вычисляемого столбца в вашей «базовой» таблице, чтобы вы могли запрашивать и упорядочивать по этому столбцу без необходимости «доходить» до XML время.
В данном случае вы можете написать хранимую функцию для извлечения «BusinessName» и сделать ее доступной в вашей таблице UserProfile, например:
CREATE FUNCTION dbo.GetBusinessName(@input XML)
RETURNS VARCHAR(50)
WITH SCHEMABINDING
AS BEGIN
DECLARE @Result VARCHAR(50)
SELECT
@Result = @input.value('(Properties/property[@id="BusinessName"]/@name)[1]', 'VARCHAR(50)')
RETURN @Result
END
Это определяет хранимую функцию, которая будет принимать ваш профиль XML и искать «свойство» с «id» в «Business Name» и возвращать свой атрибут «name» обратно.
Чтобы добавить это в таблицу UserProfile, используйте этот код SQL:
ALTER TABLE UserProfile
ADD BusinessName AS dbo.GetBusinessName(Profile) PERSISTED
При этом вы добавляете новое вычисляемое поле с именем «BusinessName» в свою таблицу, и теперь вы можете выбирать и заказывать с помощью этого нового поля, например,
SELECT ID, BusinessName FROM UserProfiles ORDER BY BusinessName
Наслаждайтесь!
PS: Несколько слов о производительности: я обнаружил, что во многих случаях это на намного быстрее, чем постоянное выполнение запроса XML в поле XML. Поэтому, если у вас есть определенные элементы в XML, к которым вам часто требуется доступ, или которые могут отображаться в операторе ORDER BY, использование вычисляемого столбца на самом деле может значительно ускорить процесс.