使用 SCHEMABINDING 更改函数,用作具有索引的计算字段的公式
Posted
技术标签:
【中文标题】使用 SCHEMABINDING 更改函数,用作具有索引的计算字段的公式【英文标题】:Alter a function with SCHEMABINDING used as formula for a calculated field with index 【发布时间】:2019-06-10 17:01:32 【问题描述】:我有一个表,其中包含 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 服务器会显示错误
无法 ALTER 'dbo.MyFunctionTest' 它被对象 'TestTable' 引用。
更改函数的唯一方法似乎是创建一个新函数并更改表。
我也试过删除WITH SCHEMABINDING
【问题讨论】:
不是一个真正的问题,更多的是咆哮。这些是规则 - 由于依赖关系,您无法更改功能。 【参考方案1】:您可以删除列、更改函数并重新添加列:
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。
【讨论】:
Creating a new function will also mean you need to drop the column and add it back
在 sqlserver 2005 中我可以更改计算列...
我在 sql server 2005 上,我用一个新函数改变了一个计算列
官方文档从 2008 年开始(目前支持的最旧版本即将停止扩展支持),内存已经不是以前的样子了,所以我真的不知道 2005 版本可以实现。你真的应该考虑将你的 sql server 版本至少升级到 2012。
也许是 ide(sql server management studio)在后台“drop - alter”...升级,我想要,但不是我的公司:D以上是关于使用 SCHEMABINDING 更改函数,用作具有索引的计算字段的公式的主要内容,如果未能解决你的问题,请参考以下文章