使用 SCHEMABINDING 更改函数用作带索引的计算字段的公式
Alter a function with SCHEMABINDING used as formula for a calculated field with index
我有一个 table,带有 PERSISTED
和基于函数结果 (MyFunctionTest
) 的索引计算字段 (Test
),例如:
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 服务器显示错误
Cannot ALTER 'dbo.MyFunctionTest' it is being referenced by object 'TestTable'.
改变函数的唯一方法似乎是创建一个新函数来改变 table。
我也尝试删除 WITH SCHEMABINDING
您可以删除该列,更改函数,然后重新添加该列:
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
创建新函数还意味着您需要删除该列并将其添加回来,因为 computed columns can't be altered。
我有一个 table,带有 PERSISTED
和基于函数结果 (MyFunctionTest
) 的索引计算字段 (Test
),例如:
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 服务器显示错误
Cannot ALTER 'dbo.MyFunctionTest' it is being referenced by object 'TestTable'.
改变函数的唯一方法似乎是创建一个新函数来改变 table。
我也尝试删除 WITH SCHEMABINDING
您可以删除该列,更改函数,然后重新添加该列:
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
创建新函数还意味着您需要删除该列并将其添加回来,因为 computed columns can't be altered。