Обработка столбцов идентификации в инструкции "Вставить в таблицу значений()"?
В SQL Server 2000 или выше все равно обрабатывается столбец с автоматическим генерированием первичного ключа (идентификатор) при использовании оператора, подобного следующему?
Insert Into TableName Values(?, ?, ?)
Моя цель - НЕ использовать имена столбцов вообще.
Ответы
Ответ 1
По умолчанию, если у вас есть столбец идентификатора, вам не нужно указывать его в разделе VALUES. Если ваша таблица:
ID NAME ADDRESS
Затем вы можете сделать:
INSERT INTO MyTbl VALUES ('Joe', '123 State Street, Boston, MA')
Это автоматически сгенерирует идентификатор для вас, и вам не придется об этом думать вообще. Если вы SET IDENTITY_INSERT MyTbl ON
, вы можете присвоить значение столбцу ID.
Ответ 2
Другой "трюк" для создания списка столбцов - это просто перетащить "Столбцы" node из Обозревателя объектов в окно запроса.
Ответ 3
Лучшей практикой является прямое перечисление столбцов:
Вставить в TableName (col1, col2, col2) Значения (?,?,?)
В противном случае ваша оригинальная вставка сломается, если вы добавите другой столбец в свою таблицу.
Ответ 4
У вас есть 2 варианта:
1) Либо укажите список имен столбцов (без столбца идентификации).
2) SET IDENTITY_INSERT tablename ON, за которым следуют инструкции вставки, которые содержат явные значения для столбца идентификации, а затем SET IDENTITY_INSERT tablename OFF.
Если вы избегаете списка имен столбцов, возможно, этот "трюк" может помочь?:
-- Get a comma separated list of a table 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, '')
Ответ 5
Так как нецелесообразно помещать код в комментарий, в ответ на ваш комментарий в Eric ответьте, что он не работает для вас...
Я просто запустил следующее в окне 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
Возможно, вы отправите значение идентификатора в свой список значений? Я не думаю, что вы можете заставить его игнорировать столбец, если вы действительно передаете ему значение. Например, если ваша таблица имеет 6 столбцов и вы хотите игнорировать столбец IDENTITY, вы можете передать только 5 значений.
Ответ 6
Решение:
1) Установите IDENTITY_INSERT в положение ON.
2) Вставьте данные клиентов в таблицу Customer.
3) Установите IDENTITY_INSERT в положение OFF.
прочитайте полную статью здесь.
Ответ 7
set identity_insert customer on
insert into Customer(id,Name,city,Salary) values(8,'bcd','Amritsar',1234)
где "customer" - это имя таблицы