我的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
在输出中,我需要db名称和TimeLine
表的记录数。
实现我的目标的最佳途径是什么?
答案 0 :(得分:2)
在执行SQL查询字符串时使用括号,如下所示:
EXEC (@sql)
。如果没有括号,SQL Server会将@sql
解释为存储过程或用户定义的函数。
答案 1 :(得分:0)
请尝试在exec-line下面添加一个fetch,然后尝试将@SQL变量放在exec括号后面。这在我的SQL Server环境中有效。
希望这会有所帮助
BR 帕特里克
答案 2 :(得分: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 数据类型更改为 nvarchar()并使用
exec sp_executesql @sql