在其上添加Computed Column和Put Index

时间:2014-10-30 11:54:15

标签: sql sql-server tsql

我有一张表,其中包括

CREATE TABLE [dbo].[ProductsAttributesValues](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ProductId] [int] NOT NULL,
    [AttributeId] [int] NOT NULL,
    [Value] [nvarchar](3000) NOT NULL
)

此表包含大量行。问题是[Value]列的很多时候都包含float或int值,但有时它也包含文本。现在,我想在float或int值上添加一个Index,以便索引有效地使用<, >, <=, >= and BETWEEN运算符。那么,我如何创建一个计算列,将该值转换为float,然后将index添加到此计算列中?这可能吗?

1 个答案:

答案 0 :(得分:1)

浮点表达式被认为是不精确的,不能是索引的键; float表达式可以在索引视图中使用,但不能用作键。对于计算列也是如此。如果任何函数,表达式或用户定义函数包含任何浮点表达式,则认为它们是不精确的。这包括逻辑的(比较)。

但是,如果在CREATE TABLE或ALTER TABLE语句中将列标记为PERSISTED,则可以在计算列上创建索引,该计算列使用确定性但不精确的表达式定义。取自here

-- This will add your float computed column:
ALTER TABLE ProductsAttributesValues ADD Value_Float AS 
(
    CASE WHEN ISNUMERIC([Value]) = 1 THEN
        CONVERT(float, [Value]) 
    ELSE 
        NULL 
    END 
) PERSISTED;

-- This will create the index:
CREATE INDEX IX_ProductsAttributesValues_Value_Float 
ON ProductsAttributesValues (Value_Float);