2011-04-30 91 views
4
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

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

回答

5

你不声明或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_columnsis_nullable所以它看起来并不像一个适用于CLR数据类型(可能是因为SQL Server不相信这些是确定性的)。

编辑:然而语法有效的,只要计算列标记指定NOT NULL作为PERSISTED

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

在这种特殊情况下,却试图创建一个表,这样的定义给出了运行时错误。在表 “富”

计算列“点”不能持久,因为 列类型,“地理”,是一个 非字节顺序的CLR类型。

+0

哦好的,所以类型get的计算声明 - 杜老师有道理。除非你进行适当的检查,否则谁说它不能为空。非常有意义。谢谢! – slandau 2011-04-30 12:59:38

+0

实际上对于CLR数据类型,它可能总是假定它是可空的。我只是尝试在'ISNULL'中打包,并且它仍然显示为'sys.computed_columns'中的'is_nullable' – 2011-04-30 13:05:51