在SQL Server 2000或更高版本中,当使用如下语句时,无论如何都要处理自动生成的主键(标识)列?
Insert Into TableName Values(?, ?, ?)
我的目标是根本不使用列名。
答案 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'是表名