我有一个动态查询,我需要发送数据库名称作为逗号分隔值和来自不同数据库的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'
每个数据库都有这个表,我想从不同的数据库中获取所有这些表的数据。请帮我解决这个问题
答案 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 ...”语法。