Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Consulta en orden en el que se insertaron (https://www.clubdelphi.com/foros/showthread.php?t=81810)

Pedrote 20-12-2012 08:28:45

Consulta en orden en el que se insertaron
 
Buenas,
¿como podría obtener en MSSQL las filas de unas consulta ordenadas por el orden que se insertaron a la tabla, sin usar tablas temporales ni añadir nuevos campos a la tabla?.

Gracias!!

Neftali [Germán.Estévez] 20-12-2012 09:30:49

Para asegurarte lo más sencillo sería tener un campo TimeStamp que se rellenara de forma automática a la hora de insertar registros.
El problema es que en los SGBD's no se si tienes esa posibilidad.

Pedrote 20-12-2012 10:02:26

No puedo alterar la estructura de la tabla, ese es el problema.

Neftali [Germán.Estévez] 20-12-2012 10:24:18

Pues no se si vas a poder obtenerlos.
Tal vez dependerá de cómo esté definida. PK, índices,...

Pedrote 20-12-2012 10:46:38

Por PK esta complicado porque es un campo char, si fuera un autoincrement la cosa estaría más fácil. ¿A nivel interno de MS SQL existe algo?. Yo es que desconozco bastante este SGBD. El problema es que no puedo alterar la estructura de la tabla a ser ajena a mi aplicación y su respectiva licencia, etc.

AzidRain 20-12-2012 22:34:29

No es posible, puede haber índices o claves PK definidas pero ninguno te garantiza que veas la tabla en el orden preciso en que fueron insertados los registros a menos que exista un campo timestamp. Por lo regular es una buena práctica incluir un campo de este tipo precisamente para casos como el que indicas pero no todos lo realizan. Mencionas algo de licencias, la licencia no cubre ni puede cubrir el uso que tu le quieras dar a las tablas por lo que podrías añadir lo que necesites sin violar nada. Otra cosa que puedes hacer es crear un trigger que cada vez que se inserte un registro en la tabla que te interesa, registre el dato en otra tabla, de esta forma no modificas la estructura de la tabla con "licencia", pero obviamente eso solo te funcionará para los nuevos registros.

Por otro lado verifica la estructura de la tabla, muchos desarrolladores meten campos clave que sirven precisamente para poder saber el orden de inserción, igual y si la pones aquí te podemos ayudar.

olbeup 21-12-2012 09:05:00

Hola Pedrote,

Yo utilizo SQL SERVER y si hay un campo definido como IDENTITY, ya lo tienes resuelto, sino es así, algún otro campo como IDCLIENTE, IDARTICULO, IDPEDIDO, etc...

Un saludo.

AzidRain 22-12-2012 18:57:24

oldbeup, esos campos no le sirven a nuestro amigo pues no indican el orden temporal en que se añaden los registros, es decir, solo indican la secuencia que siguen pero nada impide que primero añadas las claves en diferente momento, por ejemplo digamos que el campo IDCLIENTE sea la clave principal (e incluso puede ser autoincrementada).

Código SQL [-]
INSERT INTO CLIENTES SET IDCLIENTE=3;
       INSERT INTO CLIENTES SET IDCLIENTE=2;
       INSERT INTO CLIENTES SET IDCLIENTE=1;
Son sentencias totalmente válidas y no viola los índices, por lo que hal hacer un
Código SQL [-]
  SELECT * FROM CLIENTES;

Obtenemos:
Código SQL [-]
----IDCLIENTE----
       1
       2
       3
-----------------

Lo cual es correcto de acuerdo con la clave de la clave primaria, pero no es el orden en que fueron insertados los registros. Otra solución es no usar una clave primaria y utilizar índices de esta forma teóricamente al ejecutar la misma sentencia "select * from" obtendriamos tal y como fueron insertados, pero de nuevo, no hay garantía de que sea real

olbeup 23-12-2012 03:12:50

Cita:

Empezado por AzidRain (Mensaje 452346)
oldbeup, esos campos no le sirven a nuestro amigo pues no indican el orden temporal en que se añaden los registros, es decir, solo indican la secuencia que siguen pero nada impide que primero añadas las claves en diferente momento, por ejemplo digamos que el campo IDCLIENTE sea la clave principal (e incluso puede ser autoincrementada).

Código SQL [-]
INSERT INTO CLIENTES SET IDCLIENTE=3;
       INSERT INTO CLIENTES SET IDCLIENTE=2;
       INSERT INTO CLIENTES SET IDCLIENTE=1;
Son sentencias totalmente válidas y no viola los índices, por lo que hal hacer un
Código SQL [-]
  SELECT * FROM CLIENTES;

Obtenemos:
Código SQL [-]
----IDCLIENTE----
       1
       2
       3
-----------------

Lo cual es correcto de acuerdo con la clave de la clave primaria, pero no es el orden en que fueron insertados los registros. Otra solución es no usar una clave primaria y utilizar índices de esta forma teóricamente al ejecutar la misma sentencia "select * from" obtendriamos tal y como fueron insertados, pero de nuevo, no hay garantía de que sea real

Hola AzidRain,

Perdona que discrepe, pero si tiene un campo definido como IDENTITY que es autoincremental, ya tienes el orden de como se metieron, porque tú no puedes manipular un IDENTITY a menos que lo desactives.

Un saludo.

AzidRain 25-12-2012 18:21:06

Cita:

Perdona que discrepe, pero si tiene un campo definido como IDENTITY que es autoincremental, ya tienes el orden de como se metieron, porque tú no puedes manipular un IDENTITY a menos que lo desactives.
Y si no lo tiene definido? como parece es el caso...

Pedrote 26-12-2012 15:12:24

No esta definido como bien dice AzidRain, además el problema es que esta base de datos se encuentra en producción y la alternativa a alterar la estructura de la tabla, añadir una nueva tabla o trigger no me valdría con los registros actuales.

mightydragonlor 26-12-2012 17:36:15

Cita:

Empezado por Pedrote (Mensaje 452460)
No esta definido como bien dice AzidRain, además el problema es que esta base de datos se encuentra en producción y la alternativa a alterar la estructura de la tabla, añadir una nueva tabla o trigger no me valdría con los registros actuales.

Lo que requieres no es posible si no cuentas ya con un campo de fecha y hora de inserción, lo de modificar la tabla yo me lo pensaría, por que todo, absolutamente todo es suceptible de mejorar y o modificar, yo de ti le adiciono un campo de tipo DateTime con valor predefinido GETDATE() y que sea Nullable y luego poner los valores existentes de nullos a un fecha y hora específica, si bien el cambio no aplicaría para los registros viejos que no saldrían en el orden que se insertaron, para los nuevos funcionaría perfectamente.


La franja horaria es GMT +2. Ahora son las 17:54:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi