繁体   English   中英

在表中查找标识列

[英]Finding identity column in a Table

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

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

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')

如果您的表具有主键,则标识列可能是主键,正如James Johnson的回答中所述

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

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


编辑:

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

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

您正尝试覆盖默认标识,为此,您需要在查询顶部添加此标识

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM