在 SQL Server 2016 中使用 sp_MSForEachDB 的列名称无效
Invalid column name using sp_MSForEachDB in SQL Server 2016
我正在尝试使用 sp_MSForEachDB.
查询位于同一 SQL 服务器实例上的多个数据库
有 8 个数据库具有 table man_days 和名为 servicetype 的列。我已手动验证所有 8 个 table 都是相同的。
当运行以下查询时,我收到错误消息无效的列名'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
'
结果集符合预期,但错误不断出现。我做错了什么?
编辑...如果我更改代码以查询下面代码中的所有列,它可以正常工作。或者,如果我将其更改为查询 table 中的其他单列,它可以正常工作。只有当我尝试 select 那一列
时才会失败
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]
我猜这是对一个或多个数据库的元数据的权限。
信息架构视图中元数据的可见性仅限于用户拥有的或已授予用户某些权限的安全对象。有关详细信息,请参阅 Metadata Visibility Configuration。
可能是您的登录名对该 table 的特定权限限制了您是否可以看到列名。我认为需要 VIEW DEFINITION 权限才能显示此错误。
嗯。 . .我认为这个问题可能是一个编译问题。试试这个替代方案
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
同时求值。
我正在尝试使用 sp_MSForEachDB.
查询位于同一 SQL 服务器实例上的多个数据库有 8 个数据库具有 table man_days 和名为 servicetype 的列。我已手动验证所有 8 个 table 都是相同的。
当运行以下查询时,我收到错误消息无效的列名'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
'
结果集符合预期,但错误不断出现。我做错了什么?
编辑...如果我更改代码以查询下面代码中的所有列,它可以正常工作。或者,如果我将其更改为查询 table 中的其他单列,它可以正常工作。只有当我尝试 select 那一列
时才会失败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
'
[
我猜这是对一个或多个数据库的元数据的权限。
信息架构视图中元数据的可见性仅限于用户拥有的或已授予用户某些权限的安全对象。有关详细信息,请参阅 Metadata Visibility Configuration。
可能是您的登录名对该 table 的特定权限限制了您是否可以看到列名。我认为需要 VIEW DEFINITION 权限才能显示此错误。
嗯。 . .我认为这个问题可能是一个编译问题。试试这个替代方案
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
同时求值。