在 SQL Server 2000 或更高版本中,是否有办法处理使用类似以下语句时的自动生成的主键(identity)列?
Insert Into TableName Values(?, ?, ?)
我的目标是完全不使用列名。
在 SQL Server 2000 或更高版本中,是否有办法处理使用类似以下语句时的自动生成的主键(identity)列?
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(?, ?, ?)
否则,如果你向表中添加了另一列,你原来的插入语句将会失效。你有两个选择:
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)
'customer' 是表名