Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Fonctionnement de SCHEMA_NAME() dans SQL Server

Dans SQL Server, vous pouvez utiliser le SCHEMA_NAME() fonction pour renvoyer le nom d'un schéma particulier. La façon dont cela fonctionne est qu'il renvoie le nom de schéma associé à un ID de schéma.

Si vous ne transmettez pas d'ID de schéma à la fonction, elle renvoie le nom du schéma par défaut de l'appelant.

Exemple 1 – Retourner le schéma par défaut

Voici un exemple qui renvoie le nom du schéma par défaut de l'appelant.

SELECT SCHEMA_NAME() AS Result;

Résultat :

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

Cela renvoie le nom du schéma par défaut de l'appelant car je n'ai pas explicitement spécifié un autre ID de schéma.

Exemple 2 – Spécifier un schéma différent

Dans cet exemple, je transmets un ID de schéma à la fonction.

SELECT SCHEMA_NAME(7) AS Result;

Résultat :

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

Exemple 3 – Changer de base de données

Il se trouve que l'exemple précédent a été exécuté dans une base de données qui avait un schéma avec un ID de 7. Si je passe à une autre base de données, je pourrais obtenir un nom de schéma différent, ou pas de nom du tout.

Voici un exemple de ce que je veux dire.

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]; 

Résultat :

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)

Quatre colonnes renvoient NULL dans la base de données Musique, car il n'y a pas de schéma avec cet ID.

Exemple 4 - Résultats de requête plus lisibles

Voici un exemple d'utilisation de SCHEMA_NAME() pour présenter le nom du schéma au lieu de son ID lors du retour des résultats d'une vue système.

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

Résultat :

+-------------+---------------+-------------------------+
| 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            |
+-------------+---------------+-------------------------+

Les sys.tables La vue système renvoie l'ID du schéma mais pas son nom. Ce n'est pas un problème cependant. L'ID est suffisant, car nous pouvons utiliser SCHEMA_NAME() pour afficher le nom du schéma, basé sur cet ID.

Si nous n'avions pas le SCHEMA_NAME() fonction, nous aurions besoin de faire une jointure sur le sys.schemas vue système juste pour obtenir le nom du schéma.

Exemple 5 – Dans une clause WHERE

Voici un exemple d'utilisation de SCHEMA_NAME() dans un WHERE clause.

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

Résultat :

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

Si vous avez besoin d'obtenir l'ID d'un schéma, utilisez le SCHEMA_ID() une fonction.