Справка по вычисляемым столбцам - TSQL - PullRequest
4 голосов
/ 30 апреля 2011
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 Ответ

6 голосов
/ 30 апреля 2011

Вы не объявляете 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 будет считать столбец обнуляемым , если вы не добавите ISNULL() вокруг формулы .

Однако я только что попробовал следующее определение столбца

[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.

...