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

#6 Maxi
19/11/2004 - 21:07 | Informe spam
Me ganaste :) pero opino 100% igual a vos!! es mas no se como funciona eso y
ni me quiero imaginar ese Servidor como esta :(


Salu2
Maxi


"Javier Loria" escribió en el mensaje
news:e0Ok%
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
#7 Anonimo
19/11/2004 - 21:29 | Informe spam
Lo que pasa es que los campos de las tablas van a ir aumentando y eso no
está en mis manos, y el stored procedure igual debe seguir funcionando
transparentemente, además de ello 2 tablas no siempren tendran los mismos
campos

"Javier Loria" wrote in message
news:e0Ok%
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
#8 Maxi
19/11/2004 - 21:35 | Informe spam
ahh eso si que es un problema de diseño!! como que los campos iran
aumentando?


Salu2
Maxi


<a> escribió en el mensaje news:
Lo que pasa es que los campos de las tablas van a ir aumentando y eso no
está en mis manos, y el stored procedure igual debe seguir funcionando
transparentemente, además de ello 2 tablas no siempren tendran los mismos
campos

"Javier Loria" wrote in message
news:e0Ok%
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
#9 Anonimo
19/11/2004 - 21:38 | Informe spam
Es una historia larga, pero lo que te puedo decir es que hay programadores
que se encargan de aumentar cosas a su sistemas y añaden campos.

"Maxi" wrote in message
news:%
ahh eso si que es un problema de diseño!! como que los campos iran
aumentando?


Salu2
Maxi


<a> escribió en el mensaje news:
Lo que pasa es que los campos de las tablas van a ir aumentando y eso no
está en mis manos, y el stored procedure igual debe seguir funcionando
transparentemente, además de ello 2 tablas no siempren tendran los mismos
campos

"Javier Loria" wrote in message
news:e0Ok%
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
#10 Miguel Egea
23/11/2004 - 00:05 | Informe spam
Un ejemplo sencillo de lo que te pasa lo puedes reproducir así

use tempdb
go

go

create table t (id int)
create table t2 (id int)
go
create trigger tr_t on t instead of insert
as
begin
declare @cuantos int

Select @cuantos=sum(id) from inserted
exec sp_executesql N'insert into t values (@t) insert into t2 values(@t)
',N'@t int',@cuantos
end
go
begin tran
insert into t values (2)
select * from t
select * from t2
commit


El problema es que la ejecución dinámica vuelve a disparar el trigger
instead of, creo que es así by design, es decir que como no es un trigger de
'antes' sino de 'en lugar' si se dispara y no se hace la acción de la
insercción en el mismo contexto no funciona. Tampoco te servirá usar
getToken y bindtoken, porque la transacción si es la misma, pero no el
contexto de ejecución.

Yo usaría un truquillo, crea una vista que se llame como tu tabla, resultará
practicamente transparente a los usuarios, sobre esa vista pon el trigger
instead of, pero haz que tu ejecución dinámica actue sobre la tabla.

Suerte.


-
Miguel Egea Gómez
Microsoft SQL-Server MVP
Webmaster de PortalSql.Com
¿Te interesa participar en las reuniones
del grupo de Usuarios de SQL-Server y .NET
Se harán en levante de España, (Alicante o Murcia)?

<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.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida