Trigger con Instead OF

19/11/2004 - 18:35 por Anonimo | Informe spam
Hola amigos, tengo un triger de actualización (Update) con instead of
(utilizo instead of debido a que existen campos text en mi tabla y con "for
update" no me permite), con los datos de la tabla inserted actualizo en
otras 3 bases de datos que tienen la misma tabla y por último actualizo la
tabla que contiene al trigger. Todas estas actualizaciones las hago con
sp_executesql. Las tablas de las otras bases de datos son actualizadas
satisfactoriamente, pero la tabla que contiene al trigger no actualiza. Le
he puesto un print @@rowcount y me indica que hizo la actualizacion, incluso
el mensaje del servidor: "1 fila actualizada". Pero no actualiza nada. Lo
mismo me sucede con el trigger de inserción, Cuando hago el update sin
utilizar sp_executesql si funciona. ¿a que se puede deber?

Gracias por sus respuestas.

Preguntas similare

Leer las respuestas

#1 Maxi
19/11/2004 - 19:02 | Informe spam
Hola, pues es uno de los sintomas del SQL-Dinamico :(

Mi pregunta es:

Porque usas sp_exceutesql?


Salu2
Maxi


<a> escribió en el mensaje news:%
Hola amigos, tengo un triger de actualización (Update) con instead of
(utilizo instead of debido a que existen campos text en mi tabla y con
"for update" no me permite), con los datos de la tabla inserted actualizo
en otras 3 bases de datos que tienen la misma tabla y por último actualizo
la tabla que contiene al trigger. Todas estas actualizaciones las hago con
sp_executesql. Las tablas de las otras bases de datos son actualizadas
satisfactoriamente, pero la tabla que contiene al trigger no actualiza. Le
he puesto un print @@rowcount y me indica que hizo la actualizacion,
incluso el mensaje del servidor: "1 fila actualizada". Pero no actualiza
nada. Lo mismo me sucede con el trigger de inserción, Cuando hago el
update sin utilizar sp_executesql si funciona. ¿a que se puede deber?

Gracias por sus respuestas.


Respuesta Responder a este mensaje
#2 Anonimo
19/11/2004 - 19:12 | Informe spam
porque mi instruccion update la tengo que construir dinamicamente en base a
una comparación de campos coincidentes entre 2 tablas

"Maxi" wrote in message
news:
Hola, pues es uno de los sintomas del SQL-Dinamico :(

Mi pregunta es:

Porque usas sp_exceutesql?


Salu2
Maxi


<a> escribió en el mensaje news:%
Hola amigos, tengo un triger de actualización (Update) con instead of
(utilizo instead of debido a que existen campos text en mi tabla y con
"for update" no me permite), con los datos de la tabla inserted actualizo
en otras 3 bases de datos que tienen la misma tabla y por último
actualizo la tabla que contiene al trigger. Todas estas actualizaciones
las hago con sp_executesql. Las tablas de las otras bases de datos son
actualizadas satisfactoriamente, pero la tabla que contiene al trigger no
actualiza. Le he puesto un print @@rowcount y me indica que hizo la
actualizacion, incluso el mensaje del servidor: "1 fila actualizada".
Pero no actualiza nada. Lo mismo me sucede con el trigger de inserción,
Cuando hago el update sin utilizar sp_executesql si funciona. ¿a que se
puede deber?

Gracias por sus respuestas.






Respuesta Responder a este mensaje
#3 Maxi
19/11/2004 - 19:18 | Informe spam
mmm, eso no me gusta mucho!! podrias exponer el codigo y la necesidad!!
quizas podamos sacar el sql-dinamico :)


Salu2
Maxi


<a> escribió en el mensaje news:
porque mi instruccion update la tengo que construir dinamicamente en base
a una comparación de campos coincidentes entre 2 tablas

"Maxi" wrote in message
news:
Hola, pues es uno de los sintomas del SQL-Dinamico :(

Mi pregunta es:

Porque usas sp_exceutesql?


Salu2
Maxi


<a> escribió en el mensaje
news:%
Hola amigos, tengo un triger de actualización (Update) con instead of
(utilizo instead of debido a que existen campos text en mi tabla y con
"for update" no me permite), con los datos de la tabla inserted
actualizo en otras 3 bases de datos que tienen la misma tabla y por
último actualizo la tabla que contiene al trigger. Todas estas
actualizaciones las hago con sp_executesql. Las tablas de las otras
bases de datos son actualizadas satisfactoriamente, pero la tabla que
contiene al trigger no actualiza. Le he puesto un print @@rowcount y me
indica que hizo la actualizacion, incluso el mensaje del servidor: "1
fila actualizada". Pero no actualiza nada. Lo mismo me sucede con el
trigger de inserción, Cuando hago el update sin utilizar sp_executesql
si funciona. ¿a que se puede deber?

Gracias por sus respuestas.










Respuesta Responder a este mensaje
#4 Anonimo
19/11/2004 - 19:45 | Informe spam
CREATE TRIGGER marketing_activity_update ON [dbo].[Marketing_Activity]
INSTEAD OF UPDATE
AS

select * into #tablainsert from inserted
update #tablainsert set rn_descriptor=activity_name

declare @codigo as int

select @codigo=id from sysobjects where name='marketing_activity'

select name into #campos_mr from syscolumns where id=@codigo

select @codigo=id from production_ed_ch..sysobjects where
name='marketing_activity'

select name into #campos_ch from production_ed_ch..syscolumns where
id=@codigo

select @codigo=id from production_ed_jp..sysobjects where
name='marketing_activity'

select name into #campos_jp from production_ed_jp..syscolumns where
id=@codigo

select @codigo=id from production_ed_kr..sysobjects where
name='marketing_activity'

select name into #campos_kr from production_ed_kr..syscolumns where
id=@codigo

select a.name into #campos_mr_ch from #campos_mr a inner join #campos_ch b
on a.name = b.name collate Chinese_PRC_BIN

select a.name into #campos_mr_jp from #campos_mr a inner join #campos_jp b
on a.name = b.name collate Japanese_BIN

select a.name into #campos_mr_kr from #campos_mr a inner join #campos_kr b
on a.name = b.name collate Korean_Wansung_BIN

declare @nombre_campo as varchar(200)
declare @flag as bit

set @flag = 0
declare @comando_mr as nvarchar(2000)
set @comando_mr = ''

declare nombres_campos cursor for select name from #campos_mr
open nombres_campos
fetch next from nombres_campos into @nombre_campo

while @@fetch_status = 0
begin
if @flag = 0
begin
set @comando_mr = rtrim(@nombre_campo)+'=a.'+rtrim(@nombre_campo)
set @flag = 1
end
else
set @comando_mr = rtrim(@comando_mr) + ',' +
rtrim(@nombre_campo)+'=a.'+rtrim(@nombre_campo)

fetch next from nombres_campos into @nombre_campo
end

CLOSE nombres_campos
DEALLOCATE nombres_campos

set @comando_mr = 'update production_ed..marketing_activity set
'+@comando_mr+' from production_ed..marketing_activity b inner join
#tablainsert a on b.Marketing_Activity_Id =a.Marketing_Activity_Id'
print @comando_mr

print 'Actualizando en master'
exec sp_executesql @comando_mr
print @@rowcount

set @flag = 0
declare @comando_ch as nvarchar(2000)
set @comando_ch = ''

declare nombres_campos cursor for select name from #campos_mr_ch
open nombres_campos
fetch next from nombres_campos into @nombre_campo

while @@fetch_status = 0
begin
if @flag = 0
begin
set @comando_ch = rtrim(@nombre_campo)+'=a.'+rtrim(@nombre_campo)
set @flag = 1
end
else
set @comando_ch = rtrim(@comando_ch) + ',' +
rtrim(@nombre_campo)+'=a.'+rtrim(@nombre_campo)

fetch next from nombres_campos into @nombre_campo
end

CLOSE nombres_campos
DEALLOCATE nombres_campos

set @comando_ch = 'update production_ed_ch..marketing_activity set
'+@comando_ch+' from production_ed_ch..marketing_activity b inner join
#tablainsert a on b.Marketing_Activity_Id =a.Marketing_Activity_Id'
print @comando_ch

set @flag = 0
declare @comando_jp as nvarchar(2000)
set @comando_jp = ''

declare nombres_campos cursor for select name from #campos_mr_jp
open nombres_campos
fetch next from nombres_campos into @nombre_campo

while @@fetch_status = 0
begin
if @flag = 0
begin
set @comando_jp = rtrim(@nombre_campo)+'=a.'+rtrim(@nombre_campo)
set @flag = 1
end
else
set @comando_jp = rtrim(@comando_jp) + ',' +
rtrim(@nombre_campo)+'=a.'+rtrim(@nombre_campo)

fetch next from nombres_campos into @nombre_campo
end

CLOSE nombres_campos
DEALLOCATE nombres_campos

set @comando_jp = 'update production_ed_jp..marketing_activity set
'+@comando_jp+' from production_ed_jp..marketing_activity b inner join
#tablainsert a on b.Marketing_Activity_Id =a.Marketing_Activity_Id'
print @comando_jp

set @flag = 0
declare @comando_kr as nvarchar(2000)
set @comando_kr = ''

declare nombres_campos cursor for select name from #campos_mr_kr
open nombres_campos
fetch next from nombres_campos into @nombre_campo

while @@fetch_status = 0
begin
if @flag = 0
begin
set @comando_kr = rtrim(@nombre_campo)+'=a.'+rtrim(@nombre_campo)
set @flag = 1
end
else
set @comando_kr = rtrim(@comando_kr) + ',' +
rtrim(@nombre_campo)+'=a.'+rtrim(@nombre_campo)

fetch next from nombres_campos into @nombre_campo
end

CLOSE nombres_campos
DEALLOCATE nombres_campos

set @comando_kr = 'update production_ed_kr..marketing_activity set
'+@comando_kr+' from production_ed_kr..marketing_activity b inner join
#tablainsert a on b.Marketing_Activity_Id =a.Marketing_Activity_Id'
print @comando_kr

print 'Actualizando en china'
exec sp_executesql @comando_ch
print @@rowcount

print 'Actualizando en japon'
exec sp_executesql @comando_jp
print @@rowcount

print 'Actualizando en korea'
exec sp_executesql @comando_kr
print @@rowcount

"Maxi" wrote in message
news:
mmm, eso no me gusta mucho!! podrias exponer el codigo y la necesidad!!
quizas podamos sacar el sql-dinamico :)


Salu2
Maxi


<a> escribió en el mensaje news:
porque mi instruccion update la tengo que construir dinamicamente en base
a una comparación de campos coincidentes entre 2 tablas

"Maxi" wrote in message
news:
Hola, pues es uno de los sintomas del SQL-Dinamico :(

Mi pregunta es:

Porque usas sp_exceutesql?


Salu2
Maxi


<a> escribió en el mensaje
news:%
Hola amigos, tengo un triger de actualización (Update) con instead of
(utilizo instead of debido a que existen campos text en mi tabla y con
"for update" no me permite), con los datos de la tabla inserted
actualizo en otras 3 bases de datos que tienen la misma tabla y por
último actualizo la tabla que contiene al trigger. Todas estas
actualizaciones las hago con sp_executesql. Las tablas de las otras
bases de datos son actualizadas satisfactoriamente, pero la tabla que
contiene al trigger no actualiza. Le he puesto un print @@rowcount y me
indica que hizo la actualizacion, incluso el mensaje del servidor: "1
fila actualizada". Pero no actualiza nada. Lo mismo me sucede con el
trigger de inserción, Cuando hago el update sin utilizar sp_executesql
si funciona. ¿a que se puede deber?

Gracias por sus respuestas.














Respuesta Responder a este mensaje
#5 Javier Loria
19/11/2004 - 21:00 | Informe spam
Hola:
Con el permiso de Maxi.
Siento mucho no ayudar pero no seria mas "SQL" no hacerlo dinamico, y
construirlo directamente haciendo los UPDATES entre "Mater" y China, Japon y
Korea "estaticos".
Algo tan simple como
=UPDATE Production_Ed..Marketing_Activity
SET Columna1=Columna1,
Columna2=Columna1,
...
FROM Production_Ed..Marketing_Activity
INNER JOIN Inserted
ON Production_Ed..Marketing_Activity-
InsertedMarketing_Activity

= La razon por la que lo comento es porque el codigo como lo tienes es
LENTO, INSEGURO, DIFICIL DE ESCRIBIR Y DIFICIL DE MANTENER.
SQL no es un lenguaje de programacion, como Basic, C, o Java.
Un trigger con SQL Dinamico, Cursores y Tablas Temporales es una
invitacion al desastre.
Solo una opinon,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

<a> wrote in message news:
CREATE TRIGGER marketing_activity_update ON [dbo].[Marketing_Activity]
INSTEAD OF UPDATE
AS

select * into #tablainsert from inserted
update #tablainsert set rn_descriptor=activity_name

declare @codigo as int

select @codigo=id from sysobjects where name='marketing_activity'

select name into #campos_mr from syscolumns where id=@codigo

select @codigo=id from production_ed_ch..sysobjects where
name='marketing_activity'

select name into #campos_ch from production_ed_ch..syscolumns where
id=@codigo

select @codigo=id from production_ed_jp..sysobjects where
name='marketing_activity'

select name into #campos_jp from production_ed_jp..syscolumns where
id=@codigo

select @codigo=id from production_ed_kr..sysobjects where
name='marketing_activity'

select name into #campos_kr from production_ed_kr..syscolumns where
id=@codigo

select a.name into #campos_mr_ch from #campos_mr a inner join #campos_ch b
on a.name = b.name collate Chinese_PRC_BIN

select a.name into #campos_mr_jp from #campos_mr a inner join #campos_jp b
on a.name = b.name collate Japanese_BIN

select a.name into #campos_mr_kr from #campos_mr a inner join #campos_kr b
on a.name = b.name collate Korean_Wansung_BIN

declare @nombre_campo as varchar(200)
declare @flag as bit

set @flag = 0
declare @comando_mr as nvarchar(2000)
set @comando_mr = ''

declare nombres_campos cursor for select name from #campos_mr
open nombres_campos
fetch next from nombres_campos into @nombre_campo

while @@fetch_status = 0
begin
if @flag = 0
begin
set @comando_mr = rtrim(@nombre_campo)+'=a.'+rtrim(@nombre_campo)
set @flag = 1
end
else
set @comando_mr = rtrim(@comando_mr) + ',' +
rtrim(@nombre_campo)+'=a.'+rtrim(@nombre_campo)

fetch next from nombres_campos into @nombre_campo
end

CLOSE nombres_campos
DEALLOCATE nombres_campos

set @comando_mr = 'update production_ed..marketing_activity set
'+@comando_mr+' from production_ed..marketing_activity b inner join
#tablainsert a on b.Marketing_Activity_Id =a.Marketing_Activity_Id'
print @comando_mr

print 'Actualizando en master'
exec sp_executesql @comando_mr
print @@rowcount

set @flag = 0
declare @comando_ch as nvarchar(2000)
set @comando_ch = ''

declare nombres_campos cursor for select name from #campos_mr_ch
open nombres_campos
fetch next from nombres_campos into @nombre_campo

while @@fetch_status = 0
begin
if @flag = 0
begin
set @comando_ch = rtrim(@nombre_campo)+'=a.'+rtrim(@nombre_campo)
set @flag = 1
end
else
set @comando_ch = rtrim(@comando_ch) + ',' +
rtrim(@nombre_campo)+'=a.'+rtrim(@nombre_campo)

fetch next from nombres_campos into @nombre_campo
end

CLOSE nombres_campos
DEALLOCATE nombres_campos

set @comando_ch = 'update production_ed_ch..marketing_activity set
'+@comando_ch+' from production_ed_ch..marketing_activity b inner join
#tablainsert a on b.Marketing_Activity_Id =a.Marketing_Activity_Id'
print @comando_ch

set @flag = 0
declare @comando_jp as nvarchar(2000)
set @comando_jp = ''

declare nombres_campos cursor for select name from #campos_mr_jp
open nombres_campos
fetch next from nombres_campos into @nombre_campo

while @@fetch_status = 0
begin
if @flag = 0
begin
set @comando_jp = rtrim(@nombre_campo)+'=a.'+rtrim(@nombre_campo)
set @flag = 1
end
else
set @comando_jp = rtrim(@comando_jp) + ',' +
rtrim(@nombre_campo)+'=a.'+rtrim(@nombre_campo)

fetch next from nombres_campos into @nombre_campo
end

CLOSE nombres_campos
DEALLOCATE nombres_campos

set @comando_jp = 'update production_ed_jp..marketing_activity set
'+@comando_jp+' from production_ed_jp..marketing_activity b inner join
#tablainsert a on b.Marketing_Activity_Id =a.Marketing_Activity_Id'
print @comando_jp

set @flag = 0
declare @comando_kr as nvarchar(2000)
set @comando_kr = ''

declare nombres_campos cursor for select name from #campos_mr_kr
open nombres_campos
fetch next from nombres_campos into @nombre_campo

while @@fetch_status = 0
begin
if @flag = 0
begin
set @comando_kr = rtrim(@nombre_campo)+'=a.'+rtrim(@nombre_campo)
set @flag = 1
end
else
set @comando_kr = rtrim(@comando_kr) + ',' +
rtrim(@nombre_campo)+'=a.'+rtrim(@nombre_campo)

fetch next from nombres_campos into @nombre_campo
end

CLOSE nombres_campos
DEALLOCATE nombres_campos

set @comando_kr = 'update production_ed_kr..marketing_activity set
'+@comando_kr+' from production_ed_kr..marketing_activity b inner join
#tablainsert a on b.Marketing_Activity_Id =a.Marketing_Activity_Id'
print @comando_kr

print 'Actualizando en china'
exec sp_executesql @comando_ch
print @@rowcount

print 'Actualizando en japon'
exec sp_executesql @comando_jp
print @@rowcount

print 'Actualizando en korea'
exec sp_executesql @comando_kr
print @@rowcount

"Maxi" wrote in message
news:
> mmm, eso no me gusta mucho!! podrias exponer el codigo y la necesidad!!
> quizas podamos sacar el sql-dinamico :)
>
>
> Salu2
> Maxi
>
>
> <a> escribió en el mensaje news:
>> porque mi instruccion update la tengo que construir dinamicamente en


base
>> a una comparación de campos coincidentes entre 2 tablas
>>
>> "Maxi" wrote in message
>> news:
>>> Hola, pues es uno de los sintomas del SQL-Dinamico :(
>>>
>>> Mi pregunta es:
>>>
>>> Porque usas sp_exceutesql?
>>>
>>>
>>> Salu2
>>> Maxi
>>>
>>>
>>> <a> escribió en el mensaje
>>> news:%
>>>> Hola amigos, tengo un triger de actualización (Update) con instead of
>>>> (utilizo instead of debido a que existen campos text en mi tabla y


con
>>>> "for update" no me permite), con los datos de la tabla inserted
>>>> actualizo en otras 3 bases de datos que tienen la misma tabla y por
>>>> último actualizo la tabla que contiene al trigger. Todas estas
>>>> actualizaciones las hago con sp_executesql. Las tablas de las otras
>>>> bases de datos son actualizadas satisfactoriamente, pero la tabla que
>>>> contiene al trigger no actualiza. Le he puesto un print @@rowcount y


me
>>>> indica que hizo la actualizacion, incluso el mensaje del servidor: "1
>>>> fila actualizada". Pero no actualiza nada. Lo mismo me sucede con el
>>>> trigger de inserción, Cuando hago el update sin utilizar


sp_executesql
>>>> si funciona. ¿a que se puede deber?
>>>>
>>>> Gracias por sus respuestas.
>>>>
>>>>
>>>
>>>
>>
>>
>
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida