在表中查找标识列

时间:2011-09-08 21:04:20

标签: sql sql-server database

尝试运行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.

是否有一种简单的方法可以找到我尝试插入的标识列导致此错误?

问题是我的insert语句有84个值我插入。

我正在使用Microsoft SQL 2008

6 个答案:

答案 0 :(得分:5)

SELECT name 
  FROM sys.columns 
  WHERE [object_id] = OBJECT_ID('dbo.IV00101') 
  AND is_identity = 1;

答案 1 :(得分: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 

答案 2 :(得分:1)

您可以查询系统对象信息以找出哪些列是标识

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

答案 3 :(得分:1)

select name 
from sys.identity_columns 
where [object_id] = object_id('your_table_here')

答案 4 :(得分:0)

如果您的表具有主键,则标识列可能是主键,如James Johnson's answer中已提到的那样。

如果不是,您可以让SQL Server Management Studio为表创建完整的CREATE TABLE脚本,并在其中搜索单词IDENTITY

在我看来,这是实现这一目标的最简单,最快捷的方法(足以实现一次性行动)。


编辑:

@Aaron Bertrand:
我知道主键和身份是两个不同的概念 但是,老实说:在您看过的所有带有标识列的表中,您看到有多少个标识列不是主键的位置?
你是在说自己这是常见的做法。

所以,我说的是这个:
是的,在SSMS中找到主键比找到标识列更容易 (老实说:我不知道有什么更好的方法可以找到使用SSMS的标识栏,这就是为什么我建议我上面描述的方式)
- >如果找到主键也意味着在95%的情况下找到身份,为什么不首先尝试使用简单/快速方式(找到主键)? 如果主键不是标识列,您仍然可以使用答案中的“正确”方式搜索标识列(这无疑是正确的方法,但不像在UI中查找主键那么容易)

答案 5 :(得分:0)

您正试图覆盖默认身份,为此您需要在查询顶部添加此身份

SET IDENTITY_INSERT [ database_name . [ schema_name ] . ] table { ON | OFF }