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

データベースがバージョン管理されているので、パラメータテーブルに保存されている変数としてデータベース名を使用する必要があります。スクリプトを簡単にするために、このように実行コマンドを使用します

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.

SQL2008サーバーで実行しています。
呼び出し元のデータベースの互換性レベルは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 に答える