SQL Server - вернуть SCHEMA для системных объектов - PullRequest
29 голосов
/ 27 мая 2009

Как получить SCHEMA при выполнении выбора для sysobjects?

Я изменяю хранимую процедуру с именем SearchObjectsForText , которая возвращает только имя, но я также хотел бы включить SCHEMA.

Сейчас он делает что-то похожее на это:

SELECT DISTINCT name
FROM sysobjects

Я хотел бы знать, какие таблицы необходимо объединить, чтобы получить СХЕМУ для каждого «имени».

Ответы [ 7 ]

55 голосов
/ 27 мая 2009

Если вы имеете в виду SQL Server 2005 или выше, используйте sys.objects вместо sysobjects:

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
14 голосов
/ 27 мая 2009

На 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, в котором схема является одновременно контейнером и пространством имен.

4 голосов
/ 27 мая 2009

Не могли бы вы вместо этого использовать Information_Schema view (s) ?

SELECT DISTINCT table_name, table_schema
FROM INFORMATION_SCHEMA.TABLES

В соответствии с на странице MSDN (для SQL Server 2008 и выше),

Не используйте представления INFORMATION_SCHEMA для определения схемы объекта. Единственный надежный способ найти схему объекта - запросить представление каталога sys.objects.

Однако, похоже, что они, вероятно, ссылаются на проблему, в которой у вас есть имя таблицы, и пытаются найти ее схему, которая не сработала бы, если бы было несколько таблиц с одинаковым именем (в разных схемах). Если вы запрашиваете несколько результатов (а не просто пытаетесь найти схему для конкретной таблицы), тогда все должно быть в порядке.

3 голосов
/ 27 мая 2009

Я бы предпочел использовать более сфокусированные представления "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

Я бы начал отказываться от использования «sysobjects», поскольку Microsoft четко заявляет в Books Online, что «sysobjects» подлежит удалению в следующем выпуске:

Эта системная таблица SQL Server 2000 включена в качестве представления обратной совместимости. Вместо этого мы рекомендуем использовать текущие системные представления SQL Server. Чтобы найти эквивалентное системное представление или представления, см. Раздел Отображение системных таблиц SQL Server 2000 в системных представлениях SQL Server 2005. Эта функция будет удалена в следующей версии Microsoft SQL Server. Избегайте использования этой функции в новых разработках и запланируйте модификацию приложений, которые в настоящее время используют эту функцию.

Марк

1 голос
/ 24 сентября 2015

Просто чтобы повторить то, что уже было предложено здесь, вот что я использовал, чтобы получить список таблиц, хранимых процедур, представлений и функций в моей базе данных:

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 голосов
/ 24 февраля 2017

Включена опция удаления всех объектов, начиная с определенного префикса и, возможно, из определенной схемы. Кстати, я добавил дополнительный запрос, чтобы получить все типы, которые по умолчанию не хранятся в системных объектах.

Я загрузил весь пример скрипта на 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
0 голосов
/ 18 февраля 2015

В SQL 200:

select DISTINCT
  name            as  ObjectName,     
  USER_NAME(uid)  as  SchemaName
from 
  sysobjects

В более ранних выпусках SQL Server базы данных могли содержать сущность, называемую «схемой», но эта сущность фактически была пользователем базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...