DB_NAME()函数在SQL Server中用于返回当前会话连接的数据库名,不带参数时返回当前数据库名称,类型为nvarchar(128),常见正确写法是SELECT DB_NAME();

SQL Server 中用 DB_NAME() 获取当前数据库名
SQL Server 不支持 DATABASE 这个函数,直接写会报错 Invalid column name 'DATABASE' 或解析失败。必须用 DB_NAME() —— 它不带参数时返回当前会话连接的数据库名。
常见误用:SELECT DATABASE(语法错误)、SELECT DATABASE()(不存在的函数)。正确写法是:
SELECT DB_NAME();
注意:DB_NAME() 返回的是 sysname 类型(本质是 nvarchar(128)),如果后续要拼接字符串或做条件判断,无需额外转换;但若需严格比较,建议用 RTRIM() 去掉可能的尾部空格(某些旧版本或镜像配置下可能出现)。
MySQL 中没有 DB_NAME(),要用 DATABASE()
MySQL 的函数名恰好相反:它是 DATABASE()(带括号),不是 DB_NAME()。写成后者会提示 FUNCTION db_name does not exist。
这个函数在未显式选择数据库时返回 NULL,比如刚连上 MySQL 但还没执行 USE mydb;。所以实际使用前最好加判断:
SELECT IFNULL(DATABASE(), 'no_database_selected') AS current_db;
另外,SCHEMA() 是 DATABASE() 的同义函数,二者完全等价,可互换,但建议统一用 DATABASE() 提高可读性。
PostgreSQL 和 SQLite 怎么办?它们不认这两个函数
PostgreSQL 没有内置的 DB_NAME() 或 DATABASE(),得查系统表:SELECT current_database(); —— 注意这是函数调用,不是变量或关键字。
SQLite 更简单,但容易被忽略:PRAGMA database_list; 返回多行结果,其中第一行的第三个字段是主数据库名;若只要名字,常用变通方式是:
SELECT 'main' AS current_db;
因为 SQLite 默认数据库名就是 main,且不支持动态切换“当前数据库”的概念(无 USE 语句),所以这个值是稳定的。想查附加数据库?得靠 PRAGMA database_list; 解析结果。
跨数据库写法不可行,别硬套一个函数名
试图用同一段 SQL 在 SQL Server、MySQL、PostgreSQL 里都跑通 DB_NAME() 或 DATABASE() 是徒劳的。三者函数名、行为、空值处理逻辑全不同。
如果真要兼容,只能靠应用层判断数据库类型再拼 SQL,或者用预处理宏(如 MyBatis 的 );在纯 SQL 脚本里硬做兼容,最终只会变成一堆 CASE WHEN 套 VERSION() 或 @@VERSION 的脆弱逻辑。
最常被忽略的一点:有些 ORM 或连接池(如 SQLAlchemy + PyODBC 连 SQL Server)会在连接字符串里指定初始数据库,但执行 DB_NAME() 仍取决于当前会话实际所在的库——如果中间执行过 USE otherdb;,结果就变了。别默认它等于连接串里的 Database=xxx。










