使用 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 更改函数,用作具有索引的计算字段的公式的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server-聚焦在视图和UDF中使用SCHEMABINDING(二十六)

sql 使用SchemaBinding的MS SQL视图

我可以将继承的类指针用作父类指针吗?

sqlserver自定义函数

为啥我不能更改实例化后用作属性的结构中的字段?

用作 base-64 背景图像数据时如何更改 svg 填充颜色?