Sql 处理“中的标识列”;在表中插入值();陈述

Sql 处理“中的标识列”;在表中插入值();陈述,sql,sql-server,database,tsql,identity,Sql,Sql Server,Database,Tsql,Identity,在SQLServer2000或更高版本中,当使用如下语句时,是否仍可以处理自动生成的主键(identity)列 Insert Into TableName Values(?, ?, ?) 我的目标是完全不使用列名。您有两种选择: 1) 指定列名列表(不带标识列) 2) 将IDENTITY\u INSERT tablename设置为ON,然后是为IDENTITY列提供显式值的INSERT语句,最后是将IDENTITY\u INSERT tablename设置为OFF 如果您要避免列名称列表,也许

在SQLServer2000或更高版本中,当使用如下语句时,是否仍可以处理自动生成的主键(identity)列

Insert Into TableName Values(?, ?, ?)
我的目标是完全不使用列名。

您有两种选择:

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

2) 将IDENTITY\u INSERT tablename设置为ON,然后是为IDENTITY列提供显式值的INSERT语句,最后是将IDENTITY\u 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, '')

默认情况下,如果有标识列,则不需要在“值”部分中指定它。如果您的桌子是:

ID    NAME    ADDRESS
然后你可以做:

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

这将自动为您生成ID,您根本不需要考虑它。如果您
设置标识\u在
上插入MyTbl,您可以为ID列指定一个值。

因为在注释中添加代码是不实际的,所以在Eric的回答中,您的注释表示它不适合您

我刚刚在SQL 2005 box(抱歉,没有2000 handy)上使用默认设置运行了以下内容,并且运行正常:

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列,而您想忽略标识列,则只能传递5个值。

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

最佳做法是显式列出列:

Insert Into TableName(col1, col2,col2) Values(?, ?, ?)
否则,如果向表中添加另一列,原始插入将中断

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

其中“customer”是表名

只是澄清一下,通过显式值,您的意思是您必须查询数据库以查看序列中的下一个标识是什么,然后手动插入它?不,您可以使用任何不存在的值,但下一个顺序将从最大的加号开始……它通常只在您有参考数据之类的数据时使用,这些数据需要在不同的应用程序安装中具有完全相同的ID值。请勿在生产环境中使用Set identity_insert on!除非您希望插入到表中的其他用户有问题,否则不会。这仅在将大量数据从一个系统传输到另一个系统时使用,并且只能在单用户模式下进行。@HLGEM:我不是建议您保持打开状态!但你是对的,理想情况下应该在该表上没有活动的情况下进行。我们主要在引用数据表上使用它,而在正常使用过程中从来没有任何插入活动。为什么不使用列名列表?@Mitch,它有点复杂,但我有一个程序可以动态生成SQL,在我最初的设计中,我没有处理任何标识列,所以我排除了列名。我需要做一个快速更新,我可以避免使用列名,这将使更新变得更容易。@nemo--以前遇到过“快速补丁”的情况,现在我给你一个通行证。但是,为了你自己,请计划在下一次完整更新中指定列名……哦,真的吗?那太棒了。我刚才以为那是行不通的。让我试一试。@Eric是正确的,我在上面第1点的意思是什么(编辑以显示我的意图),+1Eric这对我根本不起作用。它在抱怨我有,身份插入关闭,我假设是因为它正在尝试将值中的第一项插入ID中。您必须设置任何特定项才能使其忽略第一列?如果希望SQL Server自动生成ID,请不要将ID列放入insert语句中。如果将identity列从coolumn列表中删除,请不要将identity insert设置为off,否则就不会产生价值是的,我的老板也说过同样的话。你们两人都完全正确,但是这个数据库中的数据是允许的(即每天都被删除和重新生成),所以如果发生类似的事情,那就不会是世界末日。我认为如果添加另一列,那么原始插入中断会更好-它确保插入适合所有字段(虽然字段上的非空设置也可用于强制输入)+1这一项对我帮助很大。除了方括号内的发脾气。这可能是我从中得到的最好的提示。太棒了!