Generar mi autonumerico

21/05/2008 - 22:02 por CHAR72 | Informe spam
Hola compañeros! tengo cierto inconveniente que no puedo resolver. Tengo un
sistema que tiene un id que lo detemina de una tabla donde guarda el ultimo
id y le va sumando uno por cada nuevo registro. Cuando es un insert de un
registro no hay inconveniente, pero ahora debo realizar varios insert y no
se como obtener ese numero, intente crear una funcion que lo obtenga pero
solo permite otras funciones o procedimientos extendidos.

Como puedo resolver la cuestion con SQL 2000?

Saludos

Carlos

Preguntas similare

Leer las respuestas

#31 Alfredo Novoa
23/05/2008 - 22:35 | Informe spam
Hola Carlos,

El Fri, 23 May 2008 13:20:35 -0700 (PDT), Carlos M. Calvelo escribió:

On 23 mei, 22:06, Gux (MVP) wrote:
El resultado final de la ejecución de dos transacciones concurrentes debe ser
similar a la ejecución SERIAL (en serie o secuencia) de las mismas.




Pues eso es lo que significa que las transacciones sean
'serializables'.



Hombre, supongo que lo que quieren decir es que si sabes que no se van a
producir lecturas no repetibles ni lecturas fantasma pues que en ese caso
llega con hacer una transacción con nivel READ COMMITTED.

Lo que no tengo muy claro es que se gana realmente con eso ni como estar
seguro de que no van a ocurrir esas anomalías.


Saludos
Alfredo
Respuesta Responder a este mensaje
#32 Alfredo Novoa
23/05/2008 - 22:43 | Informe spam
Hola Gux,

El Fri, 23 May 2008 13:13:01 -0700, Gux (MVP) escribió:

?usaremos entonces mysql que tiene diseño de los 90s?
pq sqlserver tiene diseño de los 80s, oracle y db2 de los 70s...



En general la elección del producto no se basa en la época en que está
basado su diseño,



Eso es cierto solo en parte. Uno puede diseñar un producto en el siglo XXI
usando tecnologías que llevan décadas obsoletas, y desgraciadamente muchos
lo hacen :-(

Pero si ocurren grandes avances técnológicos entonces el saber que la fecha
de diseño del producto es anterior a esos avances es un indicador bastante
bueno de que no los usan :-)

Por ejemplo si te ofrecen un televisor diseñado en los años 40 es bastante
difícil que tenga 1080p y decodificador de TDT :-)


Saludos
Alfredo
Respuesta Responder a este mensaje
#33 Miguel Egea
23/05/2008 - 23:17 | Informe spam
pero es que no es comparable, los televisores de los años 40 no han tenido
revisiones, como si el software, no se cuantas lineas del primitivo sybase
quedan en sqlserver 2008, en 2005 hay xml puro, los conceptos son de los 70
o de los 50, ¿volar no se inspira en da vinci? Creo que estamos
frivolizando el tema y desde luego todos aquí tocamos de oido, porque
realmente no sabemos lo que hay debajo, apostaría 1 quilmes si fuese
argentino o 1 estrella de levante porque soy murciano a que todos llevamos
parte de razón y todos estamos muy equivocados ... En cualquier caso yo
juzgo las bases de datos por como se comportan y SQL Server para mí se ha
comportado de forma excelente en los escenarios en los que lo he usado, y
algunos han sido realmente exigentes..

Saludos



"Alfredo Novoa" wrote in message
news:nbhvjb1ydvlv$

Hola Gux,

El Fri, 23 May 2008 13:13:01 -0700, Gux (MVP) escribió:

?usaremos entonces mysql que tiene diseño de los 90s?
pq sqlserver tiene diseño de los 80s, oracle y db2 de los 70s...



En general la elección del producto no se basa en la época en que está
basado su diseño,



Eso es cierto solo en parte. Uno puede diseñar un producto en el siglo XXI
usando tecnologías que llevan décadas obsoletas, y desgraciadamente muchos
lo hacen :-(

Pero si ocurren grandes avances técnológicos entonces el saber que la
fecha
de diseño del producto es anterior a esos avances es un indicador bastante
bueno de que no los usan :-)

Por ejemplo si te ofrecen un televisor diseñado en los años 40 es bastante
difícil que tenga 1080p y decodificador de TDT :-)


Saludos
Alfredo
Respuesta Responder a este mensaje
#34 Alfredo Novoa
23/05/2008 - 23:43 | Informe spam
El Fri, 23 May 2008 23:17:07 +0200, Miguel Egea escribió:

pero es que no es comparable, los televisores de los años 40 no han tenido
revisiones, como si el software, no se cuantas lineas del primitivo sybase
quedan en sqlserver 2008,



Estoy hablando del diseño y no del código. Y todavía quedan montones y
montones de decisiones de diseño del primitivo SyBase (y del System R
también) en SQL Server 2008.

en 2005 hay xml puro,



Cosa que no es más que un pequeño añadido que no cambia la arquitectura de
forma sustacial.

Creo que estamos
frivolizando el tema y desde luego todos aquí tocamos de oido, porque
realmente no sabemos lo que hay debajo



Podemos saber muchas cosas sobre lo que hay debajo y hay un montón de
detalles sobre la arquitectura que son públicos.

http://www.amazon.com/Inside-Micros...0735621055
http://www.amazon.com/Inside-Micros...f_f_t_cs_3

parte de razón y todos estamos muy equivocados ... En cualquier caso yo
juzgo las bases de datos por como se comportan y SQL Server para mí se ha
comportado de forma excelente en los escenarios en los que lo he usado, y
algunos han sido realmente exigentes..



Por que tampoco hay muchas alternativas en el mercado. Pero cualquiera que
esté al tanto de la investigación sobre sistemas de bases de datos sabe que
SQL Server está muy lejos de ser todo lo óptimo que es posible con los
conocimientos actuales.


Saludos
Alfredo
Respuesta Responder a este mensaje
#35 Alejandro Mesa
24/05/2008 - 00:46 | Informe spam
Hola Miguel,

Que gusto tenerte por aca.

El problema que afronta el OP, es que no se puede usar esa funcionalidad
cuando se inserta un batch o conjunto de filas, pues no podemos ejecutar el
procedimiento almacenado por cada fila que se inserta, si no es que se usa un
lazo o procesamiento de las filas de una en una.

Posiblemente se pueda crear un funcion de usuario y usar una de las puertas
de atras existentes (no recomendable) para poder traer ese numero. Para eso,
pudieramos crear un servidor ligado que apunte a si mismo y usar OPENQUERY
para hacer la insercion en la tabla y traer el valor identiy o posterior si
no es identity.


Ejemplo:

use master
go

/****** Object: LinkedServer [LOOPBACK] Script Date: 05/23/2008 18:42:29
******/
EXEC master.dbo.sp_addlinkedserver @server = N'LOOPBACK', @srvproduct=N'SQL
Server'
/* For security reasons the linked server remote logins password is changed
with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname=N'LOOPBACK',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL

GO
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'collation
compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'data
access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'dist',
@optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'pub',
@optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'rpc',
@optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'rpc out',
@optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'sub',
@optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'connect
timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'collation
name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'lazy schema
validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'query
timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'LOOPBACK', @optname=N'use remote
collation', @optvalue=N'true'
go

use tempdb
go

create table dbo.Claves (
Clave int not null identity(1, 1) primary key
)
go

create function dbo.ufn_ProximaClave(
@p1 varchar(50)
)
returns int
as
begin
declare @i int

select @i = Clave
from openquery(LOOPBACK, 'begin transaction insert into tempdb.dbo.Claves
output inserted.Clave default values; rollback transaction')

return @i
end
go

create table dbo.t1 (
c1 int not null primary key,
c2 varchar(50) not null unique
)
go

insert into dbo.t1(c1, c2)
select dbo.ufn_ProximaClave(t.c1), t.c1
from
(
select 'SQL Server 2000' as c1
union all
select 'SQL Server 2005' as c1
union all
select 'SQL Server 2008' as c1
) as t
go

select *
from dbo.t1
go

drop function dbo.ufn_ProximaClave
go

drop table dbo.Claves, dbo.t1
go


Saludos,
AMB


"Miguel Egea" wrote:

Si usas SQL 2005 puedes hacer un procedimiento como el siguiente y llamarlo
para obtener un identificador con tabla, tiene todos los inconvenientes y
ventas de los identities, no te obliga acambiar la estructura aunque ocupas
un schema. Si no usas SQL 2005 es adaptable. Creo que no tiene problemas de
inyeccin de cdigo SQL en cualquier caso ah tenis las pruebas.


create schema Maestros;

go
create proc Maestros.GeneraClave (@tabla Sysname,@valor int output)
with execute as owner -- cambialo por alguien con permisos para crear tablas
de forma dinmica
as
begin
declare @sql nvarchar(4000);



if not exists(select 1 from information_Schema.tables where table_name =
@tabla and Table_schema='Maestros')
begin

set @sql = 'CREATE TABLE Maestros.'+ quotename(@tabla) + ' (id int
identity(1,1)) ' ;
exec sp_executeSQL @sql
end

if @@trancount>0
save transaction @tabla
else
begin tran

set @sql=N'SET NOCOUNT ON; INSERT INTO Maestros.'+ quotename(@tabla) + '
DEFAULT VALUES; SELECT @Valor=Scope_identity() '
exec sp_executesql @sql, N' @valor int output', @valor output

rollback tran

end
go

declare @valor int
exec Maestros.GeneraClave 'Mi tabla1',@valor output
select @valor
select * from information_schema.tables where table_schema='Maestros'
go
declare @valor int
exec Maestros.GeneraClave 'Mi ] drop table Maestros.[Mi tabla1] -- ',@valor
output
select @valor
select * from information_schema.tables where table_schema='Maestros'


Saludos
Miguel Egea



"CHAR72" <char72[nos pa m]@gmail.com> wrote in message
news:OB%
> Lamentablemente las cosas estan asi, habria que cambiar toda la estructura
> del sistema para ponerle IDENTITY.
>
> Gracias
>
> "Alejandro Mesa" escribi en el
> mensaje news:
>> CHAR72,
>>
>> Esa es una de las desventajas de generar el autonumerico de manera
>> propia,
>> y no usar la facilidad de las columnas con propiedad IDENTITY. Tendras
>> que
>> usar un lazo / cursor e insertar las filas una por una.
>>
>>
>> AMB
>>
>> "CHAR72" wrote:
>>
>>> Hola compaeros! tengo cierto inconveniente que no puedo resolver. Tengo
>>> un
>>> sistema que tiene un id que lo detemina de una tabla donde guarda el
>>> ultimo
>>> id y le va sumando uno por cada nuevo registro. Cuando es un insert de
>>> un
>>> registro no hay inconveniente, pero ahora debo realizar varios insert y
>>> no
>>> se como obtener ese numero, intente crear una funcion que lo obtenga
>>> pero
>>> solo permite otras funciones o procedimientos extendidos.
>>>
>>> Como puedo resolver la cuestion con SQL 2000?
>>>
>>> Saludos
>>>
>>> Carlos
>>>
>>>
>>>
>>>
>
>

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