Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Синтаксис CREATE TABLE


Автор: keos 23.4.2010, 10:50
Добрый день!
Разбираюсь с синтаксисом CREATE TABLE. В документации встретил вот такое определение команды:
Код

CREATE TABLE [[database_name.]schema_name.] table_name 
( { <column_definition> | <computed_column_definition> } [ <table_constraint> ] [ ,...n ] ) 
[ ON { 
  partition_scheme_name ( partition_column_name ) 
  | 
  filegroup_name
  | 
  "default" 
} ] 
[ { TEXTIMAGE_ON { filegroup_name | "default" } ] 
[ GO ]

<column_definition> ::=
column_name <data_type>
    [COLLATE collation_name] 
    [ NULL | NOT NULL ]
    [ [ CONSTRAINT constraint_name ] DEFAULT constant_expression ] 
    | 
    [ IDENTITY [ ( seed , increment ) ] [ NOT FOR REPLICATION ] ]
    [ ROWGUIDCOL ] [ <column_constraint> [ ...n ] ] 

<data_type> ::= 
[ type_schema_name . ] type_name 
    [ ( precision_num [ , scale_num ] | max_num | [ { CONTENT | DOCUMENT } ] xml_schema_collection_name ) ] 

<column_constraint> ::= 
[ CONSTRAINT constraint_name ] 
{     { PRIMARY KEY | UNIQUE } 
        [ CLUSTERED | NONCLUSTERED ] 
        [ 
            WITH FILLFACTOR = fillfactor  
          | WITH ( < index_option > [ , ...n ] ) 
          ]
        [ ON { partition_scheme_name ( partition_column_name ) 
            | filegroup_name | "default" } ]
  | [ FOREIGN KEY ] 
        REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ] 
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ NOT FOR REPLICATION ] 
  | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) 
} 

<computed_column_definition> ::=
column_name AS computed_column_expression 
[ PERSISTED [ NOT NULL ] ]
[ 
    [ CONSTRAINT constraint_name ]
    { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        [ 
            WITH FILLFACTOR = fillfactor 
          | WITH ( <index_option> [ , ...n ] )
        ]
        [ ON { partition_scheme_name ( partition_column_name ) 
            | filegroup_name | "default" } ]
    | [ FOREIGN KEY ] 
        REFERENCES referenced_table_name [ ( ref_column ) ] 
        [ ON DELETE { NO ACTION | CASCADE } ] 
        [ ON UPDATE { NO ACTION } ] 
        [ NOT FOR REPLICATION ] 
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) 
] 

< table_constraint > ::=
[ CONSTRAINT constraint_name ] 
{ 
    { PRIMARY KEY | UNIQUE } 
        [ CLUSTERED | NONCLUSTERED ] 
                (column [ ASC | DESC ] [ ,...n ] ) 
        [ 
            WITH FILLFACTOR = fillfactor 
           |WITH ( <index_option> [ , ...n ] ) 
        ]
        [ ON { partition_scheme_name (partition_column_name)
            | filegroup_name | "default" } ] 
    | FOREIGN KEY 
                ( column [ ,...n ] ) 
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ] 
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ NOT FOR REPLICATION ] 
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) 
} 

<index_option> ::=
{ 
    PAD_INDEX = { ON | OFF } 
  | FILLFACTOR = fillfactor 
  | IGNORE_DUP_KEY = { ON | OFF } 
  | STATISTICS_NORECOMPUTE = { ON | OFF } 
  | ALLOW_ROW_LOCKS = { ON | OFF} 
  | ALLOW_PAGE_LOCKS ={ ON | OFF} 
}


Что может входить в constant_expression в <column_definition>, fillfactor в <column_constraint>, computed_column_expression в <computed_column_definition>?
И в <column_definition> при перечислении <column_constraint> действительно должно быть [ <column_constraint> [ ...n ] ]  или все же [ <column_constraint> [ ,...n ] ] ? 
Возможно в определении синтаксиса есть еще какие-то ошибки?

Добавлено через 14 минут и 45 секунд
И, возможно, здесь
Код

CREATE TABLE [[database_name.]schema_name.] table_name 
( { <column_definition> | <computed_column_definition> } [ <table_constraint> ] [ ,...n ] ) 

нужно перенести фигурную скобку
Код

CREATE TABLE [[database_name.]schema_name.] table_name 
( { <column_definition> | <computed_column_definition> | <table_constraint> } [ ,...n ] ) 

?

Автор: keos 23.4.2010, 11:52
В <computed_column_definition>
Код

[ ON UPDATE { NO ACTION } ] 

Нужны ли фигурные скобки?

Автор: Zloxa 23.4.2010, 13:23
я не совсем понимаю, вы собираетесь переписать документацию?

Автор: Zloxa 23.4.2010, 13:41
http://msdn.microsoft.com/ru-ru/library/ms177563(v=SQL.90).aspx,http://msdn.microsoft.com/ru-ru/library/ms174979(SQL.90).aspx
Цитата(keos @  23.4.2010,  10:50 Найти цитируемый пост)
нужно перенести фигурную скобку

Если фигурную скобку перенесем, получится, что constrait - обязательный элемент синтаксиса, и можно создать таблицу с одним лишь только констрейнтом а это не так.
Цитата(keos @  23.4.2010,  10:50 Найти цитируемый пост)
И в <column_definition> при перечислении <column_constraint> действительно должно быть [ <column_constraint> [ ...n ] ]  или все же [ <column_constraint> [ ,...n ] ] ? 

На один столбец можно повесить несколько констрейнтов и они не через запятую перечисляются

Цитата(keos @  23.4.2010,  10:50 Найти цитируемый пост)
constant_expression в <column_definition> 

Цитата

constant_expression
Константа, значение NULL или системная функция, используемая в качестве значения столбца по умолчанию.

Цитата(keos @  23.4.2010,  10:50 Найти цитируемый пост)
 fillfactor в <column_constraint>

Цитата

Пользовательские значения аргумента fillfactor могут находиться в диапазоне от 1 до 100.

Цитата(keos @  23.4.2010,  10:50 Найти цитируемый пост)
computed_column_expression в <computed_column_definition>

Цитата

computed_column_expression
Выражение, определяющее значение вычисляемого столбца. Вычисляемый столбец представляет собой виртуальный столбец, физически не хранящийся в таблице, если для него не установлен признак PERSISTED. Значение столбца вычисляется на основе выражения, использующего другие столбцы той же таблицы. Например, определение вычисляемого столбца может быть следующим: cost AS price * qty. Выражение может содержать имена невычисляемых столбцов, константы, функции и переменные, объединенные с помощью одного или нескольких операторов. Выражение не может быть вложенным запросом или содержать типы данных-псевдонимы.

Цитата(keos @  23.4.2010,  11:52 Найти цитируемый пост)
Нужны ли фигурные скобки? 

пожалуй - нет, смысла они не меняют, но и не искажают, что уже не плохо.

Автор: keos 23.4.2010, 13:47
Нужно написать анализатор TSQL smile 
Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)