0

我正在尝试使用 sp_MSForEachDB 查询位于同一 SQL Server 实例上的多个数据库。

有 8 个数据库具有表 man_days 和名为 servicetype 的列。我已经手动验证了所有 8 个表都是相同的。

运行以下查询时,我收到错误消息Invalid column name 'servicetype'

EXEC sp_MSForEachDB 
'
BEGIN
    IF EXISTS (SELECT * FROM [?].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''man_days'' AND COLUMN_NAME = ''servicetype'')
        SELECT top 1 [man_days].[servicetype] from [?]..[man_days]
END
'

结果集符合预期,但错误不断出现。我究竟做错了什么?

编辑...如果我更改代码以查询所有列,如下面的代码所示,它可以正常工作。或者,如果我将其更改为查询该表中的其他单列,则它可以正常工作。只有当我尝试选择那一列时它才会失败

EXEC sp_MSForEachDB 
'
BEGIN
    IF EXISTS (SELECT * FROM [?].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''man_days'' AND COLUMN_NAME = ''servicetype'')
        SELECT top 1 * from [?]..[man_days]
END
'

[ 结果集] [1]错误信息

4

2 回答 2

0

嗯。. . 我认为这个问题可能是一个编译问题。试试这个相当替代

EXEC sp_MSForEachDB 
'
BEGIN
    IF EXISTS (SELECT * FROM [?].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''man_days'' AND COLUMN_NAME = ''servicetype'')
    BEGIN
        DECLARE @sql NVARCHAR(MAX);
        SET @sql = ''SELECT top 1 [man_days].[servicetype] from [db]..[man_days]'';
        REPLACE(@sql, ''[db]'', ?);
        EXEC sp_executesql @sql;
    END;
END
';

也就是说,将SELECT转换为动态 SQL,因此它不会与IF.

于 2021-01-19T13:19:08.257 回答
0

我猜这是对一个或多个数据库的元数据的权限。

信息模式视图中元数据的可见性仅限于用户拥有或已被授予某些权限的安全对象。有关详细信息,请参阅元数据可见性配置

可能是您的登录名随后对该表具有的特定权限限制了您是否可以看到列名。我认为需要查看定义权限,以便不显示此错误。

于 2021-01-19T06:32:02.007 回答