sp_columns用于不同的模式

时间:2015-03-18 13:59:42

标签: sql-server sql-server-2008-r2

我不记得但是我记得在我为一个特定的表执行sp_columns之前,无论架构如何,我都会得到该表的列结果。

例如,我有auth.rolesoper.roles,如果我这样做:

sp_columns roles

我应该有两个模式的记录,但现在我只收到一个。我需要在SQL Server上设置什么吗?我使用的是SQL Server 2008 R2

2 个答案:

答案 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”这样的表格。即使这可能不是必需的。

来自online documentation

[@ 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传递通配符。