从多个数据库中选择数据

时间:2011-08-23 07:21:38

标签: sql sql-server-2005 sql-server-2008

我有一个动态查询,我需要发送数据库名称作为逗号分隔值和来自不同数据库的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'

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

2 个答案:

答案 0 :(得分:2)

这是一种假设在同一服务器(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'
)

答案 1 :(得分:0)

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 ...”语法。