使用“;插入”;仅适用于具有特定表的数据库(SQL Server 2008 R2)
我需要在我将要创建的新表(具有相同的结构)中使用某个表、所有数据库的所有信息进行“日志” 但并非所有数据库都有此表 我可以进行查询以查找包含我想要的表的所有数据库:使用“;插入”;仅适用于具有特定表的数据库(SQL Server 2008 R2),sql,sql-server,sql-server-2008-r2,cursor,Sql,Sql Server,Sql Server 2008 R2,Cursor,我需要在我将要创建的新表(具有相同的结构)中使用某个表、所有数据库的所有信息进行“日志” 但并非所有数据库都有此表 我可以进行查询以查找包含我想要的表的所有数据库: SELECT name FROM sys.databases WHERE CASE WHEN state_desc = 'ONLINE' THEN OBJECT_ID(QUOTENAME(name) + '.[dbo].[tblLogdiscador]', 'U')
SELECT name
FROM sys.databases
WHERE CASE
WHEN state_desc = 'ONLINE'
THEN OBJECT_ID(QUOTENAME(name) + '.[dbo].[tblLogdiscador]', 'U')
END IS NOT NULL
它将只列出包含我要记录的表的数据库。但现在我需要做一个循环,遍历所有数据库,将“tbllogdiscador”的信息插入到我创建的表中。我在SP_MSFOREACHDB中考虑过,但我看到很多人说不要使用它
我如何在所有拥有该表的数据库中循环,如果有,则插入到新的日志表中
下面的代码对我没有帮助:
exec sp_msforeachdb 'if ((select count(*)
from [?].sys.tables Where name in(''tbllogdiscador''))=1)
begin
insert into [The new tbl log]
select * from ?.dbo.tbllog
end
我正在尝试使用光标,但遇到了问题
想知道如何在WHILE中实现这一点吗?要实现您的想法,您需要某种流程逻辑(A似乎是最合适的选择),并且 因此,最重要的是我们需要获取所有的DB名称,将它们放在游标中,然后使用游标执行动态sql语句,您可以在其中测试是否存在表的名称,如果存在,则提取记录 好的,下面是一个示例游标,它在服务器上的DBs中循环,查找特定的表名,如果它存在,则执行某些操作(您必须为@Sql2执行sql):
为了实现您的想法,您需要某种流程逻辑(A似乎是最合适的选择),以及 因此,最重要的是我们需要获取所有的DB名称,将它们放在游标中,然后使用游标执行动态sql语句,您可以在其中测试是否存在表的名称,如果存在,则提取记录 好的,下面是一个示例游标,它在服务器上的DBs中循环,查找特定的表名,如果它存在,则执行某些操作(您必须为@Sql2执行sql):
declare @DBName varchar(256)
declare @SQL1 nvarchar(max)
declare @Sql2 nvarchar(max)
DECLARE db_cursor CURSOR FOR
SELECT name
FROM sys.databases
WHERE state_desc = 'ONLINE'
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @DBName
WHILE @@FETCH_STATUS = 0
Begin
set @SQL1 = 'Select Name from ' + @DBName + '.sys.objects where name = ''tblLogdiscador'' '
set @SQL2 = --Your select and insert statement selecting from @DBName + 'dbo.tbllogdiscador'
if exists(exec sp_executesql @Sql1)
begin
exec sp_executesql @sql2
end
FETCH NEXT FROM db_cursor INTO @DBName
end
close db_cursor
deallocate db_cursor