2010-03-04 25 views
10

Merhaba, seçtiğim bir sorgu yapacağım bir mağaza prosedürü var. Bunu harici bir parametre ile sipariş etmek istiyorum.Bir parametre ile sipariş ver

i için tarafından sırayla yazabilir ne
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 

bunu:

Bir asgari örnek gönderebilir?

sayesinde

+1

Sıralanmamış bir veri kümesine dönüp sonuçları kodda sıralamaya ne dersiniz? –

+0

Geçirdiğiniz harici parametre statik olacak, bu yüzden nasıl sipariş verebilirsiniz? – NibblyPig

cevap

8

2 seçeneğiniz var, ya bir CASE deyimi kullanın veya bu CASE deyimi

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 

bir örnek olacağını Ve bu olabilir ve dinamik sql örneği olacağını dinamik sql

kullanmak

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 Birincisi korunan ya da tekrar güvenli bir şekilde sql enjeksiyonu – garik

+0

Örnek/Zaman yöntemini kullanırsanız, her bir sütunun aynı veri türüne sahip olması ÇOK önemlidir. SQL, derleme zamanında bir Case/When ifadesinin sonuçta elde edilen veri türünü değerlendirir ve çıkış veri tipini belirlemek için veri tipi önceliğini kullanır. Bir Tamsayı sütununu bir DateTime sütunuyla karıştırmayı deneyin ve ne demek istediğimi görürsünüz. –

2

Başka bir seçenek, sıralamak istediğiniz sütunun bir ifadesini kullanmaktır.

DECLARE @OrderBy INT 

SET @OrderBy = 4 

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

Olabiliyorsanız dinamik sql'den kaçınmak genellikle daha iyidir.