Mensaje sobre [ REPEATABLE_READ ]

24/07/2008 - 00:55 por Alr | Informe spam
Saludos al grupo.

Tengo un codigo Sql como sigue:
Lo que hace es un select de una tabla remota de los registros que tienen un
status diferente de 'P' [Procesado], y los evisa vs. el
servidor local para ver si ya existen, si ya existen pone un status de 'P"
en el servidor remoto (para que en otro proceso ya no los
considere por estar ya procesados).

DECLARE @LlaFac CHAR(10)
DECLARE @Status CHAR(1)
"P"[Procesado] en el servidor Local.
SET @LlaFac = ' '
SET @Status = ' '
DECLARE FLE_VER CURSOR FOR SELECT LLAFAC, ISNULL(STATUS, 'A')
FROM SERVREMOTO.DATABASE.dbo.TABLA WHERE ISNULL(STATUS, 'A') <> 'P'
OPEN FLE_VER
FETCH NEXT FROM FLE_VER INTO @LlaFac, @Status
WHILE @@FETCH_STATUS = 0
BEGIN
IF (@Status = 'A') OR (@Status = 'B') OR (@Status = 'C')
BEGIN
IF (@Status = 'A') OR (@Status = 'C')
BEGIN
IF EXISTS(SELECT * FROM TABLALOCALWHERE LlaFac = @LlaFac)
BEGIN
UPDATE SERVREMOTO.DATABASE.dbo.TABLA SET Status =
'P' WHERE LlaFac = @LlaFac
END
END
ELSE
IF NOT EXISTS(SELECT * FROM TABLALOCALWHERE LlaFac = @LlaFac)
BEGIN
DELETE SERVREMOTO.DATABASE.dbo.TABLA WHERE LlaFac =
@LlaFac
END
END
FETCH NEXT FROM FLE_VER INTO @LlaFac, @Status
END
CLOSE FLE_VER
DEALLOCATE FLE_VER
GO


El problema es que cuando lo ejecuto mediante el Query Analyzer me da el
siguiente mensaje en la pestana de [Messages] :
Remote tables are not updatable. Updatable keyset-driven cursors on remote
tables require a transaction with the REPEATABLE_READ or SERIALIZABLE
isolation level spanning the cursor.

Veo en la ayuda de Sql que se puede serolver con:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

Pero no se donde va insertado este codigo, en que parte va ?

Cualquier ayuda es bienvenida.

Gracias.
 

Leer las respuestas

#1 Alejandro Mesa
24/07/2008 - 17:18 | Informe spam
Me inmagino que deba estar anter de abrir el cursor.

Por que no tratas de hacerlo sin usar cursores. Crea un servidor ligado
(linked server) en el servidor remoto, que apunte hacia el servidor donde
esta la tabla [tablalocal], y ejecuta estas sentencias de el lado de el
servidor remoto.

use database
go

update dbo.TABLA
set status = 'P'
where status = 'A' or status = 'C' or status is null
and exists (
select 1
from servidor_ligado.database.tablalocal as a
where a.LLAFAC = dbo.TABLA.LLAFAC
)
GO

delete dbo.TABLA
where status = 'B'
and exists (
select 1
from servidor_ligado.database.tablalocal as a
where a.LLAFAC = dbo.TABLA.LLAFAC
)
GO


AMB

"Alr'" wrote:

Saludos al grupo.

Tengo un codigo Sql como sigue:
Lo que hace es un select de una tabla remota de los registros que tienen un
status diferente de 'P' [Procesado], y los evisa vs. el
servidor local para ver si ya existen, si ya existen pone un status de 'P"
en el servidor remoto (para que en otro proceso ya no los
considere por estar ya procesados).

DECLARE @LlaFac CHAR(10)
DECLARE @Status CHAR(1)
"P"[Procesado] en el servidor Local.
SET @LlaFac = ' '
SET @Status = ' '
DECLARE FLE_VER CURSOR FOR SELECT LLAFAC, ISNULL(STATUS, 'A')
FROM SERVREMOTO.DATABASE.dbo.TABLA WHERE ISNULL(STATUS, 'A') <> 'P'
OPEN FLE_VER
FETCH NEXT FROM FLE_VER INTO @LlaFac, @Status
WHILE @@FETCH_STATUS = 0
BEGIN
IF (@Status = 'A') OR (@Status = 'B') OR (@Status = 'C')
BEGIN
IF (@Status = 'A') OR (@Status = 'C')
BEGIN
IF EXISTS(SELECT * FROM TABLALOCALWHERE LlaFac = @LlaFac)
BEGIN
UPDATE SERVREMOTO.DATABASE.dbo.TABLA SET Status =
'P' WHERE LlaFac = @LlaFac
END
END
ELSE
IF NOT EXISTS(SELECT * FROM TABLALOCALWHERE LlaFac = @LlaFac)
BEGIN
DELETE SERVREMOTO.DATABASE.dbo.TABLA WHERE LlaFac =
@LlaFac
END
END
FETCH NEXT FROM FLE_VER INTO @LlaFac, @Status
END
CLOSE FLE_VER
DEALLOCATE FLE_VER
GO


El problema es que cuando lo ejecuto mediante el Query Analyzer me da el
siguiente mensaje en la pestana de [Messages] :
Remote tables are not updatable. Updatable keyset-driven cursors on remote
tables require a transaction with the REPEATABLE_READ or SERIALIZABLE
isolation level spanning the cursor.

Veo en la ayuda de Sql que se puede serolver con:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

Pero no se donde va insertado este codigo, en que parte va ?

Cualquier ayuda es bienvenida.

Gracias.



Preguntas similares