2011-04-30 89 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