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
Post by Miguel EgeaSi 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
with execute as owner -- cambialo por alguien con permisos para crear tablas
de forma dinmica
as
begin
if not exists(select 1 from information_Schema.tables where table_name =
@tabla and Table_schema='Maestros')
begin
identity(1,1)) ' ;
end
else
begin tran
rollback tran
end
go
select * from information_schema.tables where table_schema='Maestros'
go
-- sin problemas de inyeccin de cdigo.
output
select * from information_schema.tables where table_schema='Maestros'
Saludos
Miguel Egea
Post by CHAR72Lamentablemente las cosas estan asi, habria que cambiar toda la estructura
del sistema para ponerle IDENTITY.
Gracias
Post by Alejandro MesaCHAR72,
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
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