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所在的数据库,而是您当前连接的数据库。
union
和 union 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;
下面查询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所在的数据库,而是您当前连接的数据库。
union
和 union 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;