我在游标中遇到数据库名称的问题。 这是当前的代码
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行,所以我无法在字符串模式下切换所有脚本。
感谢您的帮助。
答案 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
...