簡體   English   中英

僅對具有特定表的數據庫使用“插入”(SQL Server 2008 R2)

[英]Use “insert into” only with databases that has a certain table ( SQL Server 2008 R2 )

我需要在將要創建的新表(具有相同結構)中,使用某個表,所有數據庫的所有信息進行“日志”。

但並非所有數據庫都有此表。

我可以進行查詢以找到所有具有該表的數據庫:

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語句,在該語句中進行測試以查看表是否存在,如果存在,則提取記錄。

好的,這是一個示例游標,該游標在服務器上的數據庫中循環查找特定的表名,如果該表名存在,它會執行某些操作(您必須為@ 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM