sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan fungerer SCHEMA_NAME() i SQL Server

I SQL Server kan du bruge SCHEMA_NAME() funktion for at returnere navnet på et bestemt skema. Den måde, det fungerer på, er, at det returnerer skemanavnet forbundet med et skema-id.

Hvis du ikke sender et skema-id til funktionen, returnerer det navnet på standardskemaet for den, der ringer.

Eksempel 1 – Returner standardskema

Her er et eksempel, der returnerer navnet på standardskemaet for den, der ringer.

SELECT SCHEMA_NAME() AS Result;

Resultat:

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

Dette returnerer navnet på standardskemaet for den, der ringer, fordi jeg ikke eksplicit har angivet et andet skema-id.

Eksempel 2 – Angiv et andet skema

I dette eksempel sender jeg et skema-id til funktionen.

SELECT SCHEMA_NAME(7) AS Result;

Resultat:

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

Eksempel 3 – Skift database

Det forrige eksempel blev tilfældigvis kørt i en database, der havde et skema med et ID på 7. Hvis jeg skifter til en anden database, får jeg muligvis et andet skemanavn, eller slet ikke noget navn.

Her er et eksempel på, hvad jeg mener.

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)

Fire kolonner returnerer NULL på musikdatabasen, fordi der ikke er noget skema med det id.

Eksempel 4 – Mere læsbare forespørgselsresultater

Her er et eksempel på brug af SCHEMA_NAME() at præsentere skemanavnet i stedet for dets ID, når resultater returneres fra en systemvisning.

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 systemvisning returnerer skema-id'et, men ikke dets navn. Det er dog ikke et problem. ID'et er tilstrækkeligt, fordi vi kan bruge SCHEMA_NAME() for at vise skemaets navn baseret på dette id.

Hvis vi ikke havde SCHEMA_NAME() funktion, skal vi lave en join på sys.schemas systemvisning bare for at få skemaets navn.

Eksempel 5 – I en WHERE-klausul

Her er et eksempel på brug af 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              |
+--------+-------------+----------------+

Hvis du har brug for at få et skemas ID, skal du bruge SCHEMA_ID() fungere.


  1. Skinner:Installation af PG gem på OS X - fejl i at bygge indbygget udvidelse

  2. Tilføjelse af et indledende nul til nogle værdier i kolonne i MySQL

  3. Forenkling af enhedstest Hovedlagret procedure, som også kalder en hjælpeprocedure

  4. AWS RDS:"SQLSTATE[22001] - Data for lange til kolonne" ved hjælp af MariaDB 10.2