Devolver id

02/07/2003 - 12:40 por Miguel Tubía | Informe spam
Hola,
al hacer una insercción he de decir con que identificador lo he de meter.
Por lo general suelen ser de tipo int o tinyint y no son autonuméricos pq tb
se pueden meter a mano. Si elijo q se meta automáticamente ahora hago un
select max +1, pero claro, esto no es muy bueno q se diga pq puede
haber id's en medio "en blanco" que se desperdiciarían y lo ideal sería
rellenar estos con las nuevas inserciones.
El procedimiento q quiero hacer recibe un parámetro varchar que es el nombre
de la tabla de la q quiero coger el id necesario. Pero no sé muy bien como
hacerlo. Debería recuperar todos los id's de la tabla y mirar uno a uno si
son correlativos. Si lo son todos, entonces el id será el último + 1, si no,
el primer hueco q encuentre será el q coja. Había pensado hacerlo con
cursores, pero ya me diheron otro día q estos no son muy recomendables, y me
gustaría saber como lo podría hacer de otra forma para luego ya investigar
un poco por mi cuenta.
Muchas gracias por su ayuda
Un saludo
 

Leer las respuestas

#1 Carlos Sacristan
02/07/2003 - 13:49 | Informe spam
Creo que deberías estudiar un poco el ejemplo de Miguel para adaptarlo a
lo que necesitas, porque más o menos es esa la situación que tienes. La idea
es que exista una tabla que contenga el próximo identificador para las
tablas que lo necesiten, y que sea un procedimiento almacenado (o mejor aún,
una función, que la podrías usar en la propia sentencia de inserción) el que
te lo devuelva. Como ves en ese ejemplo, no tienes que realizar ninguna
ejecución dinámica de sentencias (que es lo que te obliga algo tipo SELECT
@Id FROM @Tabla) y así evitas tener que entrar en un asunto un tanto
peliagudo.

En cuanto a que sea diferente el tipo de campo, tampoco deberías darle
mucha importancia (ni la necesidad de usar sql_variant), ya que no creo que
utilices otra cosa que no sea un número o una cadena de caracteres. Como el
segundo engloba al primero, cuando tengas que sumar simplemente le haces una
conversión y listo

De todos modos, siempre que puedas (si la tabla no tiene una clave
natural clara o ésta es muy grande), utiliza claves artificiales (IDENTITY o
GUID's), porque éstas son manejadas directamente por el gestor y te quitarás
muchos quebraderos de cabeza. Aunque supongo que si estás pensando en todo
esto es porque no tienes más remedio...


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

(Guía de netiquette del foro)
http://www.helpdna.net/bosqlfaq00.htm
http://perso.wanadoo.es/rubenvigon/foro

(FAQ's de SQL Server)
http://support.microsoft.com/defaul.../70faq.asp
http://www.helpdna.net/bosqlfaq.htm

"Miguel Tubía" <########> escribió en el mensaje
news:
Hola,
lo primero, gracias por responder. Lo de los bloqueos lo he estado


mirando,
y la verdad es que no los había utilizado hasta ahora, y veo q son


bastante
necesarios... Y el código q me mandast lo sigo mirando. Hay cosas q no
entiendo muy bien pero con los bol y así ya lo sacaré (es q soy nuevo en
esto...)
En realidad lo que yo quiero hacer es un sp "genérico", q sirve para todas
las tablas. Cada tabla tiene su id, pero con distinto nombre: Id_Cliente,
Id_Usuario, etc. Así, pasándole el nombre de la tabla y como se llama la
columna, haría la consulta, aún por definir.
Lo q pasa es q no sé como hacer algo del tipo: select @Id form @Tabla.
Sí, lo sé, es una barbaridad y va a petar por todos lados si, como he


dicho,
Id y Tabla son de tipo varchar... Pero, teniendo el nombre de la tabla,
¿cómo hacer que "referencie" a esa tabla? ¿y sabiendo el nb de la columna?
Creo q así lo he explicado un poco mejor...
Además, el id de cada tabla puede ser distinto, aunq eso he visto q se


puede
arreglar con sql_variant... Sigo en ello
Espero haberme explicado un poco y a ver si se arreglan los problemas q se
me presentan poco a poco. De momento con hacer un simple select a una


tabla
definida por la variable q le paso al sp m comformo...
Gracias por todo y un saludo


Preguntas similares