如何使用游标从具有相同 table 结构的不同数据库的 Select 语句中获取结果集
How to get the result set from the Select statement from different databases having same table structure using cursor
下面是一段代码,我需要从不同数据库的同一条 select 语句中获取结果。我已经使用游标从 MASTER.dbo.sysdatabases select 数据库列表并将其传递给变量(即@name),它将一个接一个地保存数据库名称。
在select声明下我已经通过了@name.dbo.currencyconversionrates
但是,虽然 运行 代码我没有得到结果。错误信息:-
Msg 102, Level 15, State 1, Line 23 Incorrect syntax near '.'.
我的代码:
DECLARE @name nVARCHAR(100)
DECLARE @DBV nVARCHAR(100)
DECLARE @db_cursor CURSOR
SET @db_cursor = CURSOR FAST_FORWARD
FOR
SELECT name
FROM MASTER.dbo.sysdatabases
WHERE name IN ('ENT_Benteler','ENT_DEUTSCHE_BANK','ELV_Henry_Schein','ENT_HONDA')
OPEN @db_cursor
FETCH NEXT FROM @db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
set @DBV= @name
FETCH NEXT FROM @db_cursor INTO @name
--print @DBV
--use @name
select row_id, base_currency,conversion_currency, effective_period_start, effective_period_end, rate, effective_period_start as 'Use this for Script' from @name.dbo.currencyconversionrates
order by CONVERSION_CURRENCY,EFFECTIVE_PERIOD_START
END
CLOSE @db_cursor
DEALLOCATE @db_cursor
请帮助我解决我的问题。
select row_id, base_currency,conversion_currency, effective_period_start, effective_period_end, rate, effective_period_start as 'Use this for Script'
from @name.dbo.currencyconversionrates
order by CONVERSION_CURRENCY,EFFECTIVE_PERIOD_START
以上部分不正确,因为不支持from
之后的参数。你应该利用 dynamic SQL
,忽略 SQL injection
,你可以这样做:
DECLARE @SQL VARCHAR(MAX)
SET @SQL = '
select row_id, base_currency,conversion_currency, effective_period_start, effective_period_end, rate, effective_period_start as [Use this for Script]
from ['+ @name +'].dbo.currencyconversionrates
order by CONVERSION_CURRENCY,EFFECTIVE_PERIOD_START'
print (@SQL)
--EXEC (@SQL)
在 EXEC
中发表评论之前尝试 print
下面是一段代码,我需要从不同数据库的同一条 select 语句中获取结果。我已经使用游标从 MASTER.dbo.sysdatabases select 数据库列表并将其传递给变量(即@name),它将一个接一个地保存数据库名称。
在select声明下我已经通过了@name.dbo.currencyconversionrates
但是,虽然 运行 代码我没有得到结果。错误信息:-
Msg 102, Level 15, State 1, Line 23 Incorrect syntax near '.'.
我的代码:
DECLARE @name nVARCHAR(100)
DECLARE @DBV nVARCHAR(100)
DECLARE @db_cursor CURSOR
SET @db_cursor = CURSOR FAST_FORWARD
FOR
SELECT name
FROM MASTER.dbo.sysdatabases
WHERE name IN ('ENT_Benteler','ENT_DEUTSCHE_BANK','ELV_Henry_Schein','ENT_HONDA')
OPEN @db_cursor
FETCH NEXT FROM @db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
set @DBV= @name
FETCH NEXT FROM @db_cursor INTO @name
--print @DBV
--use @name
select row_id, base_currency,conversion_currency, effective_period_start, effective_period_end, rate, effective_period_start as 'Use this for Script' from @name.dbo.currencyconversionrates
order by CONVERSION_CURRENCY,EFFECTIVE_PERIOD_START
END
CLOSE @db_cursor
DEALLOCATE @db_cursor
请帮助我解决我的问题。
select row_id, base_currency,conversion_currency, effective_period_start, effective_period_end, rate, effective_period_start as 'Use this for Script'
from @name.dbo.currencyconversionrates
order by CONVERSION_CURRENCY,EFFECTIVE_PERIOD_START
以上部分不正确,因为不支持from
之后的参数。你应该利用 dynamic SQL
,忽略 SQL injection
,你可以这样做:
DECLARE @SQL VARCHAR(MAX)
SET @SQL = '
select row_id, base_currency,conversion_currency, effective_period_start, effective_period_end, rate, effective_period_start as [Use this for Script]
from ['+ @name +'].dbo.currencyconversionrates
order by CONVERSION_CURRENCY,EFFECTIVE_PERIOD_START'
print (@SQL)
--EXEC (@SQL)
在 EXEC
print