SQL Server: создание табличной переменной, ошибка в определении ограничения первичного ключа - PullRequest
0 голосов
/ 18 июня 2011

Я пытаюсь создать табличную переменную с первичным ключом. В чем разница между этими двумя утверждениями? Почему первый не работает?

--This does not work
declare @tabvar table (
    rowid int identity(1, 1) not null,
    var1 int null,
        constraint PK_tabvar_rowid primary key clustered (rowid)
)

--This works
declare @tabvar1 table (
    rowid int identity(1, 1) not null primary key clustered,
    var1 int null
)

Ответы [ 4 ]

2 голосов
/ 18 июня 2011

Когда вы создаете таблицу, как:

CREATE TABLE tabvar (
rowid int identity(1, 1) not null,
var1 int null
   , constraint PK_tabvar_rowid primary key clustered (rowid))

вы создаете отдельный объект SQL с именем PK_tabvar_rowid.

Этот метод предпочтителен для постоянных таблиц, как указано выше, поскольку вы специально называете ограничение, и оно существует независимо от объекта таблицы.

Вы МОЖЕТЕ использовать форму:

 CREATE TABLE tabvar (
rowid int identity(1, 1) not null primary key,
var1 int null)

но это создает произвольно названное ограничение, что усложняет управление в будущем.

Для табличных переменных (которые являются переходными) - вы НЕ МОЖЕТЕ иметь независимое ограничение - поэтому вы ДОЛЖНЫ использовать встроенное определение первичного ключа.

1 голос
/ 18 июня 2011

Похоже, это поведение хорошо документировано в BOL .Посмотрите определения синтаксиса для переменной DECLARE TABLE vs CREATE TABLE .

1 голос
/ 18 июня 2011

Существуют различия в синтаксисе между CREATE TABLE (Transact-SQL) и DECLARE @local_variable (Transact-SQL) , используемыми при создании табличных переменных.Вы не можете использовать синтаксис первого оператора для создания таблицы переменных.

0 голосов
/ 18 июня 2011

Синтаксис, который вы используете для CREATE TABLE, а не для табличных переменных.

CREATE TABLE tabvar (
    rowid int identity(1, 1) not null,
    var1 int null
       , constraint PK_tabvar_rowid primary key clustered (rowid)
)

Выше работает нормально, как и ожидалось. Однако, если вы посмотрите на синтаксис для объявления табличных переменных , вы увидите, что вы можете и не можете делать:

declare @tabvar table (
    rowid int identity(1, 1) not null,
    var1 int null,
       primary key (rowid)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...