2009-05-27 219 views
26

如何在sysobjects上进行选择时获取SCHEMA?SQL Server - 为sysobjects返回SCHEMA

我在修改名为的存储过程SearchObjectsForText,它只返回名称,但我还想包含SCHEMA。

现在它正在做一些与此类似:

SELECT DISTINCT name 
FROM sysobjects 

我想知道需要连接到返回该计划对每个“名”是什么表。

回答

53

如果你的意思是SQL Server 2005或更高,使用sys.objects中,而不是系统对象的:

SELECT sys.objects.name, sys.schemas.name AS schema_name 
FROM sys.objects 
INNER JOIN sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id 

2005年推出的模式。截至2000年,用户等于模式。 SQL Server 2000的相同查询:

SELECT sysusers.name AS OwnerName, sysobjects.name 
FROM sysobjects 
INNER JOIN sysusers ON sysobjects.uid = sysusers.uid 
+0

由于SearchObjectsForText存储过程的布局,我最终使用此方法。但我也喜欢“线科学”,因为它更简单。 – 2009-05-28 13:18:04

+0

值得指出的是,这将*不*给出相同的结果。例如,sysobjects会返回系统目录视图,而sys.objects不会 – 2011-07-30 01:38:24

4

你可以用Information_Schema view(s)代替吗?

SELECT DISTINCT table_name, table_schema 
FROM INFORMATION_SCHEMA.TABLES 

根据the MSDN page(为SQL Server 2008及以上版本),

请勿使用INFORMATION_SCHEMA视图来确定对象的架构。查找对象模式的唯一可靠方法是查询sys.objects目录视图。

但是,似乎他们可能指的是您有一个表名并正在尝试查找其模式的问题,如果存在多个具有相同名称的表(在不同的模式)。如果你正在查询多个结果(不只是试图找到特定表的模式),那么它应该没问题。

+0

我希望我可以但我不想更改现有的存储过程,只是做一个连接会更容易。无论如何感谢您的建议。我给了你一个投票权。 :) – 2009-05-27 19:14:21

14

上的SQL Server 2005(及以上),你可以使用sys.objects中查看:

select 
    name     as ObjectName,  
    schema_Name(schema_id) as SchemaName 
from 
    sys.objects 

在SQL Server 2000(及以下), “模式” 有不同的概念意义。来自MSDN的注意事项:

在早期版本的SQL Server中,数据库可能包含一个名为“模式”的实体,但该实体实际上是数据库用户。 SQL Server 2005是SQL Server的第一个版本,其中模式既是容器又是命名空间。

3

我希望使用更集中的“sys”视图 - sys.procedures而不是sys.objects。您需要使用sys.schemas视图来加入它以获取模式名称等。

select 
    p.name, 
    s.name 'Schema', 
    p.type_desc, p.create_date, p.modify_date 
from 
    sys.procedures p 
inner join 
    sys.schemas s ON p.schema_id = s.schema_id 

我将开始使用“系统对象”脱身,因为微软联机丛书中,明确指出“系统对象”是被遣返在未来的版本:

此SQL Server 2000系统表作为向后兼容的视图。我们建议您改用当前的SQL Server系统视图。要查找等效的系统视图,请参阅将SQL Server 2000系统表映射到SQL Server 2005系统视图。此功能将在未来版本的Microsoft SQL Server中删除。避免在新开发工作中使用此功能,并计划修改当前使用此功能的应用程序。

马克

0

在SQL 200:

​​

在SQL Server的早期版本,数据库可以包含一个实体,称为 “模式”,但该实体是有效的数据库用户。

1

只是重复什么已经建议在这里,这里就是我用,让我的数据库表,存储过程,视图和函数的列表:

SELECT schema_Name(schema_id) as SchemaName, 
     [name],    -- Name of the Table, Stored Procedure or Function 
     [type]    -- 'V' for Views, 'U' for Table, 'P' for Stored Procedure, 'FN' for function 
FROM sys.objects 
WHERE [type_desc] IN ('USER_TABLE', 'SQL_STORED_PROCEDURE', 'VIEW', 'SQL_SCALAR_FUNCTION') 
AND [name] NOT LIKE 'sp_%' 
AND [name] NOT LIKE 'fn_%' 
ORDER BY 3 DESC,  -- type first 
     1 ASC,   -- then schema 
     2 ASC   -- then function/table name 

...这是什么我们的好朋友罗斯文将返回...

enter image description here

0

都包含一个选项,删除所有对象开始具有一定的前缀和任选的某些架构。 顺便说一下,我添加了额外的查询来获取所有类型,默认情况下它们并不存储在sysobjects上。

我已上载整个样品脚本的GitHub: DropAll_Dnn_Objects.sql

1部分:临时存储的过程:

IF OBJECT_ID('_temp_DropAllDnnObjects') IS NOT NULL 
    DROP PROCEDURE _temp_DropAllDnnObjects; 
GO 

CREATE PROCEDURE _temp_DropAllDnnObjects 
    @object_prefix NVARCHAR(30), 
    @schema_name sysname = NULL 
AS 
BEGIN 
    DECLARE @sname sysname, @name sysname, @type NVARCHAR(30) 
    DECLARE @object_type NVARCHAR(255), @sql NVARCHAR(2000), @count INT = 0 

    DECLARE curs CURSOR FOR 
     SELECT sname, [name], xtype 
     FROM (
      SELECT SCHEMA_NAME(schema_id) as sname, [name], [type] as xtype 
       FROM sys.objects 
       WHERE [type] IN ('U', 'P', 'FN', 'IF', 'TF', 'V', 'TR') 
        AND name LIKE @object_prefix + '%' 
        AND (@schema_name IS NULL OR schema_id = SCHEMA_ID(@schema_name)) 
      UNION ALL 
      SELECT SCHEMA_NAME(schema_id) as sname, [name], 'TYPE' as xtype 
       FROM sys.types 
       WHERE is_user_defined = 1 
        AND [name] LIKE @object_prefix + '%' 
        AND (@schema_name IS NULL OR schema_id = SCHEMA_ID(@schema_name)) 
      ) a 
     ORDER BY CASE xtype 
         WHEN 'P' THEN 1 
         WHEN 'FN' THEN 2 
         WHEN 'IF' THEN 3 
         WHEN 'TF' THEN 4 
         WHEN 'TR' THEN 5 
         WHEN 'V' THEN 6 
         WHEN 'U' THEN 7 
         WHEN 'TYPE' THEN 8 
         ELSE 9 
        END, name 

    OPEN curs; 
    FETCH NEXT FROM curs INTO @sname, @name, @type; 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SET @count = @count + 1 
     -- Configuration point 2 
     SET @object_type = CASE @type 
         WHEN 'P' THEN 'PROCEDURE' 
         WHEN 'FN' THEN 'FUNCTION' 
         WHEN 'IF' THEN 'FUNCTION' 
         WHEN 'TF' THEN 'FUNCTION' 
         WHEN 'TR' THEN 'TRIGGER' 
         WHEN 'V' THEN 'VIEW' 
         WHEN 'U' THEN 'TABLE' 
         WHEN 'TYPE' THEN 'TYPE' 
        END 
     SET @sql = REPLACE(REPLACE(REPLACE('DROP <TYPE> [<SCHEMA>].[<NAME>];', 
         '<TYPE>', @object_type), 
         '<SCHEMA>', @sname), 
         '<NAME>', @name) 

     BEGIN TRY 
      PRINT @sql 
      EXEC(@sql) 
     END TRY 
     BEGIN CATCH 
      PRINT 'ERROR: ' + ERROR_MESSAGE() 
     END CATCH 
     FETCH NEXT FROM curs INTO @sname, @name, @type; 
    END; 

    PRINT CONCAT('Objects Found: ', @Count) 
    PRINT '' 
    PRINT '------------------------------------------------------' 
    PRINT '' 

    CLOSE curs; 
    DEALLOCATE curs; 

    RETURN @Count 
END; 
GO 

它将继续在错误(并显示错误消息)。它会返回找到的所有对象的计数。

第2部分:呼叫存储过程参数:

可以以运行该命令创建一个WHILE循环,直到没有对象被留(依赖关系),如下所示:

DECLARE @count INT = 1 
WHILE @count > 0 EXEC @count = _temp_DropAllDnnObjects 'dnn'; 
SET @count = 1 
WHILE @count > 0 EXEC @count = _temp_DropAllDnnObjects 'aspnet'; 
SET @count = 1 
WHILE @count > 0 EXEC @count = _temp_DropAllDnnObjects 'vw_aspnet'; 
GO 

第3部分:最后,摆脱程序:

IF OBJECT_ID('_temp_DropAllDnnObjects') IS NOT NULL 
    DROP PROCEDURE _temp_DropAllDnnObjects; 
GO