2016-07-19 94 views
0

我的SQL Server中有多個數據庫。所有數據庫結構相同,但數據不同。這些數據庫用於存儲傳感器數據,因此每個傳感器都有自己獨立的SQL Server數據庫。查詢所有數據庫記錄的數量

我想要一個查詢來選擇數據庫名稱和每個數據庫的特定表中的記錄數。

我試着用遊標。我收到錯誤說名稱{query}不是一個有效的標識符。我的光標如下:

Declare @dbname Varchar (50), @sql Varchar(1000) 

Declare db_cursor CURSOR FOR 
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name LIKE 'EP505-%' -- All sensors of EP505 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @dbname 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sql= 'SELECT Count(*) FROM [' + @dbname + '].dbo.TimeLine' 
    EXEC @sql 
FETCH NEXT FROM db_cursor INTO @dbname 
END 
CLOSE db_cursor 
DEALLOCATE db_cursor 

在我需要的數據庫名稱,併爲TimeLine表中的記錄數輸出。

什麼是實現我所嘗試的最佳方式。

+0

嘗試'EXEC(@sql)'否則SQL Server將解釋你'@ sql'內容作爲存儲過程或用戶定義的函數,而不是查詢字符串。 –

+0

它的工作原理,我如何獲得@dbname? – progrAmmar

+0

我明白了。謝謝 – progrAmmar

回答

2

執行SQL查詢字符串時使用括號如下: EXEC (@sql)。如果沒有括號,SQL Server會將@sql解釋爲存儲過程或用戶定義的函數。

0

到目前爲止您的嘗試看起來相當不錯。

請嘗試在exec-line下面添加一個提取,然後嘗試將@SQL變量放在exec括號後面。這在我的SQL Server環境中起作用。

希望這有助於

BR 帕特里克

0

您可以使用sp_executeSQL執行動態查詢,而不是exec語句,這將幫助你解決你的問題

下面是修改的版本

Declare @dbname Varchar (50), @sql nVarchar(1000) 

Declare db_cursor CURSOR FOR 
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name LIKE 'kodyaz' -- All sensors of EP505 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @dbname 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sql= N'SELECT Count(*) FROM [' + @dbname + '].dbo.Kontaktpersonen' 
    exec sp_executesql @sql 
FETCH NEXT FROM db_cursor INTO @dbname 
END 
CLOSE db_cursor 
DEALLOCATE db_cursor 

我改變@sql d ATA類型爲nvarchar()和使用

exec sp_executesql @sql 
相關問題