39

在 SQL Server 2000 或更高版本中,当使用如下语句时,是否有处理自动生成的主键(身份)列?

Insert Into TableName Values(?, ?, ?)

我的目标是根本不使用列名。

4

6 回答 6

68

默认情况下,如果您有一个标识列,则不需要在 VALUES 部分中指定它。如果您的表是:

ID    NAME    ADDRESS

然后你可以这样做:

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

这将自动为您生成 ID,您根本不必考虑它。如果您SET IDENTITY_INSERT MyTbl ON,您可以为 ID 列分配一个值。

于 2009-06-01T15:17:52.823 回答
32

生成列列表的另一个“技巧”是将“列”节点从对象资源管理器拖到查询窗口上。

于 2009-06-01T15:42:07.653 回答
11

最佳做法是明确列出列:

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

否则,如果您向表中添加另一列,您的原始插入将会中断。

于 2009-06-01T16:44:12.473 回答
7

您有 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, '')
于 2009-06-01T15:14:26.400 回答
2

由于将代码放在评论中是不切实际的,因此回应您在 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 个值。

于 2009-06-01T15:42:00.900 回答
0
set identity_insert customer on
insert into Customer(id,Name,city,Salary) values(8,'bcd','Amritsar',1234)

其中“客户”是表名

于 2016-12-13T09:49:27.603 回答