当试图运行一个INSERT语句,我得到以下错误:查找标识列
Msg 544, Level 16, State 1, Line 3
Cannot insert explicit value for identity column in table 'IV00101' when IDENTITY_INSERT is set to OFF.
有没有一种简单的方法来找到我试图插入什么标识列是造成这个错误?
问题是我的插入语句有84个值插入。
我使用的是Microsoft SQL 2008
当试图运行一个INSERT语句,我得到以下错误:查找标识列
Msg 544, Level 16, State 1, Line 3
Cannot insert explicit value for identity column in table 'IV00101' when IDENTITY_INSERT is set to OFF.
有没有一种简单的方法来找到我试图插入什么标识列是造成这个错误?
问题是我的插入语句有84个值插入。
我使用的是Microsoft SQL 2008
SELECT name
FROM sys.columns
WHERE [object_id] = OBJECT_ID('dbo.IV00101')
AND is_identity = 1;
你的问题是有点不清楚,但我会在它采取了刺:
这听起来像身份列自动递增,而你试图插入值。
您可以使用此查询来获取身份列的所有表:
select TABLE_NAME + '.' + COLUMN_NAME, TABLE_NAME
from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA = 'dbo'
and COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1
order by TABLE_NAME
如果你的表中有一个主键,标识列可能是主键,在James Johnson's answer已经提到。
如果不是,您可以让SQL Server Management Studio为该表创建完整的CREATE TABLE
脚本,并在其中搜索单词IDENTITY
。
在我看来,这是最简单,最快捷的方式(对于一次性操作而言足够)。
编辑:
@Aaron贝特朗:
我知道主键和身份是两个不同的概念。
但是,老实说:在您看到过的所有带有标识列的表中,有多少人看到标识列的位置是而不是的主键?
你是在说你自己这是常见的做法。
所以,我在说的是:
是的,找到SSMS中的主键比IMO更容易找到标识列。
(老实说:我不知道使用SSMS找到身份列的更好方法,这就是为什么我提出了我上面描述的方式)
- >如果找到主键还意味着找到95所有情况的百分比,为什么不尝试首先使用easy/fast方式(找到主键)?
如果主键不是标识列,仍然可以使用答案中的“正确”方式搜索标识列(这毫无疑问是正确的方式,但不像找到UI)。
为什么标识列“可能”是主键?与查找标识列相比,使用UI查找主键更容易些?虽然身份和主键被分配到同一列可能很常见,但请不要使任何他们必然相关的神话永久存在。他们是两个非常不同的概念。 –
因为使用目录视图有一种简单的方法可以找到'IDENTITY *列* *,而不仅仅是*可能*使用UI(如果通过设计打开表格设计器,则在下部窗格中可以使用Identity Specification上下文菜单)。有很多带'IDENTITY'列的表甚至没有主键,有很多都有但不在同一列上,而且很多都没有。我只是认为告诉用户身份专栏可能是主键是误导性的。主键也可能聚集在一起,但不一定。 –
PS这个问题是在2006年提出的,建议添加这个属性,但他们把它击落。 http://connect.microsoft.com/SQLServer/feedback/details/124859/add-identity-to-column-description-in-sql-server-management-studio其中的解决方法建议右键单击每列并选择属性,但这太麻烦了。右键单击表格并选择“设计”,它位于下方的窗格中。发现表格设计师*对所有事情都有好处...... –
您试图覆盖默认的身份,这样做,你需要在查询的顶部
SET IDENTITY_INSERT [ database_name . [ schema_name ] . ] table { ON | OFF }
不一定是个好主意。 – JNK
可以查询系统中添加此对象信息,以找出哪些列身份
SELECT c.name
FROM
sys.columns c
JOIN sys.objects o ON c.object_id = o.object_id
WHERE
o.name = 'TABLE_NAME' -- replace with table nae
AND c.is_identity = 1
select name
from sys.identity_columns
where [object_id] = object_id('your_table_here')
你能告诉我们你的insert语句? –