Porque no funciona?..

21/07/2005 - 18:20 por Gabriel South | Informe spam
Hola, tengo el siguiente insert into que lee desde otra tabla, la cosa es
que si se fijan bien, la penultima liña tiene un (select
isnull(max(r_e_c_n_o_),0)+1 from esp010) para que en un campo vaya
incrementando el valor por cada registro insertado
La cosa es que parece no funcionar cuando en la tabla origen hay mas de 1
registro, porque pone siempre el mismo numero (es mas me da error de
constraint porque la columna R_E_C_N_O_ no puede estar duplicada)

Hay algun metodo para generar ese numero correctamente??... Debo utilizar
un cursor?.. si fuera el cursor la solucion, me dan una mano con la creacion
del mismo ??

Muchisimas gracias por la ayuda,

Gabriel.

-

insert into esp010
(ESP_FILIAL,
ESP_ID,
ESP_STATUS,
ESP_MENSAG,
ESP_ANO,
D_E_L_E_T_,
R_E_C_N_O_)
select ' ',
@IDPROCESS,
isnull(status,''),
isnull(mensagem,''),
isnull(ano,''),
' ',
(select isnull(max(r_e_c_n_o_),0)+1 from esp010) --<Como hago
funcionar esto ???
from #r

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
21/07/2005 - 18:47 | Informe spam
Gabriel,

No funciona porque la sentencia "insert" corre en una transaccion y la
sentencia "select" no ve las filas que se estan insertando. Por que no usas
una columna identity?


AMB



"Gabriel South" wrote:

Hola, tengo el siguiente insert into que lee desde otra tabla, la cosa es
que si se fijan bien, la penultima liña tiene un (select
isnull(max(r_e_c_n_o_),0)+1 from esp010) para que en un campo vaya
incrementando el valor por cada registro insertado
La cosa es que parece no funcionar cuando en la tabla origen hay mas de 1
registro, porque pone siempre el mismo numero (es mas me da error de
constraint porque la columna R_E_C_N_O_ no puede estar duplicada)

Hay algun metodo para generar ese numero correctamente??... Debo utilizar
un cursor?.. si fuera el cursor la solucion, me dan una mano con la creacion
del mismo ??

Muchisimas gracias por la ayuda,

Gabriel.

-

insert into esp010
(ESP_FILIAL,
ESP_ID,
ESP_STATUS,
ESP_MENSAG,
ESP_ANO,
D_E_L_E_T_,
R_E_C_N_O_)
select ' ',
@IDPROCESS,
isnull(status,''),
isnull(mensagem,''),
isnull(ano,''),
' ',
(select isnull(max(r_e_c_n_o_),0)+1 from esp010) --<Como hago
funcionar esto ???
from #r



Respuesta Responder a este mensaje
#2 Pantxo
21/07/2005 - 18:51 | Informe spam
Hola Gabriel,
la instrucción 'select isnull(max(r_e_c_n_o_),0)+1 from esp010' te va a
devolver siempre el mismo valor porque las instrucciones sql se ejecutan
como una transacción. Es decir la insert o se ejecuta entera o no se
ejecuta, si la instrucción falla al insertar la cuarta línea no inserta
ninguna. Por esa razón los datos de las anteriores líneas insertadas no van
a estar disponibles hasta que no concluya la instrucción. Es la razón por la
que te da el error.

Para solucionar el problema podrías activar la propiedad identity para el
campo r_e_c_n_o_

Otra posibilidad es la de usar cursores:

declare @status varchar
declare @mensagem varchar
declare @ano varchar
declare @recno int
select @recno=isnull(max(r_e_c_n_o_),0)+1 from esp010
declare cursor1 cursor for select isnull(status,''), isnull(mensagem,''),
isnull(ano,'') from #r
open cursor1
fetch next from cursor1 into @status, @mensagem, @ano
while @@fetch_status=0
begin
insert into esp010 (ESP_FILIAL, ESP_ID, ESP_STATUS, ESP_MENSAG, ESP_ANO,
D_E_L_E_T_, R_E_C_N_O_)
values (' ', @IDPROCESS, @status, @mensagem, @ano, ' ', @recno)
set @recno=@recno+1

fetch next from cursor1 into @status, @mensagem, @ano
end
close cursor1
deallocate cursor1

No lo he probado, lo he escrito directamente en el mensaje, así que es
posible que tenga algún error. Es posible que tengas que cambiar también
algún tipo de datos para adecuarlo a las definiciones de tus tablas.

Un saludo

Pantxo


"Gabriel South" escribió en el mensaje
news:Om4ku$
Hola, tengo el siguiente insert into que lee desde otra tabla, la cosa es
que si se fijan bien, la penultima liña tiene un (select
isnull(max(r_e_c_n_o_),0)+1 from esp010) para que en un campo vaya
incrementando el valor por cada registro insertado
La cosa es que parece no funcionar cuando en la tabla origen hay mas de 1
registro, porque pone siempre el mismo numero (es mas me da error de
constraint porque la columna R_E_C_N_O_ no puede estar duplicada)

Hay algun metodo para generar ese numero correctamente??... Debo utilizar
un cursor?.. si fuera el cursor la solucion, me dan una mano con la


creacion
del mismo ??

Muchisimas gracias por la ayuda,

Gabriel.

-

insert into esp010
(ESP_FILIAL,
ESP_ID,
ESP_STATUS,
ESP_MENSAG,
ESP_ANO,
D_E_L_E_T_,
R_E_C_N_O_)
select ' ',
@IDPROCESS,
isnull(status,''),
isnull(mensagem,''),
isnull(ano,''),
' ',
(select isnull(max(r_e_c_n_o_),0)+1 from esp010) --<Como hago
funcionar esto ???
from #r


Respuesta Responder a este mensaje
#3 Eleazar
21/07/2005 - 18:59 | Informe spam
Hola lo que entiendo en tu post esque haces un insert-select y quieres un
campo especial para numerar los registros (id), sql primero resuelve el
select y luego el insert por eso no te funciona, si mas no recuerdo ya han
posteado algo parecido.

"Gabriel South" escribió en el mensaje
news:Om4ku$
Hola, tengo el siguiente insert into que lee desde otra tabla, la cosa es
que si se fijan bien, la penultima liña tiene un (select
isnull(max(r_e_c_n_o_),0)+1 from esp010) para que en un campo vaya
incrementando el valor por cada registro insertado
La cosa es que parece no funcionar cuando en la tabla origen hay mas de 1
registro, porque pone siempre el mismo numero (es mas me da error de
constraint porque la columna R_E_C_N_O_ no puede estar duplicada)

Hay algun metodo para generar ese numero correctamente??... Debo utilizar
un cursor?.. si fuera el cursor la solucion, me dan una mano con la


creacion
del mismo ??

Muchisimas gracias por la ayuda,

Gabriel.

-

insert into esp010
(ESP_FILIAL,
ESP_ID,
ESP_STATUS,
ESP_MENSAG,
ESP_ANO,
D_E_L_E_T_,
R_E_C_N_O_)
select ' ',
@IDPROCESS,
isnull(status,''),
isnull(mensagem,''),
isnull(ano,''),
' ',
(select isnull(max(r_e_c_n_o_),0)+1 from esp010) --<Como hago
funcionar esto ???
from #r


Respuesta Responder a este mensaje
#4 Gabriel South
22/07/2005 - 18:16 | Informe spam
Efectivamente tuve que hacer un cursor porque no puedo tener una columna
identity (no puedo alterar las bases)

Muchisimas gracias por la ayuda

Gabriel.



Quedo algo asi:

DECLARE CURSOR_R INSENSITIVE CURSOR FOR
SELECT
status,mensagem,ano,numero,negocio,atividade,cd_emp,cd_est,Cliente,
NomeFantasia,Container,TipoDocumentoEntrada,DocumentoEntrada,Embarcacao,

Viagem,LocalOrigemDestino,TipodocumentoSaida,DocumentoSaida,InvoiceFaturaCli
ente,
ReferenciaCliente,RecintoAlfandegado,OrdemColeta,NotaFiscalClienteTipo,

NotaFiscalClienteSerie,NotaFiscalClienteNumero,SolicitacaoVazio,ReservaConso
lidador,
ReservaArmador,LocalAtracacao
FROM GerTemp

OPEN CURSOR_R
SELECT @CANTIDAD = @@CURSOR_ROWS

FETCH NEXT FROM CURSOR_R INTO

@status,@mensagem,@ano,@numero,@negocio,@atividade,@cd_emp,@cd_est,@Cliente,

@NomeFantasia,@Container,@TipoDocumentoEntrada,@DocumentoEntrada,@Embarcacao
,

@Viagem,@LocalOrigemDestino,@TipodocumentoSaida,@DocumentoSaida,@InvoiceFatu
raCliente,
@ReferenciaCliente,@RecintoAlfandegado,@OrdemColeta,@NotaFiscalClienteTipo,

@NotaFiscalClienteSerie,@NotaFiscalClienteNumero,@SolicitacaoVazio,@ReservaC
onsolidador,
@ReservaArmador,@LocalAtracacao

WHILE (@@FETCH_STATUS <> -1) BEGIN
Select @Recno=(select isnull(max(r_e_c_n_o_),0)+1 from esp010)

Insert into ESP010

(ESP_FILIAL,ESP_ID,ESP_STATUS,ESP_MENSAG,ESP_ANO,ESP_NUMERO,ESP_NEGOCI,ESP_A
TIVID,
ESP_CDEMP,ESP_CDEST,ESP_CLIENT,ESP_NOMFAN,ESP_CONATI,ESP_TIDOCE,ESP_DOCENT,

ESP_EMBARC,ESP_VIAGEM,ESP_LORIDE,ESP_TDOCSA,ESP_DOCSAI,ESP_INVFCL,ESP_REFCLI
,

ESP_RECALF,ESP_ORDCOL,ESP_NFCTIP,ESP_NFCSER,ESP_NFCNUM,ESP_SOLVAZ,ESP_RESCON
,
ESP_RESARM,ESP_LOCATR,D_E_L_E_T_,R_E_C_N_O_)
VALUES
(' ',@IDPROCESS,

Isnull(@status,''),Isnull(@mensagem,''),Isnull(@ano,''),Isnull(@numero,''),I
snull(@negocio,''),Isnull(@atividade,''),Isnull(@cd_emp,''),Isnull(@cd_est,'
'),Isnull(@Cliente,''),

Isnull(@NomeFantasia,''),Isnull(@Container,''),Isnull(@TipoDocumentoEntrada,
''),Isnull(@DocumentoEntrada,''),Isnull(@Embarcacao,''),

Isnull(@Viagem,''),Isnull(@LocalOrigemDestino,''),Isnull(@TipodocumentoSaida
,''),Isnull(@DocumentoSaida,''),Isnull(@InvoiceFaturaCliente,''),

Isnull(@ReferenciaCliente,''),Isnull(@RecintoAlfandegado,''),Isnull(@OrdemCo
leta,''),Isnull(@NotaFiscalClienteTipo,''),

Isnull(@NotaFiscalClienteSerie,''),Isnull(@NotaFiscalClienteNumero,''),Isnul
l(@SolicitacaoVazio,''),Isnull(@ReservaConsolidador,''),
Isnull(@ReservaArmador,''),Isnull(@LocalAtracacao,''),' ',@recno)

FETCH NEXT FROM CURSOR_R INTO

@status,@mensagem,@ano,@numero,@negocio,@atividade,@cd_emp,@cd_est,@Cliente,

@NomeFantasia,@Container,@TipoDocumentoEntrada,@DocumentoEntrada,@Embarcacao
,

@Viagem,@LocalOrigemDestino,@TipodocumentoSaida,@DocumentoSaida,@InvoiceFatu
raCliente,
@ReferenciaCliente,@RecintoAlfandegado,@OrdemColeta,@NotaFiscalClienteTipo,

@NotaFiscalClienteSerie,@NotaFiscalClienteNumero,@SolicitacaoVazio,@ReservaC
onsolidador,
@ReservaArmador,@LocalAtracacao
END
Respuesta Responder a este mensaje
#5 Maxi
22/07/2005 - 20:07 | Informe spam
Hola, fijate si este ejemplo te es util:

use northwind
Go

select *,
(select count(*) from customers) + (select count(*) from customers cu2 where
cu2.customerid <= customers.customerid) as
nuevoid
from customers


Un abrazo

Salu2
Maxi


"Gabriel South" escribió en el mensaje
news:
Efectivamente tuve que hacer un cursor porque no puedo tener una columna
identity (no puedo alterar las bases)

Muchisimas gracias por la ayuda

Gabriel.



Quedo algo asi:

DECLARE CURSOR_R INSENSITIVE CURSOR FOR
SELECT
status,mensagem,ano,numero,negocio,atividade,cd_emp,cd_est,Cliente,
NomeFantasia,Container,TipoDocumentoEntrada,DocumentoEntrada,Embarcacao,

Viagem,LocalOrigemDestino,TipodocumentoSaida,DocumentoSaida,InvoiceFaturaCli
ente,
ReferenciaCliente,RecintoAlfandegado,OrdemColeta,NotaFiscalClienteTipo,

NotaFiscalClienteSerie,NotaFiscalClienteNumero,SolicitacaoVazio,ReservaConso
lidador,
ReservaArmador,LocalAtracacao
FROM GerTemp

OPEN CURSOR_R
SELECT @CANTIDAD = @@CURSOR_ROWS

FETCH NEXT FROM CURSOR_R INTO

@status,@mensagem,@ano,@numero,@negocio,@atividade,@cd_emp,@cd_est,@Cliente,

@NomeFantasia,@Container,@TipoDocumentoEntrada,@DocumentoEntrada,@Embarcacao
,

@Viagem,@LocalOrigemDestino,@TipodocumentoSaida,@DocumentoSaida,@InvoiceFatu
raCliente,
@ReferenciaCliente,@RecintoAlfandegado,@OrdemColeta,@NotaFiscalClienteTipo,

@NotaFiscalClienteSerie,@NotaFiscalClienteNumero,@SolicitacaoVazio,@ReservaC
onsolidador,
@ReservaArmador,@LocalAtracacao

WHILE (@@FETCH_STATUS <> -1) BEGIN
Select @Recno=(select isnull(max(r_e_c_n_o_),0)+1 from esp010)

Insert into ESP010

(ESP_FILIAL,ESP_ID,ESP_STATUS,ESP_MENSAG,ESP_ANO,ESP_NUMERO,ESP_NEGOCI,ESP_A
TIVID,
ESP_CDEMP,ESP_CDEST,ESP_CLIENT,ESP_NOMFAN,ESP_CONATI,ESP_TIDOCE,ESP_DOCENT,

ESP_EMBARC,ESP_VIAGEM,ESP_LORIDE,ESP_TDOCSA,ESP_DOCSAI,ESP_INVFCL,ESP_REFCLI
,

ESP_RECALF,ESP_ORDCOL,ESP_NFCTIP,ESP_NFCSER,ESP_NFCNUM,ESP_SOLVAZ,ESP_RESCON
,
ESP_RESARM,ESP_LOCATR,D_E_L_E_T_,R_E_C_N_O_)
VALUES
(' ',@IDPROCESS,

Isnull(@status,''),Isnull(@mensagem,''),Isnull(@ano,''),Isnull(@numero,''),I
snull(@negocio,''),Isnull(@atividade,''),Isnull(@cd_emp,''),Isnull(@cd_est,'
'),Isnull(@Cliente,''),

Isnull(@NomeFantasia,''),Isnull(@Container,''),Isnull(@TipoDocumentoEntrada,
''),Isnull(@DocumentoEntrada,''),Isnull(@Embarcacao,''),

Isnull(@Viagem,''),Isnull(@LocalOrigemDestino,''),Isnull(@TipodocumentoSaida
,''),Isnull(@DocumentoSaida,''),Isnull(@InvoiceFaturaCliente,''),

Isnull(@ReferenciaCliente,''),Isnull(@RecintoAlfandegado,''),Isnull(@OrdemCo
leta,''),Isnull(@NotaFiscalClienteTipo,''),

Isnull(@NotaFiscalClienteSerie,''),Isnull(@NotaFiscalClienteNumero,''),Isnul
l(@SolicitacaoVazio,''),Isnull(@ReservaConsolidador,''),
Isnull(@ReservaArmador,''),Isnull(@LocalAtracacao,''),' ',@recno)

FETCH NEXT FROM CURSOR_R INTO

@status,@mensagem,@ano,@numero,@negocio,@atividade,@cd_emp,@cd_est,@Cliente,

@NomeFantasia,@Container,@TipoDocumentoEntrada,@DocumentoEntrada,@Embarcacao
,

@Viagem,@LocalOrigemDestino,@TipodocumentoSaida,@DocumentoSaida,@InvoiceFatu
raCliente,
@ReferenciaCliente,@RecintoAlfandegado,@OrdemColeta,@NotaFiscalClienteTipo,

@NotaFiscalClienteSerie,@NotaFiscalClienteNumero,@SolicitacaoVazio,@ReservaC
onsolidador,
@ReservaArmador,@LocalAtracacao
END


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