sql >> Databasteknik >  >> RDS >> Sqlserver

Hur SCHEMA_NAME() fungerar i SQL Server

I SQL Server kan du använda SCHEMA_NAME() funktion för att returnera namnet på ett visst schema. Hur det fungerar är att det returnerar schemanamnet som är kopplat till ett schema-ID.

Om du inte skickar ett schema-ID till funktionen returnerar det namnet på standardschemat för den som ringer.

Exempel 1 – Return Default Schema

Här är ett exempel som returnerar namnet på standardschemat för den som ringer.

SELECT SCHEMA_NAME() AS Result;

Resultat:

+----------+
| Result   |
|----------|
| dbo      |
+----------+

Detta returnerar namnet på standardschemat för den som ringer eftersom jag inte uttryckligen angav ett annat schema-ID.

Exempel 2 – Ange ett annat schema

I det här exemplet skickar jag ett schema-ID till funktionen.

SELECT SCHEMA_NAME(7) AS Result;

Resultat:

+----------+
| Result   |
|----------|
| Fact     |
+----------+

Exempel 3 – Byta databas

Det föregående exemplet råkade bara köras i en databas som hade ett schema med ID 7. Om jag byter till en annan databas kan jag få ett annat schemanamn, eller inget namn alls.

Här är ett exempel på vad jag menar.

USE WideWorldImportersDW;
SELECT 
  SCHEMA_NAME(1) AS [1],
  SCHEMA_NAME(2) AS [2],
  SCHEMA_NAME(3) AS [3],
  SCHEMA_NAME(4) AS [4],
  SCHEMA_NAME(5) AS [5],
  SCHEMA_NAME(6) AS [6],
  SCHEMA_NAME(7) AS [7],
  SCHEMA_NAME(8) AS [8];

USE Music;
SELECT 
  SCHEMA_NAME(1) AS [1],
  SCHEMA_NAME(2) AS [2],
  SCHEMA_NAME(3) AS [3],
  SCHEMA_NAME(4) AS [4],
  SCHEMA_NAME(5) AS [5],
  SCHEMA_NAME(6) AS [6],
  SCHEMA_NAME(7) AS [7],
  SCHEMA_NAME(8) AS [8]; 

Resultat:

Changed database context to 'WideWorldImportersDW'.
+-----+-------+--------------------+-----+-------------+-----------+------+-------------+
| 1   | 2     | 3                  | 4   | 5           | 6         | 7    | 8           |
|-----+-------+--------------------+-----+-------------+-----------+------+-------------|
| dbo | guest | INFORMATION_SCHEMA | sys | Application | Dimension | Fact | Integration |
+-----+-------+--------------------+-----+-------------+-----------+------+-------------+
(1 row affected)
Changed database context to 'Music'.
+-----+-------+--------------------+-----+------+------+------+------+
| 1   | 2     | 3                  | 4   | 5    | 6    | 7    | 8    |
|-----+-------+--------------------+-----+------+------+------+------|
| dbo | guest | INFORMATION_SCHEMA | sys | NULL | NULL | NULL | NULL |
+-----+-------+--------------------+-----+------+------+------+------+
(1 row affected)

Fyra kolumner returnerar NULL på musikdatabasen, eftersom det inte finns något schema med det ID:t.

Exempel 4 – Mer läsbara frågeresultat

Här är ett exempel på hur du använder SCHEMA_NAME() för att presentera schemanamnet istället för dess ID när resultat returneras från en systemvy.

SELECT 
  schema_id,
  SCHEMA_NAME(schema_id) AS [Schema Name],
  name AS [Table Name]
FROM sys.tables;

Resultat:

+-------------+---------------+-------------------------+
| schema_id   | Schema Name   | Table Name              |
|-------------+---------------+-------------------------|
| 8           | Integration   | ETL Cutoff              |
| 8           | Integration   | Lineage                 |
| 8           | Integration   | Customer_Staging        |
| 8           | Integration   | Employee_Staging        |
| 8           | Integration   | Movement_Staging        |
| 8           | Integration   | Order_Staging           |
| 8           | Integration   | PaymentMethod_Staging   |
| 6           | Dimension     | City                    |
| 8           | Integration   | Purchase_Staging        |
| 6           | Dimension     | Customer                |
| 8           | Integration   | Sale_Staging            |
| 8           | Integration   | StockHolding_Staging    |
| 6           | Dimension     | Date                    |
| 8           | Integration   | StockItem_Staging       |
| 6           | Dimension     | Employee                |
| 8           | Integration   | Supplier_Staging        |
| 6           | Dimension     | Payment Method          |
| 8           | Integration   | Transaction_Staging     |
| 8           | Integration   | TransactionType_Staging |
| 6           | Dimension     | Stock Item              |
| 6           | Dimension     | Supplier                |
| 6           | Dimension     | Transaction Type        |
| 7           | Fact          | Movement                |
| 7           | Fact          | Order                   |
| 7           | Fact          | Purchase                |
| 7           | Fact          | Sale                    |
| 7           | Fact          | Stock Holding           |
| 7           | Fact          | Transaction             |
| 8           | Integration   | City_Staging            |
+-------------+---------------+-------------------------+

sys.tables systemvyn returnerar schema-ID men inte dess namn. Det är dock inget problem. ID:t är tillräckligt eftersom vi kan använda SCHEMA_NAME() för att visa schemats namn, baserat på det ID:t.

Om vi ​​inte hade SCHEMA_NAME() funktion, skulle vi behöva göra en join på sys.schemas systemvy bara för att få schemats namn.

Exempel 5 – I en WHERE-klausul

Här är ett exempel på hur du använder SCHEMA_NAME() i en WHERE klausul.

USE WideWorldImportersDW;
SELECT * FROM sys.schemas
WHERE name = SCHEMA_NAME(7);

Resultat:

+--------+-------------+----------------+
| name   | schema_id   | principal_id   |
|--------+-------------+----------------|
| Fact   | 7           | 1              |
+--------+-------------+----------------+

Om du behöver få ett schemas ID, använd SCHEMA_ID() fungera.


  1. Hur man jämför två tabeller kolumn för kolumn i orakel

  2. Uppgradering av Grid Control efter manuell DB-uppgradering

  3. Postgresql UUID stöds av Hibernate?

  4. Bästa metoder för MySQL-replikering