【问题标题】:Computed Column Help - TSQL计算列帮助 - TSQL
【发布时间】:2011-04-30 12:55:00
【问题描述】:
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 这个词的语法不好。

这不是你声明计算列的方式吗?

【问题讨论】:

    标签: tsql calculated-columns


    【解决方案1】:

    您自己不声明 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))
    

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

    编辑:但是,只要计算列标记为PERSISTED,即

    ,指定NOT NULL 在语法上是有效的
    [point] AS geography::Point(latitude, longitude, 4326) PERSISTED NOT NULL
    

    在这种特殊情况下,但是尝试使用这样的定义创建表会导致运行时错误。

    表中的计算列“点” 'foo' 不能持久化,因为 列类型“地理”是 非字节排序的 CLR 类型。

    【讨论】:

    • 哦,好吧,所以类型 get 是由计算声明的——duh 是有道理的。除非您执行适当的检查,否则谁能说它不能为空。完全有道理。谢谢!
    • 实际上对于 CLR 数据类型,它可能总是假设它是 Nullable。我刚刚尝试在ISNULL 中进行包装,但它仍然在sys.computed_columns 中显示为is_nullable
    猜你喜欢
    • 2011-05-18
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多