Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 无法使计算列可索引_Sql Server_Indexing_Deterministic_Non Deterministic - Fatal编程技术网

Sql server 无法使计算列可索引

Sql server 无法使计算列可索引,sql-server,indexing,deterministic,non-deterministic,Sql Server,Indexing,Deterministic,Non Deterministic,以上是我实际问题的一个非常简化的摘录。我有一个函数,返回给定日期的年份,然后将该函数用作计算列。我希望计算列是可索引的 然而,尽管我在网上尝试了所有的建议,我不确定我遗漏了什么。我使用了“WITH SCHEMABINDING”关键字,还尝试了使用CONVERT/CAST和不使用CONVERT/CAST。问题在于该列不是确定性的,但文档中也指出YEAR()是确定性的 如果我只是在函数中返回一个静态声明值,那么该列将变为可索引的。年似乎打破了它 编辑: 我不想发布我最初的查询来保持简单,但也许我把它

以上是我实际问题的一个非常简化的摘录。我有一个函数,返回给定日期的年份,然后将该函数用作计算列。我希望计算列是可索引的

然而,尽管我在网上尝试了所有的建议,我不确定我遗漏了什么。我使用了“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
更新时,索引中的数据会发生什么变化?我需要将外键和年份组合限制为每年一次。因此,它将是一个唯一的索引。此外,年份列将用于其他一些查询