Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como SCHEMA_NAME() funciona no SQL Server


No SQL Server, você pode usar o SCHEMA_NAME() função para retornar o nome de um esquema específico. A maneira como funciona é que ele retorna o nome do esquema associado a um ID do esquema.

Se você não passar um ID de esquema para a função, ela retornará o nome do esquema padrão do chamador.


Exemplo 1 - Esquema padrão de retorno


Aqui está um exemplo que retorna o nome do esquema padrão do chamador.
SELECT SCHEMA_NAME() AS Result;

Resultado:
+----------+
| Result   |
|----------|
| dbo      |
+----------+

Isso retorna o nome do esquema padrão do chamador porque não especifiquei explicitamente outro ID de esquema.

Exemplo 2 – Especifique um esquema diferente


Neste exemplo, passo um ID de esquema para a função.
SELECT SCHEMA_NAME(7) AS Result;

Resultado:
+----------+
| Result   |
|----------|
| Fact     |
+----------+

Exemplo 3 – Trocando Bancos de Dados


O exemplo anterior foi executado em um banco de dados que tinha um esquema com um ID de 7. Se eu mudar para um banco de dados diferente, posso obter um nome de esquema diferente ou nenhum nome.

Aqui está um exemplo do que quero dizer.
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]; 

Resultado:
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)

Quatro colunas retornam NULL no banco de dados Music, porque não há esquema com esse ID.

Exemplo 4 – Resultados de consulta mais legíveis


Aqui está um exemplo de uso de SCHEMA_NAME() para apresentar o nome do esquema em vez de seu ID ao retornar resultados de uma visualização do sistema.
SELECT 
  schema_id,
  SCHEMA_NAME(schema_id) AS [Schema Name],
  name AS [Table Name]
FROM sys.tables;

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

O sys.tables a visualização do sistema retorna o ID do esquema, mas não seu nome. Isso não é um problema embora. O ID é suficiente, pois podemos usar SCHEMA_NAME() para exibir o nome do esquema, com base nesse ID.

Se não tivéssemos o SCHEMA_NAME() função, precisaríamos fazer uma junção no sys.schemas visão do sistema apenas para obter o nome do esquema.

Exemplo 5 - Em uma cláusula WHERE


Aqui está um exemplo de uso de SCHEMA_NAME() em um WHERE cláusula.
USE WideWorldImportersDW;
SELECT * FROM sys.schemas
WHERE name = SCHEMA_NAME(7);

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

Se você precisar obter o ID de um esquema, use o SCHEMA_ID() função.