2011-06-04 30 views
0

我需要一个数据库变量,因为我从中访问数据的表将存在于各种数据库中,如dBase1,dBase2等。我无法在字符串中使用Select ...因为我想要将Select语句用于游标,这看起来不允许使用字符串和exec命令。这是一个不起作用的例子。任何建议表示赞赏...从@DatabaseName中选择

DECLARE @fromDBase varchar(10), @FundCD char(4), @actID INT, 
    @PortCode char(4), @FundDecm INT, @PlanCd char(6) 
set @FundCD = 'F0XX' 
set @actID = 11135408 
set @PortCode = 'P001' 
set @FundDecm = 3 
set @PlanCd = 'XXX001' 
DECLARE csFin cursor STATIC LOCAL for 
SELECT PortionCode, CashValue, UnitValue, CostValue, UniqueID 
from (SELECT DatabaseName FROM [dBase1].[dbo].mPTLDetail WHERE plancode = @PlanCd) 
WHERE AccountID = @actID 
    AND FundCode = @FundCd 
    AND UnitValue != 0 
    AND (Cast(Str(UnitValue, 12, @FundDecm) as money) - UnitValue) != 0 

回答

0

我认为你需要建立一个动态的语句,并调用exec sp_executesql来执行它。 不知道这将如何影响光标,但我不太熟悉它们。

DECLARE @fromDBase varchar(10), @FundCD char(4), @actID INT, 
    @PortCode char(4), @FundDecm INT, @PlanCd char(6), 
    @sqlstatement nvarchar(4000) 
set @FundCD = 'F0XX' 
set @actID = 11135408 
set @PortCode = 'P001' 
set @FundDecm = 3 
set @PlanCd = 'XXX001' 

SELECT @fromDBase = DatabaseName FROM [dBase1].[dbo].mPTLDetail WHERE plancode = @PlanCd 

set @sqlstatement = 'DECLARE csFin cursor STATIC LOCAL for SELECT PortionCode, CashValue, 
UnitValue, CostValue, UniqueID from' + @fromDBase + 'WHERE AccountID = ' + @actID + ' AND  
FundCode = ' + @FundCd + ' AND UnitValue != 0 AND (Cast(Str(UnitValue, 12, ' + @FundDecm 
+') as money) - UnitValue) != 0' 

exec sp_executesql @sqlstatement 
+0

这个[问题](http://stackoverflow.com/questions/1045880/using-a-cursor-with-dynamic-sql-in-a-stored-procedure)可能会有帮助也 – coryT 2011-06-04 14:38:24

+0

小心,但是。 SQL注入可能会造成不好的后果。 – 2011-06-04 16:38:00

0

游标可以通过使用游标变量和sp_executesql一起动态分配。

CREATE PROCEDURE GetData 
    @FundCD char(4), @actID int, @PortCode char(4), @FundDecm int, 
    @PlanCd char(6) 
AS 

DECLARE @fromDBase varchar(10), @query nvarchar(max), @cursor cursor 

SET @fromDBase = 
(
    SELECT DatabaseName 
    FROM [dBase1].[dbo].mPTLDetail 
    WHERE plancode = @PlanCd 
) 

SET @query = N' 
    SET @cursor = CURSOR FOR 
     SELECT PortionCode, CashValue, UnitValue, CostValue, UniqueID 
     FROM ' + QUOTENAME(@fromDBase) + '.[dbo].[Table1] 
     WHERE AccountID = @actID 
      AND FundCode = @FundCd 
      AND UnitValue != 0 
      AND (Cast(Str(UnitValue, 12, @FundDecm) as money) - UnitValue) != 0; 

    OPEN @cursor;' 

EXEC sp_executesql @query, 
    N'@FundCD char(4), @actID int, @FundDecm int, @cursor cursor out', 
    @FundCD, @actID, @FundDecm, @cursor out 

FETCH NEXT FROM @cursor