![](/img/trans.png)
[英]How to use recursive logic to return only the Root row in a sql table (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.