SQL Server 2022 对于 COLUMNPROPERTY 函数调用返回 NULL

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

在查询有关表定义的信息时,客户端安装无法为

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”。

sql-server
1个回答
0
投票

@MartinSmith 的回复是正确的。架构(以及可选的数据库)应该已传递给 object_id 函数。

object_id(TABLE_SCHEMA+'.'+TABLE_NAME)

获得正确的结果。

原始版本仅使用 TABLE_NAME 字符串,始终返回用户的 default 模式中的表 - 在本例中不包含该名称的表。

要获取另一个数据库中表的信息,也可以添加目录:

object_id(TABLE_CATALOG+','+TABLE_SCHEMA+'.'+TABLE_NAME)

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