DB NAME: примеры (SQL)

Работа с функцией DB_NAME в Microsoft SQL Server
Раздел: Системные информационные функции, Метаданные
DB_NAME([database_id]): nvarchar(128)

Описание функции DB_NAME

Функция DB_NAME является системной скалярной функцией в Microsoft SQL Server. Ее основное назначение – возвращение имени базы данных. Функция часто используется в скриптах, которые требуют определения контекста текущей или указанной базы данных, для динамического построения запросов или логирования.

Синтаксис функции:

DB_NAME ( [ database_id ] )

Аргумент database_id является необязательным. Это идентификатор базы данных, имя которой требуется получить. Идентификатор имеет тип int. Если аргумент не указан, функция возвращает имя текущей базы данных.

Возвращаемое значение имеет тип nvarchar(128). Если указанный database_id не существует, функция возвращает NULL. Идентификаторы баз данных можно получить из системного представления sys.databases.

Базовые примеры использования

Пример 1: Получение имени текущей базы данных.

SELECT DB_NAME() AS CurrentDatabaseName;
CurrentDatabaseName
-------------------
master

Пример 2: Получение имени базы данных по ее идентификатору.

SELECT DB_NAME(3) AS DatabaseName;
DatabaseName
-------------
tempdb

Пример 3: Использование в условии WHERE.

SELECT name, database_id
FROM sys.databases
WHERE DB_NAME(database_id) LIKE '%temp%';
name   database_id
------ -----------
tempdb 3

Пример 4: Функция возвращает NULL для несуществующего ID.

SELECT DB_NAME(999) AS NonExistentDB;
NonExistentDB
-------------
NULL

Похожие функции в MS SQL Server

DB_ID() – выполняет обратную операцию: принимает имя базы данных и возвращает ее числовой идентификатор. Синтаксис: DB_ID ( [ 'database_name' ] ). Если имя не указано, возвращает ID текущей БД.

ORIGINAL_DB_NAME() – возвращает имя базы данных, в которой был выполнен вход в систему (контекст соединения). Эта функция полезна в распределенных запросах или при переключении между базами данных.

Предпочтения в использовании: DB_NAME() применяют, когда известен идентификатор. DB_ID() используют, когда известно имя. ORIGINAL_DB_NAME() нужна для аудита исходного контекста соединения.

Аналоги функции в других СУБД

MySQL: Функция DATABASE() не принимает аргументов и всегда возвращает имя текущей базы данных.

SELECT DATABASE();
DATABASE()
----------
my_database

PostgreSQL: Функция current_database() работает аналогично.

SELECT current_database();
current_database
-----------------
postgres

Oracle: В Oracle нет прямой аналогии. Имя базы данных можно получить из представления GLOBAL_NAME или с помощью функции ora_database_name в контексте сессии, но это не является прямым аналогом.

SELECT * FROM GLOBAL_NAME;
GLOBAL_NAME
-----------
ORCL

SQLite: Концепция текущей базы данных в SQLite не выражена так явно. Обычно работа ведется с одним файлом-базой.

Основное отличие MS SQL – возможность запросить имя по ID, что обеспечивает гибкость при работе с метаданными.

Типичные ошибки

1. Неверная интерпретация NULL. Попытка использовать результат функции с несуществующим ID в строковой операции без проверки.

DECLARE @dbName NVARCHAR(128) = 'Database: ' + DB_NAME(999);
SELECT @dbName;
NULL

2. Ожидание, что функция вернет имя базы данных после инструкции USE внутри той же строки пакета. Инструкция USE может не успеть изменить контекст.

USE AdventureWorks2019;
SELECT DB_NAME(); -- Может вернуть имя предыдущей БД, если это один пакет.

Рекомендуется выполнять USE и вызов DB_NAME() в отдельных пакетах (разделенных командой GO в SSMS).

Изменения в последних версиях

Функция DB_NAME остается неизменной с точки зрения синтаксиса и основного поведения на протяжении многих версий SQL Server (2005 и выше). В документации Microsoft не указаны критические изменения. Функция стабильна и полностью обратно совместима.

Расширенные примеры

Пример 1: Динамическое построение запроса для всех пользовательских баз данных.

Пример sql
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += N'USE ' + QUOTENAME(DB_NAME(database_id)) + N'; PRINT ''В базе: ' + DB_NAME(database_id) + N'''; '
FROM sys.databases
WHERE database_id > 4;
EXEC sp_executesql @sql;

Пример 2: Использование в сочетании с DB_ID для проверки существования базы данных перед операцией.

Пример sql
IF DB_ID('MyTestDB') IS NOT NULL
    PRINT 'База данных существует: ' + DB_NAME(DB_ID('MyTestDB'));
ELSE
    PRINT 'База данных не найдена.';

Пример 3: Получение списка всех баз данных и их имен через функцию в предложении SELECT.

Пример sql
SELECT
    database_id,
    DB_NAME(database_id) AS name,
    create_date
FROM sys.databases
ORDER BY database_id;
database_id name         create_date
----------- ------------ -----------------------
1           master       2003-04-08 09:10:00
2           tempdb       2023-10-26 11:22:00
3           model        2003-04-08 09:10:00
4           msdb         2023-10-26 11:22:00
5           AdventureWorks 2023-10-26 14:00:00

Пример 4: Применение в триггере для аудита, чтобы зафиксировать, в какой базе данных произошло событие (если триггер находится в общей или системной базе).

Пример sql
-- Пример логирования в таблицу аудита
INSERT INTO dbo.AuditLog (EventTime, DatabaseName, EventDescription)
VALUES (GETDATE(), DB_NAME(), 'Произошло изменение конфигурации.');

Пример 5: Использование в составе более сложного выражения для формирования пути к файлу.

Пример sql
SELECT
    'Резервная копия базы ' + DB_NAME(database_id) +
    ' должна быть создана в: D:\Backup\' + DB_NAME(database_id) + '.bak' AS BackupCommand
FROM sys.databases
WHERE state = 0; -- ONLINE databases

MS SQL DB_NAME function comments

En
DB NAME Returns the database name