Sql server 无法使计算列可索引
以上是我实际问题的一个非常简化的摘录。我有一个函数,返回给定日期的年份,然后将该函数用作计算列。我希望计算列是可索引的 然而,尽管我在网上尝试了所有的建议,我不确定我遗漏了什么。我使用了“WITH SCHEMABINDING”关键字,还尝试了使用CONVERT/CAST和不使用CONVERT/CAST。问题在于该列不是确定性的,但文档中也指出YEAR()是确定性的 如果我只是在函数中返回一个静态声明值,那么该列将变为可索引的。年似乎打破了它 编辑: 我不想发布我最初的查询来保持简单,但也许我把它做得太简单了。我更新了更接近实际的函数查询 我有一个函数,返回给定日期的年份,然后将该函数用作计算列 那不是你贴的。您发布了一个返回当前年份的函数,这显然是不确定的 您可以编写一个函数,返回给定日期的年份,并将其用于索引计算列:Sql server 无法使计算列可索引,sql-server,indexing,deterministic,non-deterministic,Sql Server,Indexing,Deterministic,Non Deterministic,以上是我实际问题的一个非常简化的摘录。我有一个函数,返回给定日期的年份,然后将该函数用作计算列。我希望计算列是可索引的 然而,尽管我在网上尝试了所有的建议,我不确定我遗漏了什么。我使用了“WITH SCHEMABINDING”关键字,还尝试了使用CONVERT/CAST和不使用CONVERT/CAST。问题在于该列不是确定性的,但文档中也指出YEAR()是确定性的 如果我只是在函数中返回一个静态声明值,那么该列将变为可索引的。年似乎打破了它 编辑: 我不想发布我最初的查询来保持简单,但也许我把它
CREATE FUNCTION dbo.FN_GET_YEAR(@ID int) RETURNS int WITH SCHEMABINDING AS
BEGIN
RETURN (SELECT YEAR(begin_date) FROM dbo.tableName WHERE id = @ID);
END
GO
CREATE TABLE test_table (
id int,
fk_id int,
test AS dbo.FN_GET_YEAR(id)
);
SELECT COLUMNPROPERTY(OBJECT_ID('test_table'), 'test', 'IsIndexable') AS IsIndexableColumn;
我有一个函数,返回给定日期的年份,然后将该函数用作计算列
那不是你贴的。您发布了一个返回当前年份的函数,这显然是不确定的
您可以编写一个函数,返回给定日期的年份,并将其用于索引计算列:
CREATE FUNCTION dbo.FN_GET_YEAR(@ID int) RETURNS int WITH SCHEMABINDING AS
BEGIN
RETURN (SELECT YEAR(begin_date) FROM dbo.tableName WHERE id = @ID);
END
GO
CREATE TABLE test_table (
id int,
fk_id int,
test AS dbo.FN_GET_YEAR(id)
);
SELECT COLUMNPROPERTY(OBJECT_ID('test_table'), 'test', 'IsIndexable') AS IsIndexableColumn;
“我需要将外键和年份组合限制为每年一次。因此它将是唯一的索引。”
我不确定您所尝试的是否是一个好主意,但它肯定不能用计算列上的索引来强制执行,因为需要防止任何一个表中的更改
您可以使用索引视图执行此类操作。例如:
CREATE FUNCTION dbo.FN_GET_YEAR(@d datetime) RETURNS int WITH SCHEMABINDING AS
BEGIN
RETURN YEAR(@d);
END
GO
CREATE TABLE test_table (
id int,
dateCol datetime,
test AS dbo.FN_GET_YEAR(dateCol)
);
SELECT COLUMNPROPERTY(OBJECT_ID('test_table'), 'test', 'IsIndexable') AS IsIndexableColumn;
create index ix_test_table_test on test_table(test)
“我需要将外键和年份组合限制为每年一次。因此它将是唯一的索引。”
我不确定您所尝试的是否是一个好主意,但它肯定不能用计算列上的索引来强制执行,因为需要防止任何一个表中的更改
您可以使用索引视图执行此类操作。例如:
CREATE FUNCTION dbo.FN_GET_YEAR(@d datetime) RETURNS int WITH SCHEMABINDING AS
BEGIN
RETURN YEAR(@d);
END
GO
CREATE TABLE test_table (
id int,
dateCol datetime,
test AS dbo.FN_GET_YEAR(dateCol)
);
SELECT COLUMNPROPERTY(OBJECT_ID('test_table'), 'test', 'IsIndexable') AS IsIndexableColumn;
create index ix_test_table_test on test_table(test)
GETDATE()
是不确定的。提到因此,YEAR(GETDATE())
也是不确定的。当表dbo.tableName
更新时,索引中的数据会发生什么变化?我需要将外键和年份组合限制为每年一次。因此,它将是一个唯一的索引。此外,年份列将用于其他一些查询GETDATE()
是不确定的。提到因此,YEAR(GETDATE())
也是不确定的。当表dbo.tableName
更新时,索引中的数据会发生什么变化?我需要将外键和年份组合限制为每年一次。因此,它将是一个唯一的索引。此外,年份列将用于其他一些查询