Обрабатывать столбцы идентификаторов в операторе «Вставка в значения TABLE ()»? - PullRequest
31 голосов
/ 01 июня 2009

В SQL Server 2000 или более поздней версии есть ли в любом случае обрабатывать автоматически сгенерированный столбец первичного ключа (идентификатор) при использовании оператора, подобного следующему?

Insert Into TableName Values(?, ?, ?)

Моя цель - НЕ использовать имена столбцов вообще.

Ответы [ 6 ]

56 голосов
/ 01 июня 2009

По умолчанию, если у вас есть столбец идентификации, вам не нужно указывать его в разделе ЗНАЧЕНИЯ Если ваш стол:

ID    NAME    ADDRESS

Тогда вы можете сделать:

INSERT INTO MyTbl VALUES ('Joe', '123 State Street, Boston, MA')

Это автоматически сгенерирует для вас идентификатор, и вам совсем не придется об этом думать. Если вы SET IDENTITY_INSERT MyTbl ON, вы можете присвоить значение столбцу идентификатора.

24 голосов
/ 01 июня 2009

Другой «трюк» для создания списка столбцов - просто перетащите узел «Столбцы» из обозревателя объектов в окно запроса.

11 голосов
/ 01 июня 2009

Рекомендуется явно перечислять столбцы:

Insert Into TableName(col1, col2,col2) Values(?, ?, ?)

В противном случае исходная вставка сломается, если вы добавите в таблицу еще один столбец.

6 голосов
/ 01 июня 2009

У вас есть 2 варианта:

1) Либо укажите список имен столбцов (без идентификатора столбца).

2) SET IDENTITY_INSERT имя таблицы включено, за ним следуют операторы вставки, которые предоставляют явные значения для столбца идентификаторов, за которым следует SET IDENTITY_INSERT имя таблицы OFF.

Если вы избегаете списка имен столбцов, возможно, этот «трюк» может помочь?:

-- Get a comma separated list of a table's column names
SELECT STUFF(
(SELECT 
',' + COLUMN_NAME AS [text()]
FROM 
INFORMATION_SCHEMA.COLUMNS
WHERE 
TABLE_NAME = 'TableName'
Order By Ordinal_position
FOR XML PATH('')
), 1,1, '')
2 голосов
/ 01 июня 2009

Так как не стоит вводить код в комментарий, в ответ на ваш комментарий в ответе Эрика, что он не работает для вас ...

Я только что запустил следующее в окне SQL 2005 (извините, нет 2000, удобно) с настройками по умолчанию, и оно работало без ошибок:

CREATE TABLE dbo.Test_Identity_Insert
(
    id  INT IDENTITY NOT NULL,
    my_string   VARCHAR(20) NOT NULL,
    CONSTRAINT PK_Test_Identity_Insert PRIMARY KEY CLUSTERED (id)
)
GO

INSERT INTO dbo.Test_Identity_Insert VALUES ('test')
GO

SELECT * FROM dbo.Test_Identity_Insert
GO

Возможно, вы отправляете значение ID в вашем списке значений? Я не думаю, что вы можете заставить его игнорировать столбец, если вы действительно передаете ему значение. Например, если в вашей таблице 6 столбцов и вы хотите игнорировать столбец IDENTITY, вы можете передать только 5 значений.

0 голосов
/ 13 декабря 2016
set identity_insert customer on
insert into Customer(id,Name,city,Salary) values(8,'bcd','Amritsar',1234)

где 'customer' - имя таблицы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...