variable ejemplos desc sql sql-server tsql sql-server-2005

ejemplos - sql order by date



Usando variables para asc y desc en orden por (4)

Prueba este

DECLARE @column VARCHAR(15) = ''object_id'' , @order CHAR(4) = ''DESC'' DECLARE @SQL NVARCHAR(MAX) SELECT @SQL = '' SELECT * FROM sys.objects ORDER BY '' + @column + '' '' + @order PRINT @SQL EXEC sys.sp_executesql @SQL

Esta pregunta ya tiene una respuesta aquí:

Entiendo que puedo usar variables en el orden por sección de consultas de SQL como esta:

order by case when @var1 = ''priority'' then priority end desc, case when @var2 = ''report_date'' then report_date end asc

Pero, ¿cómo uso las variables para las secciones asc y desc también?


Puede ordenar dinámicamente en muchos tipos introduciendo un truco multiplicador en la Order by . La implementación dependerá de que seas capaz de convertir cada campo clasificable en un campo entero, así:

DECLARE @Var1 NVARCHAR(20); DECLARE @Var2 NVARCHAR(3); DECLARE @OrderHack INT; SET @Var1 = ''priority''; SET @Var2 = ''DESC''; IF (@Var2 = ''ASC'') SET @OrderHack = 1; ELSE SET @OrderHack = -1; SELECT * FROM SortTable ORDER BY CASE @var1 WHEN ''priority'' THEN CONVERT(INT, [priority]) * @OrderHack WHEN ''report_date'' THEN CONVERT(INT, report_date) * @OrderHack END;

SqlFiddle aquí

Editar

Solo para aclarar, según el punto de @t-clausen.dk , el hackeo depende de la conversión a un tipo numérico creciente que represente la orden. por ejemplo, si necesita una resolución más alta en un DATETIME para asegurarse de que el componente de tiempo también se considere en la clasificación, el INT @OrderHack puede reemplazarse por un FLOAT o DECIMAL etc. , especialmente si se tiene en cuenta la sensibilidad de acento y acento.


Suponiendo que su variable @var3 almacene ''ASC'' palabras clave ''ASC'' o ''DESC'' , puede escribir algo como esto:

order by case when @var1 = ''priority'' and @var3 = ''DESC'' then priority end DESC, case when @var1 = ''priority'' and @var3 = ''ASC'' then priority end ASC, case when @var2 = ''report_date'' and @var3 = ''ASC'' then report_date end ASC, case when @var2 = ''report_date'' and @var3 = ''DESC'' then report_date end DESC


sin Dynamic SQL cada opción es la cláusula por ejemplo:

ORDER BY case when @var1 = ''priority asc'' THEN priority END ASC , case when @var1 = ''priority desc'' then priority end DESC, case when @var2 = ''report_date asc'' then report_date end ASC, case when @var2 = ''report_date desc'' then report_date end DESC