我不记得但是我记得在我为一个特定的表执行sp_columns之前,无论架构如何,我都会得到该表的列结果。
例如,我有auth.roles
和oper.roles
,如果我这样做:
sp_columns roles
我应该有两个模式的记录,但现在我只收到一个。我需要在SQL Server上设置什么吗?我使用的是SQL Server 2008 R2
答案 0 :(得分:2)
尝试以下方法:
exec sp_columns' tablename ',@ table_owner =' schemaname '
e.g。 exec sp_columns' 角色 ',@ table_owner =' auth &# 39;
答案 1 :(得分:0)
如果要为所有表返回数据而不管架构如何,那么您需要为@table_owner
参数使用通配符:
EXECUTE sp_columns @table_name = 'Roles', @table_owner = '%';
修改强>
我能看到从所有模式返回对象的唯一方法是在对象名上使用模式匹配:
EXECUTE sp_columns @table_name = '%Roles';
明显的缺陷是,这也将返回像“dbo.UserRoles”这样的表格。即使这可能不是必需的。
[@ table_owner =]所有者
是用于返回目录信息的对象的对象所有者。 owner是nvarchar(384),默认值为NULL。支持通配符模式匹配。如果未指定owner,则应用基础DBMS的默认对象可见性规则。
如果当前用户拥有具有指定名称的对象,则返回该对象的列。如果未指定owner且当前用户不拥有具有指定对象的对象,则sp_columns将查找具有数据库所有者拥有的指定对象的对象。如果存在,则返回该对象的列。
此外,我查看了程序master.dbo.sp_columns
的定义,并提取了以下一些相关部分:
CREATE procedure [sys].[sp_columns]
(
@table_name nvarchar(384),
@table_owner nvarchar(384) = null,
@table_qualifier sysname = null,
@column_name nvarchar(384) = null,
@ODBCVer int = 2
)
as
declare @full_table_name nvarchar(769) -- 384 + 1 + 384
declare @table_id int
declare @fUsePattern bit
select @fUsePattern = 1
select @full_table_name = isnull(quotename(@table_owner), '') + '.' + isnull(quotename(@table_name), '')
select @table_id = object_id(@full_table_name)
if (@fUsePattern = 1) -- Does the user want it?
begin
if ((isnull(charindex('%', @full_table_name),0) = 0) and
(isnull(charindex('_', @full_table_name),0) = 0) and
(isnull(charindex('[', @table_name),0) = 0) and
(isnull(charindex('[', @table_owner),0) = 0) and
(isnull(charindex('%', @column_name),0) = 0) and
(isnull(charindex('_', @column_name),0) = 0) and
(@table_id <> 0))
begin
select @fUsePattern = 0 -- not a single wild char, so go the fast way.
end
end
if @fUsePattern = 0
begin
select ....
from
sys.spt_columns_odbc_view s_cov
where
s_cov.object_id = @table_id -- (2nd) (@table_name is null or o.name like @table_name)
....
end
重点是,如果您未指定所有者,并且未使用模式匹配,则该过程使用@table_id
来解析表名,因此不可能返回多个表格。
因此,我可以告诉您两个选项 - 使用通配符并接受其他结果,或者为@table_owner
传递通配符。