【问题标题】:Use “insert into” only with databases that has a certain table ( SQL Server 2008 R2 )仅对具有特定表的数据库使用“插入”(SQL Server 2008 R2)
【发布时间】:2015-07-01 14:40:20
【问题描述】:

我需要在我将创建的新表(具有相同结构)中包含某个表、所有数据库的所有信息的“日志”。

但并非所有数据库都有此表。

我可以进行查询以查找具有我想要的此表的所有数据库:

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 做到这一点?

【问题讨论】:

    标签: sql sql-server sql-server-2008-r2 cursor


    【解决方案1】:

    要做你想做的事,你需要某种流程逻辑(cursor 似乎是最合适的选择)和dynamic sql

    所以高级是我们需要获取所有的DB名称,将它们放入游标中,然后使用游标执行您测试的动态sql语句以查看表是否存在,如果存在则拉取记录所以。

    好的,这是一个示例游标,它在服务器上循环查找特定表名,如果存在,则执行某些操作(您必须为 @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
    

    【讨论】:

      猜你喜欢
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多