光标的替代品

时间:2015-02-04 15:23:21

标签: sql-server-2008 tsql

我正在寻找一种将光标用于存储过程的替代方法。我不想像下面那样选择每个数据库(LAL,SINC,SMSS),而是想从一个单独的表中选择一个字符串列表并将它们插入到@rates表中,并与相应的db / table连接。有没有办法用连接来做这个,或者我需要用Dynamic SQL / Cursor写这个吗?

我正在寻找可能的解决方案并感谢所有建议。谢谢。

DECLARE @rates TABLE
(
    DB       CHAR(5),
    FUTASUTA CHAR(3),
    DSCRIPTN CHAR(31),
    FUSUTXRT DECIMAL(18,4)
)

-- LAL Rates
INSERT INTO @rates 
    SELECT 'LAL', FUTASUTA, DSCRIPTN, (CONVERT(DECIMAL(18,4),FUSUTXRT))/10000000 as FUSUTXRT 
    FROM [LAL].[dbo].[UPR40100]

-- SINC Rates
INSERT INTO @rates 
    SELECT 'SINC', FUTASUTA, DSCRIPTN, (CONVERT(DECIMAL(18,4),FUSUTXRT))/10000000 as FUSUTXRT  
    FROM [SINC].[dbo].[UPR40100]

-- SMSS Rates
INSERT INTO @rates 
    SELECT 'SMSS', FUTASUTA, DSCRIPTN, (CONVERT(DECIMAL(18,4),FUSUTXRT))/10000000 as FUSUTXRT  
    FROM [SMSS].[dbo].[UPR40100]

....etc

包含Distinct数据库的表是一个名为/ id' s

的简单表

id |名称

1 | LAL

2 | SINC

3 | SMSS

等...

1 个答案:

答案 0 :(得分:2)

以下方法适合您:

DECLARE @TABLE TABLE(DBNAME VARCHAR(50))
DECLARE @DYNAMICQUERY VARCHAR(MAX)

INSERT INTO @TABLE VALUES('LAL')
INSERT INTO @TABLE VALUES('SINC')
INSERT INTO @TABLE VALUES('SMSS')

SET @DYNAMICQUERY = 
(
SELECT 'INSERT INTO @rates SELECT '''+ DBNAME +''', FUTASUTA,DSCRIPTN, (CONVERT(DECIMAL(18,4),FUSUTXRT))/10000000 as FUSUTXRT FROM ['+ DBNAME + '].[dbo].[UPR40100];'
FROM @TABLE
FOR XML PATH('')
)

EXEC(@DYNAMICQUERY)