2010-03-04 13 views
10

Hola tengo un procedimiento de tienda, donde hago una consulta de selección. Quiero pedir esto por un parámetro externo.orden por un parámetro

he puesto un ejemplo mínimo:

CREATE PROCEDURE [dbo].[up_missioni_get_data] 
@order VarChar(100) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    SELECT * from missioni ORDER BY ... 
END 

¿Qué puedo escribir con el fin de para hacer eso?

gracias

+1

¿Qué le parece devolver un conjunto de datos sin clasificar y ordenar los resultados en el código? –

+0

El parámetro externo que pasa será estático, entonces, ¿cómo puede ordenarlo? – NibblyPig

Respuesta

8

tienes 2 opciones, o bien utilizar una instrucción CASE, o utilizar SQL dinámico

Esto sería un ejemplo de la instrucción CASE

DECLARE @Table TABLE(
     Col1 VARCHAR(10), 
     Col2 VARCHAR(10) 
) 

DECLARE @OrderBy VARCHAR(100) 

SET @OrderBy = 'Col1' 

SELECT * 
FROM @Table 
ORDER BY 
     CASE 
      WHEN @OrderBy = 'Col1' THEN Col1 
      WHEN @OrderBy = 'Col2' THEN Col2 
      ELSE Col1 
     END 

Y esto sería y ejemplo de SQL dinámico

CREATE TABLE #Table (
     Col1 VARCHAR(10), 
     Col2 VARCHAR(10) 
) 

DECLARE @OrderBy VARCHAR(100) 

SET @OrderBy = 'Col1' 

DECLARE @SqlString NVARCHAR(MAX) 

SELECT @SqlString = 'SELECT * FROM #Table ORDER BY ' + @OrderBy 

EXEC(@Sqlstring) 

DROP TABLE #Table 
+4

+1 El primero está protegido o seguro nuevamente inyección sql – garik

+0

Si usa el método Case/When, es MUY importante que cada columna tenga el mismo tipo de datos. SQL evalúa el tipo de datos resultante de una expresión Case/When en tiempo de compilación y utiliza la precedencia del tipo de datos para determinar el tipo de datos de salida. Intenta mezclar una columna entera con una columna DateTime y verás a qué me refiero. –

-1

Usted va a tener un uso concatenación de cadenas y sp_executesql.

2

Otra opción es usar una expresión para la columna por la que desea ordenar.

DECLARE @OrderBy INT 

SET @OrderBy = 4 

SELECT  * 
FROM   MySourceTable 
ORDER BY COL_NAME(OBJECT_ID('MySourceTable'), @OrderBy) 

Por lo general, es mejor evitar el sql dinámico si es posible.