在 SQL Server 2000 或更高版本中,当使用如下语句时,是否有处理自动生成的主键(身份)列?
Insert Into TableName Values(?, ?, ?)
我的目标是根本不使用列名。
在 SQL Server 2000 或更高版本中,当使用如下语句时,是否有处理自动生成的主键(身份)列?
Insert Into TableName Values(?, ?, ?)
我的目标是根本不使用列名。
默认情况下,如果您有一个标识列,则不需要在 VALUES 部分中指定它。如果您的表是:
ID NAME ADDRESS
然后你可以这样做:
INSERT INTO MyTbl VALUES ('Joe', '123 State Street, Boston, MA')
这将自动为您生成 ID,您根本不必考虑它。如果您SET IDENTITY_INSERT MyTbl ON
,您可以为 ID 列分配一个值。
生成列列表的另一个“技巧”是将“列”节点从对象资源管理器拖到查询窗口上。
最佳做法是明确列出列:
Insert Into TableName(col1, col2,col2) Values(?, ?, ?)
否则,如果您向表中添加另一列,您的原始插入将会中断。
您有 2 个选择:
1) 指定列名列表(没有标识列)。
2) SET IDENTITY_INSERT tablename ON,后跟为标识列提供显式值的插入语句,然后是 SET IDENTITY_INSERT tablename 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, '')
由于将代码放在评论中是不切实际的,因此回应您在 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
您是否可能在值列表中发送 ID 值?如果您实际上为它传递了一个值,我认为您不能让它忽略该列。例如,如果您的表有 6 列,而您想忽略 IDENTITY 列,则只能传递 5 个值。
set identity_insert customer on
insert into Customer(id,Name,city,Salary) values(8,'bcd','Amritsar',1234)
其中“客户”是表名