Sql server 从@DatabaseName中选择
我需要一个数据库变量,因为从中访问数据的表将位于各种数据库中,例如dBase1、dBase2等。我不能使用Select。。。在字符串中,因为我想将Select语句用于游标,这似乎不允许使用字符串和exec命令。这里有一个不起作用的例子。任何建议都将不胜感激Sql server 从@DatabaseName中选择,sql-server,Sql Server,我需要一个数据库变量,因为从中访问数据的表将位于各种数据库中,例如dBase1、dBase2等。我不能使用Select。。。在字符串中,因为我想将Select语句用于游标,这似乎不允许使用字符串和exec命令。这里有一个不起作用的例子。任何建议都将不胜感激 DECLARE @fromDBase varchar(10), @FundCD char(4), @actID INT, @PortCode char(4), @FundDecm INT, @PlanCd char(6) set @
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
我认为您需要构建一个动态语句并调用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
游标可以通过与
sp\u 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
不过,这可能会有所帮助。SQL注入可能会产生不良后果。