如何识别表是否有标识列

问题描述 投票:0回答:16

我想知道表是否有标识列。表对我来说是未知的。我还没有做表的结构。使用查询?

我使用的是 Sql Server Compact Edition。

sql sql-server sql-server-ce
16个回答
38
投票
IF (OBJECTPROPERTY(OBJECT_ID('TABLE_NAME'), 'TableHasIdentity') = 1) 

ObjectProperty
从 sql server 2008 开始可用参考: 对象属性


32
投票

此查询返回表的标识列名称:

CREATE PROCEDURE dbo.usp_GetIdentity
@schemaname nvarchar(128) = 'dbo'  
,@tablename nvarchar(128)
AS
BEGIN
    SELECT   OBJECT_NAME(OBJECT_ID) AS TABLENAME, 
             NAME AS COLUMNNAME, 
             SEED_VALUE, 
             INCREMENT_VALUE, 
             LAST_VALUE, 
             IS_NOT_FOR_REPLICATION 
    FROM     SYS.IDENTITY_COLUMNS 
    WHERE OBJECT_NAME(OBJECT_ID) = @tablename
    AND OBJECT_SCHEMA_NAME(object_id) = @schemaname
END

然后形成代码面。

使用 datareader 角色调用此存储过程,然后选中

datareader.hasrows()
。如果条件值为 true (
1
),则表具有标识列(如果已设置)。如果没有,则它没有标识列。


19
投票

我知道这是很久以前的事了,但我发现这很有帮助

试试这个:

IF EXISTS (SELECT * from syscolumns where id = Object_ID(@TABLE_NAME) and colstat & 1 = 1)
BEGIN
   -- Do your things
END

16
投票

以下任何查询都可用于检查表中是否存在身份列

1)

SELECT *
FROM sys.identity_columns
WHERE OBJECT_NAME(object_id) = 'TableName'

2)

SELECT *
FROM sys.identity_columns
WHERE object_id = (
        SELECT id
        FROM sysobjects
        WHERE name = 'TableName'
    )

7
投票

我只想添加这个选项,而且我认为这是最简单的

SELECT COLUMNPROPERTY(OBJECT_ID('TableName'),'ColumnName','isidentity')

4
投票

实现此目的的一种方法是使用存储过程

sp_help
。即:

sp_help MyTable

这将返回一个数据集,其中包含表中所需的所有信息。有一个特定的表,其中包含有关身份的信息。

即:

如果不包含标识字段,标识列将显示:“未定义标识列”。


3
投票

@Pranay:他说的是精简版。不支持存储过程,并且没有 sys.anything。

这是电话:

SELECT Count(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE AUTOINC_INCREMENT IS NOT NULL AND TABLE_NAME='this_table'

它将返回 1(真)或 0(假)。


3
投票

... 声明 @tblhasIdentCol bit = IF (IDENT_CURRENT( @dbName +'.'+ @schemaName +'.'+ @tableName ) IS NOT NULL , 1 , 0 )

如果表具有标识,您将获得数值


3
投票

非常简单的答案就是运行这个:

SELECT IDENT_CURRENT('TABLE-NAME')

如果存在,这将给出标识列的最大值,如果该列不存在,则给出 1 作为结果。

根据最大值,您可以识别哪一列具有该值并确定标识列。


1
投票

此查询获取所有表名、表的列名以及是否在所选数据库中

SELECT
     sys.columns.name
   , sys.tables.name
   , is_identity
FROM sys.columns
INNER JOIN sys.tables ON sys.tables.object_id = sys.columns.object_id
    AND sys.columns.is_identity = 1

1
投票
CREATE FUNCTION dbo.fnTableHasIdentity(@Tbl sysname)
RETURNS TINYINT
BEGIN 
  RETURN OBJECTPROPERTY(OBJECT_ID(@Tbl), 'TableHasIdentity')
END 

--就这么简单!


1
投票
select t.name as TableName,c.name as ColumnName
from sys.identity_columns c
inner join sys.tables t on c.object_id = t.object_id
where t.name = 'TableName'

1
投票

如果您像我一样,需要能够对任意数据库中的表执行此操作,那么我找到了以下解决方案:

IF EXISTS (
    SELECT 1
    FROM [database name].sys.identity_columns AS id_col
    INNER JOIN [database name].sys.objects
        ON objects.object_id = id_col.object_id
    INNER JOIN [database name].sys.schemas
        ON schemas.schema_id = objects.schema_id
        AND schemas.name = 'schema name'
    WHERE OBJECT_NAME(id_col.object_id, DB_ID('database name')) = 'table name'
) SELECT 1 ELSE SELECT 0

0
投票

如果当前表有标识列,则可以使用此函数获取 1 或 0 Boolean 表单

SELECT Count(Column_ID) FROM sys.identity_columns WHERE OBJECT_NAME(object_id) = 'tableName'

0
投票

列出所有表及其标识列(如果存在)的一种方法 要获得所需的表格,请在过滤器末尾添加“

and o.name='TableName'
” 其中 Tbale Nam 就是您要找的桌子

SELECT o.[Name][TableName],i.[name][IdentityColName] FROM 
sys.objects o 
left outer join sys.identity_columns i on i.object_id=o.object_id
where o.type='U'

0
投票

做到这一点的一种方法。

如果不存在(SELECT * FROM SYS.COLUMNS WHERE OBJECT_ID = OBJECT_ID('YOURTABLENAME') AND is_identity = 1)开始 -- 你的代码在这里 结束

© www.soinside.com 2019 - 2024. All rights reserved.