如何在SQL 服务器中查询当前行的数据库名称?
How to query current row's DB name in SQL server?
TableA存在于所有4个DB中,运行这个,
Use DB1
go
select CurrentDB=DB_NAME(), * From DB1..TableA union all
select CurrentDB=DB_NAME(), * From DB2..TableA union all
select CurrentDB=DB_NAME(), * From DB3..TableA union all
select CurrentDB=DB_NAME(), * From DB4..TableA
总是得到 CurrentDB ='DB1'。当行从非 DB1 中提取时,是否有 Simple 方法来获取 DB2、3、4?
尝试避免硬编码。
在每个数据库中创建相同的视图,将 returns 的值 DB_NAME()
作为列。然后,在联合中,每一行都将包含数据库名称。
试试这个
Use Master
set NOCOUNT ON;
Declare @db_name Varchar(12)
Declare @sql Varchar(1000)
Declare db_cursor CURSOR FOR
SELECT [name]
FROM sys.databases Where [name] like 'DB[123456789]'
Open db_cursor
Fetch Next FROM db_cursor INTO @db_name
if @@FETCH_STATUS = 0
begin
Select @sql = 'select ''' + @db_name + ''', * From ' + @db_name + '..TableA'
Fetch Next FROM db_cursor INTO @db_name
While @@FETCH_STATUS = 0
begin
select @sql = @sql + ' Union all select ''' +
@db_name + ''', * From ' + @db_name + '..TableA'
Fetch NEXT FROM db_cursor INTO @db_name
end
exec @sql
end
Close db_cursor
Deallocate db_cursor
未测试,但基本思路是获取所有匹配的数据库名称。构建 sql 语句,然后执行它。
TableA存在于所有4个DB中,运行这个,
Use DB1
go
select CurrentDB=DB_NAME(), * From DB1..TableA union all
select CurrentDB=DB_NAME(), * From DB2..TableA union all
select CurrentDB=DB_NAME(), * From DB3..TableA union all
select CurrentDB=DB_NAME(), * From DB4..TableA
总是得到 CurrentDB ='DB1'。当行从非 DB1 中提取时,是否有 Simple 方法来获取 DB2、3、4? 尝试避免硬编码。
在每个数据库中创建相同的视图,将 returns 的值 DB_NAME()
作为列。然后,在联合中,每一行都将包含数据库名称。
试试这个
Use Master
set NOCOUNT ON;
Declare @db_name Varchar(12)
Declare @sql Varchar(1000)
Declare db_cursor CURSOR FOR
SELECT [name]
FROM sys.databases Where [name] like 'DB[123456789]'
Open db_cursor
Fetch Next FROM db_cursor INTO @db_name
if @@FETCH_STATUS = 0
begin
Select @sql = 'select ''' + @db_name + ''', * From ' + @db_name + '..TableA'
Fetch Next FROM db_cursor INTO @db_name
While @@FETCH_STATUS = 0
begin
select @sql = @sql + ' Union all select ''' +
@db_name + ''', * From ' + @db_name + '..TableA'
Fetch NEXT FROM db_cursor INTO @db_name
end
exec @sql
end
Close db_cursor
Deallocate db_cursor
未测试,但基本思路是获取所有匹配的数据库名称。构建 sql 语句,然后执行它。