处理“Insert Into TABLE Values()”语句中的标识列?

时间:2009-06-01 15:12:51

标签: sql sql-server database tsql identity

在SQL Server 2000或更高版本中,当使用如下语句时,无论如何都要处理自动生成的主键(标识)列?

Insert Into TableName Values(?, ?, ?)

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

6 个答案:

答案 0 :(得分:56)

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

ID    NAME    ADDRESS

然后你可以这样做:

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

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

答案 1 :(得分:24)

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

答案 2 :(得分:11)

最佳做法是明确列出列:

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

否则,如果向表中添加其他列,原始插入将会中断。

答案 3 :(得分:6)

您有两个选择:

1)指定列名列表(不带标识列)。

2)SET IDENTITY_INSERT tablename ON,然后是insert语句,为identity列提供显式值,后跟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, '')

答案 4 :(得分: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个值。

答案 5 :(得分:0)

set identity_insert customer on
insert into Customer(id,Name,city,Salary) values(8,'bcd','Amritsar',1234)

其中'customer'是表名