Sql 在表中查找标识列

Sql 在表中查找标识列,sql,sql-server,database,Sql,Sql Server,Database,尝试运行insert语句时,出现以下错误: Msg 544第16级第1状态第3行 当identity\u insert设置为OFF时,无法为表“IV00101”中的identity列插入显式值。 有没有一种简单的方法可以找到我试图插入的导致此错误的标识列 问题是我的insert语句有84个要插入的值 我使用的是Microsoft SQL 2008您的问题有点不清楚,但我想尝试一下: 听起来标识列是自动递增的,您正在尝试插入值 可以使用此查询获取所有表的标识列: select TABLE_NAME

尝试运行insert语句时,出现以下错误:

Msg 544第16级第1状态第3行
当identity\u insert设置为OFF时,
无法为表“IV00101”中的identity列插入显式值。

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

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


我使用的是Microsoft SQL 2008

您的问题有点不清楚,但我想尝试一下:

听起来标识列是自动递增的,您正在尝试插入值

可以使用此查询获取所有表的标识列:

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 

如果表具有主键,则identity列可能是主键,如中所述

如果不是,您可以让SQLServerManagementStudio为表创建完整的
createtable
脚本,并在其中搜索单词
IDENTITY

在我看来,这是实现这一点的最简单、最快的方法(并且对于一次性操作来说已经足够了)


编辑:

@亚伦·伯特兰:
我知道主键和标识是两个不同的概念。
但是,老实说:在您见过的所有具有标识列的表中,有多少表的标识列不是主键 你是在自言自语,这是一种普遍的做法

所以,我要说的是:
是的,在SSMS中查找主键比查找标识列更容易。
(老实说:我不知道有什么更好的方法可以使用SSMS查找标识列,这就是我建议采用上述方法的原因)
-->如果找到主键也意味着在95%的情况下都能找到身份,为什么不先尝试使用简单/快速的方法(找到主键?

如果主键不是标识列,您仍然可以使用答案中的“正确”方式搜索标识列(这无疑是正确的方式,但不像在UI中查找主键那样容易)。

您试图覆盖默认标识,为此,您需要将其添加到查询的顶部

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

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

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

您能给我们看一下您的insert语句吗?为什么标识列“可能”是主键?与查找标识列相比,使用UI查找主键更容易些什么?虽然将标识和主键分配给同一列可能很常见,但请不要将它们必然相关的任何神话永久化。它们是两个非常不同的概念。因为使用目录视图可以轻松找到
IDENTITY
列,而不仅仅是使用UI(如果通过设计上下文菜单打开表设计器,则可以在下方窗格中找到IDENTITY Specification)。有很多表的
IDENTITY
列甚至没有主键,有很多表的主键和主键都有,但不在同一列上,也有很多表的主键和主键都没有。我只是认为告诉用户身份栏可能是主键是误导性的。主键也可能是集群的,但不一定。PS这个问题是在2006年提出的,作为添加此属性的建议,但他们拒绝了。解决方法是右键单击每个列并选择属性,但这太麻烦了。右键单击表格并选择“设计”,它位于下方窗格中。事实证明,桌子设计师毕竟是有好处的。。。
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')