DB NAME: примеры (SQL)
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: Динамическое построение запроса для всех пользовательских баз данных.
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 для проверки существования базы данных перед операцией.
IF DB_ID('MyTestDB') IS NOT NULL
PRINT 'База данных существует: ' + DB_NAME(DB_ID('MyTestDB'));
ELSE
PRINT 'База данных не найдена.';Пример 3: Получение списка всех баз данных и их имен через функцию в предложении SELECT.
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: Применение в триггере для аудита, чтобы зафиксировать, в какой базе данных произошло событие (если триггер находится в общей или системной базе).
-- Пример логирования в таблицу аудита
INSERT INTO dbo.AuditLog (EventTime, DatabaseName, EventDescription)
VALUES (GETDATE(), DB_NAME(), 'Произошло изменение конфигурации.');Пример 5: Использование в составе более сложного выражения для формирования пути к файлу.
SELECT
'Резервная копия базы ' + DB_NAME(database_id) +
' должна быть создана в: D:\Backup\' + DB_NAME(database_id) + '.bak' AS BackupCommand
FROM sys.databases
WHERE state = 0; -- ONLINE databases