0

我对游标中的数据库名称有疑问。这里是当前代码

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

由于数据库是版本化的,我需要使用数据库名称作为保存在参数表中的变量。对于简单的脚本,我使用 Execute 命令作为这个

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 行,所以我无法在字符串模式下切换所有脚本。

谢谢你的帮助。

4

2 回答 2

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;
于 2013-06-17T16:23:42.063 回答
0

我有同样的问题。这是我的解决方案;

DECLARE CUR_CORSO CURSOR **FAST_FORWARD FORWARD_ONLY** FOR

...

于 2016-04-25T13:24:33.980 回答