Измените функцию с SCHEMABINDING, используемой в качестве формулы для вычисляемого поля с индексом - PullRequest
0 голосов
/ 16 января 2019

У меня есть таблица с PERSISTED и индексированным вычисляемым полем (Test), основанным на результате функции (MyFunctionTest), например ::

CREATE TABLE [dbo].[TestTable] (
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Foo] [int] NOT NULL,
    [Test]  AS ([dbo].[MyFunctionTest]([Foo])) PERSISTED,
    CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

MyFunctionTest:

ALTER FUNCTION [dbo].[MyFunctionTest]
(
    @foo int
)
RETURNS int
WITH SCHEMABINDING
AS
BEGIN
    RETURN @foo * 2
END

Если я пытаюсь изменить функцию, SQL-сервер показывает ошибку

Невозможно изменить значение 'dbo.MyFunctionTest', на которое ссылается объект 'TestTable'.

Единственный способ изменить функцию - создать новый способ изменить таблицу.

Я также пытался удалить WITH SCHEMABINDING

1 Ответ

0 голосов
/ 16 января 2019

Вы можете удалить столбец, изменить функцию и добавить столбец обратно:

ALTER TABLE [dbo].[TestTable]
    DROP COLUMN [Test];

GO

ALTER FUNCTION [dbo].[MyFunctionTest]
(
    @foo int
)
RETURNS int
WITH SCHEMABINDING
AS
BEGIN
    RETURN @foo * 2
END
GO

ALTER TABLE [dbo].[TestTable]
    ADD [Test] AS ([dbo].[MyFunctionTest]([Foo])) PERSISTED

Создание новой функции также означает, что вам нужно удалить столбец и добавить его обратно, поскольку вычисляемые столбцы не могут быть изменены .

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