как установить значение по умолчанию для столбца с помощью скалярной функции - PullRequest
0 голосов
/ 20 января 2012

У меня есть такая таблица:

CREATE TABLE [dbo].[tbl](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Year] [int] NOT NULL,
[Month] [int] NOT NULL,
[Fields] [xml] NOT NULL,
[NameFromXML] [nvarchar](1000) NULL
) ON [PRIMARY]

в Fields столбце Я храню XML следующим образом:

<Employees>
   <Person>
      <ID>0</ID>
      <Name>Ligha</Name>
      <LName>Agha</LName>
   </Person>
</Employees>

Хорошо. Я хочу сохранить значение элемента Name в NameFromXML. Я пишу эту функцию:

CREATE FUNCTION dbo.GetName
(
        @xml XML
)
RETURNS NVARCHAR(100)
WITH RETURNS NULL ON NULL INPUT
AS
   BEGIN
  RETURN @xml.value('/Employees[1]/Person[1]/Name[1]', 'nvarchar(100)')
   END
GO

но когда я пишу этот код для добавления по умолчанию:

ALTER TABLE tbl_Test_XML_Index_View  ADD CONSTRAINT  df_f  DEFAULT(dbo.GetName(Fields)) 
FOR namefromXML 

Я получил эту ошибку:

Название «Поля» в этом контексте не допускается. Допустимые выражения - это константы, константные выражения и (в некоторых контекстах) переменные. Имена столбцов не допускаются.

Как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 20 января 2012

Почему бы не использовать его в качестве вычисляемого столбца , который будет всегда правильным и не потребует дополнительных усилий по обслуживанию:

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, что означает, что он, в свою очередь, может быть проиндексирован при необходимости.

1 голос
/ 20 января 2012

Кажется, вы пытаетесь сохранить избыточные данные для каждой строки. Что произойдет, если каким-то образом изменить это имя в XML? Как позаботиться об обновлении столбца NameFromXML? Используя триггеры? Я могу дать вам совет, чтобы просто хранить нужные данные, используя обычные столбцы. Запись / вставка обновленных хранимых процедур с использованием XML в качестве параметра и вставка данных из него в соответствующие столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...