40 Stimmen

SQL Server - Rückgabe von SCHEMA für sysobjects

Wie erhalte ich das SCHEMA, wenn ich ein Select auf sysobjects mache?

Ich modifiziere eine gespeicherte Prozedur namens SearchObjectsForText die nur den Namen zurückgibt, aber ich möchte auch das SCHEMA einschließen.

Im Moment macht es etwas Ähnliches wie das hier:

SELECT DISTINCT name
FROM sysobjects

Ich würde gerne wissen, welche Tabellen verbunden werden müssen, um das SCHEMA für jeden "Namen" zurückzugeben.

74voto

devio Punkte 36064

Wenn Sie SQL Server 2005 oder höher meinen, verwenden Sie sys.objects anstelle von 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 wurden Schemata eingeführt. Bis 2000 waren die Benutzer gleich den Schemata. Die gleiche Abfrage für SQL Server 2000:

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

14voto

wire science Punkte 401

Auf Sql Server 2005 (und höher) können Sie die Ansicht sys.objects verwenden:

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

In Sql Server 2000 (und darunter) hatte der Begriff "Schema" eine andere konzeptionelle Bedeutung. Hinweis von MSDN:

In früheren Versionen von SQL Server konnten Datenbanken eine Entität namens "Schema" enthalten, aber diese Entität war eigentlich ein Datenbankbenutzer. SQL Server 2005 ist die erste Version von SQL Server, in der ein Schema sowohl ein Container als auch ein Namespace ist.

4voto

bdukes Punkte 144019

Könnten Sie die Information_Schema Ansicht(en) stattdessen?

SELECT DISTINCT table_name, table_schema
FROM INFORMATION_SCHEMA.TABLES

Selon die MSDN-Seite (für SQL Server 2008 und höher),

Verwenden Sie keine INFORMATION_SCHEMA-Ansichten, um das Schema eines Objekts zu ermitteln. Die einzige zuverlässige Möglichkeit, das Schema eines Objekts zu ermitteln, ist die Abfrage der Katalogansicht sys.objects.

Es scheint jedoch, dass sie sich wahrscheinlich auf ein Problem beziehen, bei dem Sie einen Tabellennamen haben und versuchen, dessen Schema zu finden, was nicht funktionieren würde, wenn es mehrere Tabellen mit demselben Namen (in verschiedenen Schemata) gäbe. Wenn Sie mehrere Ergebnisse abfragen (und nicht nur versuchen, das Schema für eine bestimmte Tabelle zu finden), dann sollte es klappen.

3voto

marc_s Punkte 701497

Ich würde die gezielteren "sys"-Ansichten bevorzugen - sys.procedures anstelle von sys.objects. Sie müssen sie mit der Ansicht sys.schemas verknüpfen, um Schemanamen und dergleichen zu erhalten.

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

Ich würde anfangen, "sysobjects" nicht mehr zu verwenden, da Microsoft in Books Online eindeutig angibt, dass "sysobjects" in einer zukünftigen Version entfernt werden soll:

Diese SQL Server 2000-Systemtabelle ist aus Gründen der Abwärtskompatibilität als Ansicht enthalten. Wir empfehlen, dass Sie stattdessen die aktuellen SQL Server-Systemansichten verwenden. Um die entsprechende(n) Systemansicht(en) zu finden, siehe Zuordnen von SQL Server 2000-Systemtabellen zu SQL Server 2005-Systemansichten. Dieses Feature wird in einer zukünftigen Version von Microsoft SQL Server entfernt werden. Vermeiden Sie die Verwendung dieses Features bei Neuentwicklungen, und planen Sie die Änderung von Anwendungen, die dieses Feature derzeit verwenden.

Marc

2voto

Mike Gledhill Punkte 25646

Um zu wiederholen, was hier bereits vorgeschlagen wurde, habe ich die folgende Methode verwendet, um eine Liste der Tabellen, Stored Procedures, Views und Funktionen in meiner Datenbank zu erhalten:

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

...und hier ist, was unser guter Freund Nordwind zurückkehren würde...

enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X