【问题标题】:Loop a query through multiple Databases using a cursor使用游标在多个数据库中循环查询
【发布时间】:2014-07-10 21:59:36
【问题描述】:

我正在尝试通过我在表中列出的多个数据库循环查询,我尝试使用游标并使用新数据库名称切换 USE 语句,但我不断收到不正确的语法错误。有没有办法做到这一点?以下是我的尝试。

Declare @storednamesDATABASE varchar(255)
Declare storednamesDBs_cursor Cursor
for
select Database_name from ##ALLTHEstorednames

Open storednamesDBs_cursor
Fetch next from storednamesDBs_cursor into @storednamesDATABASE
WHILE @@FETCH_STATUS = 0 BEGIN

Use @storednamesDATABASE
select distinct a.database_id, c.name as Database_Name, a.object_id, b.name as Table_Name,
dateadd(day, datediff(day, 0, getdate()),0) as Use_Date
from sys.dm_db_index_usage_stats a
join sys.all_objects b
on a.object_id = b.object_id
join sys.databases c
on a.database_id = c.database_id
where (a.last_user_seek between dateadd(hour, -24, CURRENT_TIMESTAMP) AND CURRENT_TIMESTAMP
or a.last_user_scan between dateadd(hour, -24, CURRENT_TIMESTAMP) AND CURRENT_TIMESTAMP
or a.last_user_lookup between dateadd(hour, -24, CURRENT_TIMESTAMP) AND CURRENT_TIMESTAMP)
and b.type = 'u'


End
Close storednamesDBs_cursor

【问题讨论】:

    标签: sql-server cursors


    【解决方案1】:

    首先,如果您使用的是 azure,则不能使用“使用”

    您的问题是“使用”不采用字符串(nvarchar)它采用对象名称。

    要实现这一点,您可以使用动态 SQL

    Select @Sql = 'Use ' + @storednamesDATABASE + ';  --Other SQL Here'
    Exec sp_executesql @Sql
    

    尽管您将不得不将查询的其余部分放在 Sql 字符串中,因为它不会更改您当前所在的连接。它有效地创建了一个存储过程并运行它。

    要将参数传递给您的查询,您可以使用类似

    Exec sp_executesql @Sql, N'@Var1 int, @Var2 nvarchar(50)', @Var1 = @SomeVar, @Var2 = 'Test'
    

    【讨论】:

    • 感谢您的帮助,但是当我尝试得到一个空结果集时。你能帮忙看看结合游标和 sp_executesql 的语法吗?
    • 您是在代码中运行它吗?还是 SqlServerManagementStudio?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    相关资源
    最近更新 更多