繁体   English   中英

从多个数据库中选择数据

[英]Select data from multiple databases

我有一个动态查询,我需要发送数据库名称作为逗号分隔值和来自不同数据库的retreive数据可以帮助我..我有以下查询

Decalre @DBname nvarchar(max);
Declare @Selectstring nvarchar(max);

set @Selectstring='

  select    

      Userid,
      UserName,
      CreatedOn,
      IsActive as Status,
      LastLoggedin

   from 
        '+@DBname+'.dbo.UserDetails'

    execute sp_executesql @query=@Selectstring

我正在使用动态查询执行此操作。我希望将@Dbname值发送为

  set @dbname='dbname1,dbname2,dbname3'

每个数据库都有这个表,我想从不同的数据库中获取所有这些表的数据。请帮我解决这个问题

这是一种假设在同一服务器(db1,db2,db3)上有3个数据库的方法,这些数据库有一个名为table_1的公用表。 它使用sys.databases(如果是sql2005或更新版本)来遍历数据库,在构建@dbname字符串的方式上略有不同,您需要用单引号将每个数据库名称括起来,以正确使用它作为IN子句的一部分

注意:如果需要,您可以将光标更改一段时间。

DECLARE @dbname NVARCHAR(MAX)
SET @dbname='''db1'',''db2'',''db3'''

EXEC (
'DECLARE @db NVARCHAR(255)
DECLARE DB_CURSOR CURSOR FOR
    SELECT tbl.name FROM 
        (SELECT db.name from sys.databases db WHERE db.name IN (' + @DBname + ')) as tbl
    OPEN DB_CURSOR
    FETCH NEXT FROM DB_CURSOR
    INTO @db
    WHILE @@FETCH_STATUS = 0
    BEGIN
        EXEC(''SELECT * FROM '' + @db + ''.dbo.table_1'')
        FETCH NEXT FROM DB_CURSOR INTO @db
    END
CLOSE DB_CURSOR
DEALLOCATE DB_CURSOR'
)
declare @dbname varchar(max)
select @dbname = 'master, model, msdb'
declare @sql varchar(max)
select @sql = isnull(@sql,'') 
    + case when @sql is null then '' else ' union all ' end
    + 'select ''' + db.name + ''' dbname, *from ' + db.name + '.dbo.sysfiles'
from sys.databases db
where @dbname like '%' + db.name + '%'

execute (@sql)

这假定所有数据库的排序规则相同,并将所有结果返回到单个结果集中,并将源数据库名称作为列。 但是,如果您具有类似名称的数据库(例如Database1和Database10),那么如果您将Database10作为参数传递,则会返回Database1和Database10的结果,因为Database1是Database10的子字符串。

最好使用表变量作为输入,或者将csv字符串转换为具有split函数的表,然后连接到新表而不是使用“where @dbname like ...”语法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM