DB_NAME() 在 SQL 服务器中使用 [DBName].[SchemaName].[TblName] 查询语法

DB_NAME() in SQL Server when using [DBName].[SchemaName].[TblName] query syntax

下面查询returns当前数据库的名称:

USE [DB1]
SELECT DB_NAME() AS Current_DB
FROM [dbo].[TblName]

结果:

Current_DB
----------
DB1

当我使用 DB_NAME() 查询 SELECT FROM a table in [DBName].[SchemaName].[TblName] 表示法时,我看到了非常奇怪的结果:

T-SQL

USE [DB1]
SELECT DB_NAME() AS Current_DB
FROM [DB1].[dbo].TblName
UNION
SELECT DB_NAME() AS Current_DB
FROM [DB2].[dbo].TblName
UNION
SELECT DB_NAME() AS Current_DB
FROM [DB3].[dbo].TblName
UNION
SELECT DB_NAME() AS Current_DB
FROM [DB4].[dbo].TblName

结果:

Current_DB
----------
DB1

T-SQL

USE [DB1]
SELECT DB_NAME() AS Current_DB
FROM [DB1].[dbo].TblName
UNION ALL
SELECT DB_NAME() AS Current_DB
FROM [DB2].[dbo].TblName
UNION ALL 
SELECT DB_NAME() AS Current_DB
FROM [DB3].[dbo].TblName
UNION ALL
SELECT DB_NAME() AS Current_DB
FROM [DB4].[dbo].TblName

结果:

Current_DB
----------
DB1
DB1
DB1
...  (632,788 rows of DB1 !!!)

即使我从 T-SQL 查询中省略 USE [DB1],我也会得到相同的结果 - 在 SSMS 的“查询目标”下拉菜单中选择的数据库就是出现在结果中的数据库。

如何使用 [DBName].[SchemaName].[TblName] 格式在多个查询中获得正确的 DB_NAME()

DB_NAME()不带参数显示当前连接会话的数据库名称,而不是您正在查询的对象的基础数据库。

来自文档:

A. Returning the current database name. This example returns the name of the current database.

SELECT DB_NAME() AS [Current Database];

否则,如果您在数据库之间进行连接并调用 DB_NAME(),您会期望什么?

SELECT
    DB_NAME() -- ??
FROM
    Database1.dbo.Table1 AS T
    CROSS JOIN Database2.dbo.Table2 AS N

您可以使用 USE <DatabaseName> 语句切换连接的数据库。

DB_NAME() 函数 returns 当前数据库的名称 如果未指定 database_id 参数。

当前数据库不是指您查询的table所在的数据库,而是您当前连接的数据库。

unionunion all 查询之间的区别在于 union returns 个不同的值 - 因为您在每个查询中选择相同的值,所以返回单个值。

DB_NAME() returns 您当前连接的数据库的名称。一个查询可以引用 FROM 中的多个数据库,那么像这样的查询会怎样?

SELECT DB_NAME()
FROM DB1.dbo.YourTable YT
     JOIN DB2.dbo.OtherTable OT ON OT.ID = YT.ID;

对于您的查询,您需要在查询中指定数据库的名称:

USE [DB1]
SELECT N'DB1' AS Current_DB
FROM [DB1].[dbo].TraceContactSource
UNION ALL
SELECT N'DB2' AS Current_DB
FROM [DB2].[dbo].TraceContactSource
UNION ALL 
SELECT N'DB3' AS Current_DB
FROM [DB3].[dbo].TraceContactSource
UNION ALL
SELECT N'DB4' AS Current_DB
FROM [DB4].[dbo].TraceContactSource

但是,根据评论,如果您实际上是在查找(非系统)数据库列表,也许这可以实现您的目标:

SELECT [name] AS Current_DB
FROM sys.databases
WHERE database_id > 4;