计算列帮助 - TSQL

时间:2011-04-30 12:55:01

标签: tsql calculated-columns

CREATE TABLE [dbo].[tblLocations](
    [latitude] [float] NOT NULL,
    [longitude] [float] NOT NULL,
    [location] [varchar](500) NOT NULL,
    [timestamp] [datetime] NOT NULL,
    [point] [geography] AS geography::Point(latitude, longitude, 4326) NOT NULL
)

在单词AS上给我错误的语法。

这不是你如何声明计算列吗?

1 个答案:

答案 0 :(得分:6)

您不自行声明datatype或可空性

CREATE TABLE [dbo].[tblLocations](
    [latitude] [float] NOT NULL,
    [longitude] [float] NOT NULL,
    [location] [varchar](500) NOT NULL,
    [timestamp] [datetime] NOT NULL,
    [point] AS geography::Point(latitude, longitude, 4326) 
)

通常,SQL Server会假定该列可以为空unless you add an ISNULL() around the formula

但是我只是尝试了以下列定义

[point2] AS ISNULL(geography::Point(latitude, longitude, 4326),
    geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326))

并且仍然在is_nullable中显示为sys.computed_columns,因此它看起来不适用于CLR数据类型(可能因为SQL Server不相信这些是确定性的)。

编辑但是只要计算列标记为NOT NULL 在语法上有效指定PERSISTED,即

[point] AS geography::Point(latitude, longitude, 4326) PERSISTED NOT NULL

在这种特殊情况下,尝试创建具有此类定义的表会产生运行时错误。

  

表格中的计算列“点”   'foo'不能坚持,因为   列类型,'地理',是一个   非字节顺序的CLR类型。