DB_NAME () в SQL Server при использовании синтаксиса запроса [DBName]. [SchemaName]. [TblName] - PullRequest
0 голосов
/ 26 февраля 2019

Следующий запрос возвращает имя текущей базы данных:

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

Результат:

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

Я вижу очень странные результаты при использовании DB_NAME() с запросами, которые ВЫБРАТЬ ИЗ таблицы в формате [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 !!!)

Даже если я опускаю USE [DB1] изВ запросе T-SQL я получаю те же результаты - база данных, выбранная в раскрывающемся меню «Цель запроса» SSMS, является той, которая появляется в результатах.

Как получить правильный DB_NAME() для нескольких запросов, используя [DBName].[SchemaName].[TblName] формат?

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Функция DB_NAME() возвращает имя текущей базы данных , если аргумент database_id не указан.

текущая база данных означает не базу данных, в которой находится запрашиваемая таблица, а базу данных, к которой вы сейчас подключены.

Разница между union иunion all запросов заключается в том, что union возвращает различные значения - и поскольку вы выбираете одно и то же значение в каждом запросе, возвращается одно значение.

0 голосов
/ 26 февраля 2019

DB_NAME() возвращает имя базы данных, к которой вы в данный момент подключены.Запрос может ссылаться на несколько баз данных в 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;
0 голосов
/ 26 февраля 2019

DB_NAME () без параметра показывает имя базы данных текущего подключенного сеанса, а не базовую базу данных запрашиваемого объекта.

Из документов:

A.Возвращает текущее имя базы данных.В этом примере возвращается имя текущей базы данных.

SELECT DB_NAME () AS [Текущая база данных];

В противном случае, что вы ожидаете, если выполните соединение между базами данных и вызовом DB_NAME()?

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

Вы можете переключать подключенные базы данных с помощью оператора USE <DatabaseName>.

...