Почему бы не использовать его в качестве вычисляемого столбца , который будет всегда правильным и не потребует дополнительных усилий по обслуживанию:
CREATE FUNCTION dbo.GetName
(
@xml XML
)
RETURNS NVARCHAR(100)
WITH RETURNS NULL ON NULL INPUT
, SCHEMABINDING
AS
BEGIN
RETURN @xml.value('/Employees[1]/Person[1]/Name[1]', 'nvarchar(100)')
END
GO
CREATE TABLE [dbo].[tbl](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Year] [int] NOT NULL,
[Month] [int] NOT NULL,
[Fields] [xml] NOT NULL,
[NameFromXML] AS dbo.GetName(Fields) persisted
) ON [PRIMARY]
insert into dbo.tbl (Year,Month,Fields)
select 1,1,'<Employees>
<Person>
<ID>0</ID>
<Name>Ligha</Name>
<LName>Agha</LName>
</Person>
</Employees>'
select * from dbo.tbl
Iпришлось добавить SCHEMABINDING
к функции, чтобы она воспринималась как детерминированная .Это, в свою очередь, позволило мне пометить вычисляемый столбец как persisted
, что означает, что он, в свою очередь, может быть проиндексирован при необходимости.