我试图使用sp_MSForEachDB查询位于同一个Server实例中的多个数据库。
有8个数据库的表man_days具有一个名为servicetype的列。我已经手动验证了所有8个表都是相同的。
运行以下查询时,将得到错误消息无效列名'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
发布于 2021-01-19 05:19:08
嗯嗯。。。我认为这个问题可能是一个汇编问题。试试这个相当另类的方法
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-18 22:32:02
我猜这是对一个或多个数据库的元数据的权限。
元数据在信息架构视图中的可见性仅限于用户拥有或授予用户某种权限的安全性。有关更多信息,请参见元数据可见配置。
可能是您的登录在该表上具有的特定权限限制了您是否可以看到列名。我认为视图定义权限是必需的,这样就不会显示此错误。
https://stackoverflow.com/questions/65786172
复制