在查询有关表定义的信息时,客户端安装无法为
COLUMNPROPERTY
函数返回零或一值。
相关查询正在搜索设置了
IDENTITY
属性的任何列:
select COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA = '[schema]'
and TABLE_NAME = '[tablename]'
and COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1
即使为表定义了标识列,也不会返回任何行。
在研究时,我们询问他们是否会执行此查询:
select
*,
COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') AS "Identity"
from
INFORMATION_SCHEMA.COLUMNS
where
TABLE_SCHEMA = '[schema]'
and TABLE_NAME = '[tablename]'
它为表中的每一列返回一行,其中包含预期的元数据,但“Identity”调用返回 NULL。
该网站上解决同一问题的唯一其他问题是多年前的问题,并且没有答案。
在本地,当我使用测试用户帐户进行测试时,我只能得到预期的 0 或 1 结果,或者根本没有行。
如果我撤销数据库(或系统)上的视图定义权限
deny VIEW DEFINITION to testuser
查询根本不返回任何行。
如果我撤销用户的“性能”或“安全”视图,我将获得具有 0/1 值的所有行。
deny VIEW PERFORMANCE DEFINITION to testuser
我在微软网站上没有找到任何有用的信息:有些说“如果请求不正确,则返回 NULL”,另一些说“如果权限不足,可能返回 NULL”。
@MartinSmith 的回复是正确的。架构(以及可选的数据库)应该已传递给 object_id 函数。
object_id(TABLE_SCHEMA+'.'+TABLE_NAME)
获得正确的结果。
原始版本仅使用 TABLE_NAME 字符串,始终返回用户的 default 模式中的表 - 在本例中不包含该名称的表。
要获取另一个数据库中表的信息,也可以添加目录:
object_id(TABLE_CATALOG+','+TABLE_SCHEMA+'.'+TABLE_NAME)