Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Orden especifico

Estas en el tema de Orden especifico en el foro de SQL Server en Foros del Web. Veamos tengo dos tablas una con los datos de la persona y otra con un campo nvarchar donde guardo los id's de la la otra ...
  #1 (permalink)  
Antiguo 17/09/2007, 01:53
 
Fecha de Ingreso: febrero-2002
Ubicación: Sabadell
Mensajes: 253
Antigüedad: 22 años, 2 meses
Puntos: 5
Orden especifico

Veamos tengo dos tablas una con los datos de la persona y otra con un campo nvarchar donde guardo los id's de la la otra tabla, yo esos id's debo ordenarlos para luego visualizarlos por pantalla en el orden establecido pero al coger los datos y mostrarlos se me muestran ordenados por el campo id en vez de tal y como estan puestos en el nvarchar, me gustaria saber si podría mostrar esos datos de forma ordenada tal y como están en el campo nvarchar.

Como normalmente me explico como el ano... voy a poner todos los datos posibles:

Tabla A

ides [111,110]

Consulta:

SELECT * FROM tabla B WHERE id IN (111,110)

Eso me devuelve primero el 110 y luego el 111 cuando lo que quiero q sea primero es el 111.

Por adelantado muchísimas gracias :)
  #2 (permalink)  
Antiguo 17/09/2007, 12:12
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Orden especifico

Para ORDERNAR el resultado, se utiliza la instruccion ORDER BY, pero desafortunadamente, esta, no "entiende" que el ordenamiento lo tienes en una cadena (ni creo que lo haga nunca).

Podrias incluir DESC o ASC, ejemplo:

SELECT * FROM tabla B WHERE id IN (111,110)
ORDER BY id DESC
  #3 (permalink)  
Antiguo 18/09/2007, 09:45
 
Fecha de Ingreso: febrero-2002
Ubicación: Sabadell
Mensajes: 253
Antigüedad: 22 años, 2 meses
Puntos: 5
Re: Orden especifico

Eso no me serviría porque la cadena podría llegar a ser la siguente (111,110,112,109) y entonces claro tp ordenaría como yo quiero, que lastima la verdad que no me los muestre tal y como yo se los pido :/ pq sino en una simple query lo tendría todo :(
  #4 (permalink)  
Antiguo 18/09/2007, 11:22
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Orden especifico

LoBo2024

La instruccion: IN (111,110,112,109)

no ordena, la que ordena es el ORDER BY.
  #5 (permalink)  
Antiguo 18/09/2007, 11:23
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Re: Orden especifico

Ok, no habia entendido.

Lo que requieres es insertar una lista de Ids y consultar los registros correspondientes pero que sean mostrados respetando el orden de la lista de ids ingresados, no es asi?. Pues si se puede.

Ahora bien, de que forma ingresas los Ids, es un parametro del sp? de que tipo?

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #6 (permalink)  
Antiguo 18/09/2007, 11:25
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Orden especifico

Eso no me lo pierdo..........quiero ver como se ordenan los registros que se encuentran en la instuccion IN (111,110,112,109)

Porque, eso, es precisamente lo que pide.
  #7 (permalink)  
Antiguo 18/09/2007, 13:21
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Re: Orden especifico

Sencillo...

Insertando los ids en una variable tabla con un identity, teniendolos en ella se hace el join y se ordena por el campo identity de la variable tabla.



Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #8 (permalink)  
Antiguo 18/09/2007, 13:22
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Orden especifico

No suena mal, pero muestranos como........eso no me lo pierdo.......
  #9 (permalink)  
Antiguo 18/09/2007, 14:03
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Re: Orden especifico



Código:
 I'm trying to free your mind, Neo. But I can only show you the door. You're the one that has to walk through it.....
jejeje perdon, solo me acorde de la frase....

Ok, va... perdonen lo burdo del ejemplo pero no dispongo de mucho tiempo para la elaboracion... espero les sea de utilidad...


Primero, tomando como base la respuesta proporcionada por Daniel anteriormente , se construye el sp de utileria, este es basico y se puede ocupar en multiples ocasiones.

Código:
------------------------------------------------------------
-- Stored de Utileria
------------------------------------------------------------
Create Procedure dbo.ListToTable (@lstCadena varchar(8000))
AS
DECLARE  @lstDato varchar(7)
        ,@lnuPosComa int

Declare @MiTabla Table (iRow int Identity(1,1), Campo  int)
Set nocount on

WHILE  LEN(@lstCadena)> 0
BEGIN
	SET @lnuPosComa = CHARINDEX(',', @lstCadena ) -- Buscamos el caracter separador
	IF (@lnuPosComa = 0)
	BEGIN
		SET @lstDato = ltrim(rtrim(@lstCadena))
		SET @lstCadena = ''
	END
	ELSE
	BEGIN
		SET @lstDato = ltrim(rtrim(Substring( @lstCadena , 1  , @lnuPosComa-1)))
		SET @lstCadena = Substring( @lstCadena , @lnuPosComa + 1 , LEN(@lstCadena))
	END
	Insert into @MiTabla (Campo) values(cast(@lstDato as int))
END

Select * from @MiTabla
GO

En seguida se genera la info de pruebas y se realiza la consulta....

Código:
Set nocount on


If object_id('tempdb..#tmpData') is not null Drop Table #tmpData

Create table #tmpData (Camponoparam varchar(100), OtroCamponoparam int, Campo  int)
Insert into #tmpData (CampoNoParam, OtroCampoNoParam, Campo) values ('ssss', 90,   100)
Insert into #tmpData (CampoNoParam, OtroCampoNoParam, Campo) values ('dddd', 1,    101)
Insert into #tmpData (CampoNoParam, OtroCampoNoParam, Campo) values ('ffff', 45,   102)
Insert into #tmpData (CampoNoParam, OtroCampoNoParam, Campo) values ('gggg', 33,   103)
Insert into #tmpData (CampoNoParam, OtroCampoNoParam, Campo) values ('nnnn', 95,   104)
Insert into #tmpData (CampoNoParam, OtroCampoNoParam, Campo) values ('rrrr', 9,    105)
Insert into #tmpData (CampoNoParam, OtroCampoNoParam, Campo) values ('vvvv', 326,  106)
Insert into #tmpData (CampoNoParam, OtroCampoNoParam, Campo) values ('bbbb', 23,   107)
Insert into #tmpData (CampoNoParam, OtroCampoNoParam, Campo) values ('qqqq', 98,   108)
Insert into #tmpData (CampoNoParam, OtroCampoNoParam, Campo) values ('oooo', 1023, 109)
Insert into #tmpData (CampoNoParam, OtroCampoNoParam, Campo) values ('hhhh', 19,   110)

-------------------------------------------------------------------------------------



Declare @lstCadena varchar(8000)
SET @lstCadena ='104,110, 120, 100, 108,107'		--Cadena de Ejemplo.

If object_id('tempdb..#tmpMiTabla') is not null Drop Table #tmpMiTabla
Create table #tmpMiTabla (iRow int , Campo  int)


Insert into #tmpMiTabla (iRow, Campo)
Execute dbo.ListToTable @lstCadena

------------------------------------------------------------
-- Seleccionando en el orden establecido en el parametro
------------------------------------------------------------
Select D.*
From   #tmpMiTabla M
Inner join
      #tmpData D
On    M.Campo = D.Campo
Order by 
      M.iRow
Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #10 (permalink)  
Antiguo 18/09/2007, 14:29
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Orden especifico

Andres95

Lastima que no tenga una tabla que contenga una cantidad RESPETABLE de registros, pero me gustaria ver el PLAN DE EJECUCION que va a elaborar con tu ejemplo.

Yo sigo creyendo que "forzar" al motor de base de datos a hacer ciertas cosas, repercutira indudablemente en el tiempo de respuesta hacia los demas clientes (conexiones), siendo que trabajos como el del ejemplo, se podrian dejar para el front.
  #11 (permalink)  
Antiguo 18/09/2007, 14:42
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Re: Orden especifico

Bueno yo creo que mientras las cosas sean masivas y se disponga de los indices correctos, todo marcha bien...


Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #12 (permalink)  
Antiguo 18/09/2007, 15:59
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Orden especifico

Andres95

Para una base de datos de ALTO TRAFICO, donde se reciben transacciones por espacio de MEDIO MILLON por cada 15 minutos, atendiendo 1,250 conexiones de llamadas telefonicas y ejecutando un query como el que diseñaste, no aplica.

Tal vez, para una tabla con unos 10, 000 registros, y teniendo un moustruo de servidor, con mucha memoria, muchos procesadores y una sola conexion, tal vez el ejemplo sea valido.

Lo primero que cambiara, tal vez, sin conocer el PLAN DE EJECUCION de tu ejemplo, es NO DECLARAR TABLAS como variables, seria mucho mejor dejarlas como TABLAS TEMPORALES.

Pero bueno, esperemos que Lobo pruebe y nos diga que tal le fue.

No siempre lo que proponemos, es lo mas adecuado, eso que ni que.
  #13 (permalink)  
Antiguo 19/09/2007, 04:19
 
Fecha de Ingreso: febrero-2002
Ubicación: Sabadell
Mensajes: 253
Antigüedad: 22 años, 2 meses
Puntos: 5
Re: Orden especifico

Uh la q se ha liado xP que da igual que ya lo ordeno yo a través de asp no hay problema :P que yo pensaba que si no ponía ningún order podría mostrarlo o en su defecto poderle poner un orden especifico del palo ORDER BY id = 111, id = 110, id = 112

Pero si eso no existe pues na :) a buscar uno por uno por el orden de lectura ;)
  #14 (permalink)  
Antiguo 19/09/2007, 06:43
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Que no cunda el panico....

Cita:
Iniciado por iislas Ver Mensaje
Tal vez, para una tabla con unos 10, 000 registros, y teniendo un moustruo de servidor, con mucha memoria, muchos procesadores y una sola conexion, tal vez el ejemplo sea valido.


Todo eso para un select con un order by ?...




Cita:
Iniciado por iislas Ver Mensaje
Lo primero que cambiara, tal vez, sin conocer el PLAN DE EJECUCION de tu ejemplo, es NO DECLARAR TABLAS como variables, seria mucho mejor dejarlas como TABLAS TEMPORALES.
Libros en linea SQL Server...

Código:
Remarks
Functions and variables can be declared to be of type table. table variables can be used in functions, stored procedures, and batches.

Use table variables instead of temporary tables, whenever possible. table variables provide the following benefits: 

A table variable behaves like a local variable. It has a well-defined scope, which is the function, stored procedure, or batch in which it is declared. 
Within its scope, a table variable may be used like a regular table. It may be applied anywhere a table or table expression is used in SELECT, INSERT, UPDATE, and DELETE statements. However, table may not be used in the following statements:

INSERT INTO table_variable EXEC stored_procedure 

SELECT select_list INTO table_variable statements.

table variables are cleaned up automatically at the end of the function, stored procedure, or batch in which they are defined.

table variables used in stored procedures result in fewer recompilations of the stored procedures than when temporary tables are used.


Transactions involving table variables last only for the duration of an update on the table variable. Thus, table variables require less locking and logging resources.

Cita:
Iniciado por iislas Ver Mensaje
Pero bueno, esperemos que Lobo pruebe y nos diga que tal le fue.
Y bueno finalmente no le sirvio la propuesta...

Afortunadamente todos somos libres de tomar lo que se considere conveniente y aportar lo que se considere pueda servir a los demas...

Cita:
Iniciado por iislas Ver Mensaje
No siempre lo que proponemos, es lo mas adecuado, eso que ni que.
En eso si que tienes la razon...


Un saludo a ambos....
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #15 (permalink)  
Antiguo 19/09/2007, 09:24
 
Fecha de Ingreso: febrero-2002
Ubicación: Sabadell
Mensajes: 253
Antigüedad: 22 años, 2 meses
Puntos: 5
Re: Orden especifico

A ver es que basicamente yo necesito sacar esos datos a través del asp y eso que me pasastes puedo ejecutarlo en asp? 0_o o es para ejecutarlo desde el sql server? 0_o (mi no saber)
  #16 (permalink)  
Antiguo 19/09/2007, 09:30
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Re: Orden especifico

Tendrias que generar los dos stored procedures en tu base de datos en el SQL Server.

Despues para obtener su salida solo ejecutarias el sp desde tu aplicacion (con un comando o conecion ado) y le mandarias como parametro la lista de ids y te regresaria los datos ordenados segun la lista ingresada.
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #17 (permalink)  
Antiguo 19/09/2007, 10:45
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Orden especifico

Andres95

De las ventajas que menciona el BOL sobre las variables de tipo TABLE, no menciona que son creadas en memoria, que en todo caso, vendria siendo una gran desventaja para el servidor de datos.

¿Cierto?
  #18 (permalink)  
Antiguo 19/09/2007, 13:10
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Re: Orden especifico

No, no lo menciona y al parecer, no es del todo cierto compañero.

Usando el tipo de dato Tabla - SQL 2000

Código:
...
One factor that you should not take into account is the tradeoff
 between disk space and RAM usage. Many references on the Web 
claim that table variables are implemented purely in memory, as 
opposed to temporary tables which are actually written to a 
physical database. In fact, both table variables and temporary 
tables are created in the tempdb database. After all, SQL Server 
doesn't know how much data you're going to try to put into a table 
variable; what if you want to put in more than you have RAM 
available? In any case, SQL Server will cache small amounts of data 
in RAM no matter which means you use to declare the table.
Y lo peor, es que tambien las temporales muestran el mismo comportamiento... jejejeje (Preguntas Frecuentes de SQL 2000 - Base de Conocimiento Microsoft )

Código:
...
Q4: Are table variables memory-only structures that are assured 
better performance as compared to temporary or permanent tables, 
because they are maintained in a database that resides on the 
physical disk?

A4: A table variable is not a memory-only structure. Because a table 
variable might hold more data than can fit in memory, it has to have 
a place on disk to store data. Table variables are created in the 
tempdb database similar to temporary tables. If memory is available, 
both table variables and temporary tables are created and 
processed while in memory (data cache).
Pero no te preocupes, no creo que sea el caso de Lobo2024 (un servidor con millones de transacciones por minuto con miles de conexiones activas), al menos no lo ha comentado. Y si asi fuera, seria cuestion de que el mismo realizara las pruebas correspondientes para aportar los elementos concretos necesarios para que alguien lo pueda apoyar debidamente en esa situacion ya que ademas intervendrian otros factores como la configuracion del servidor de sql asi como del sistema operativo y hardware, sin mencionar la arquitectura de la aplicacion, y bueno en este sitio no somos consultores especializados sino una comunidad de apoyo gratuito.

Y para colmo de males parece ser que Lobo2024 ni siquiera va a utilizar la solucion propuesta.

Saludos y por aqui andamos aprendiendo y aportando lo que se pueda.

Suerte!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.

Última edición por Andres95; 19/09/2007 a las 14:03
  #19 (permalink)  
Antiguo 19/09/2007, 14:13
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Orden especifico

Andres95

Te quiero hacer una pregunta, esperando que me puedas contestar, ¿Que generacion eres (escolar)?

Gracias.
  #20 (permalink)  
Antiguo 20/09/2007, 03:19
 
Fecha de Ingreso: febrero-2002
Ubicación: Sabadell
Mensajes: 253
Antigüedad: 22 años, 2 meses
Puntos: 5
Re: Orden especifico

Ey siento mucho no haber realizado tu solución, pero es que se me escapa de las manos, no he hecho nunca un store procedure en sql server :/ y basicamente el servidor con el q tenemos contratado el tema del SQL Server no nos deja añadir store procedures :( así que chungo implementar tu solución la verdad, además lo veía demasiado complicado pa 2 o 3 id's q voy a tener puestos, aunque si algún dia salen muchos ides y puedo meter store procedures en el sql server te aseguro q miraré tu solución y la implementaré no pienses que esto ha caido en vacio :)

Y ya de paso si tienes por hay algun manual que explique lo de los stored procedures y en que caso usarlos... y pq usarlos en vez de querys normales te lo agradeceria :)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:41.