在变量和游标中使用数据库名称进行跨数据库查询

时间:2012-07-12 13:22:35

标签: sql-server database

我在游标中遇到数据库名称的问题。 这是当前的代码

DECLARE @IDES INT
DECLARE @IDPROD INT

DECLARE @count INT
SET @count = 0

DECLARE CUR_CONSO CURSOR LOCAL fast_forward FOR

    SELECT E2.id_es ,P3.id_prod FROM
    [gpto_v004p001].[dbo].[GPTO_PRODETAB] P1
    INNER JOIN
    [fer_v008].[dbo].[T_PRODUIT] P3
    ON P3.GPTO_PRODUIT_ID = P1.GPTO_PRODUIT_ID
    INNER JOIN [gpto_v004p001].[dbo].[GPTO_ETAB] E1
    ON E1.ETABID = P1.ETABID
    INNER JOIN
    [fer_v008].[dbo].[t_etablissement] E2
    ON E1.ETABUC = LEFT(E2.code_es,5)
    LEFT JOIN
    [fer_v008].[dbo].[t_produit_etablissement] PE1
    ON PE1.id_prod = P3.id_prod AND PE1.id_es = E2.id_es
    WHERE PE1.id_es IS NULL AND GPTO_PRODUIT_ETAPE = 4

OPEN CUR_CONSO

FETCH CUR_CONSO INTO @IDES , @IDPROD

WHILE @@FETCH_STATUS = 0

BEGIN

    IF NOT EXISTS (Select * from [fer_v008].[dbo].[t_produit_etablissement] where id_es=@IDES and id_prod=@IDPROD) -- Pas d'enregistrements
    BEGIN

        INSERT INTO [fer_v008].[dbo].[t_produit_etablissement]
               ([id_es],[id_prod],[gest_prod])
         VALUES
               (@IDES,@IDPROD,0)

        SET @count = @count + 1

    END

FETCH CUR_CONSO INTO @IDES , @IDPROD

END

CLOSE CUR_CONSO

DEALLOCATE CUR_CONSO

由于数据库是版本化的,我需要使用数据库名称作为参数表中保存的变量。 为了便于编写脚本,我使用执行命令

DECLARE @base_travail varchar(128)
SELECT @base_travail = val_str_par FROM t_parametre WHERE nom_par = 'base_travail'
DECLARE @execcmd varchar(max)
SET @execcmd = 'insert into #tmpfiltres SELECT TOP 1 filtre_exu FROM ' 
  +  @base_travail + '.dbo.t_export_util WHERE id_exu =' + convert(varchar,@id_exu)
Execute (@execcmd)

但是当我有光标时这是怎么做到的?第一个示例代码只是一个示例,整个脚本超过400行,所以我无法在字符串模式下切换所有脚本。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我有同样的问题。与数据库兼容级别有关。

本准则:

DECLARE @VARSql varchar(2000), @ID int;
SET @VARSql = 'USE [SomeOtherDatabase]; DECLARE cur CURSOR GLOBAL for 
  SELECT Max(SomeTableID) FROM [dbo].[SomeTable];';
Exec(@VARSql); open cur; fetch next from cur into @ID; close cur; deallocate cur;
PRINT @ID

生成此错误:

Msg 16958, Level 16, State 3, Line 3
Could not complete cursor operation because the set options have changed since the cursor was declared.

在SQL 2008服务器上运行 调用数据库具有兼容级别90(Sql Svr 2005)。 上面代码中的SomeOtherDatabase具有兼容级别100(Sql Svr 2008)。

如果更改兼容级别,则调用和调用的数据库相同,问题就解决了。

select * from sys.databases
ALTER DATABASE [CallingDatabase] SET COMPATIBILITY_LEVEL = 100;

答案 1 :(得分:0)

我遇到了同样的问题。这是我的解决方案;

DECLARE CUR_CORSO CURSOR **FAST_FORWARD FORWARD_ONLY** FOR

...