2010-03-04 13 views
10

द्वारा आदेश हाय मेरे पास एक स्टोर प्रक्रिया है, जहां मैं एक चुनिंदा क्वेरी करता हूं। मैं इसे बाहरी पैरामीटर द्वारा ऑर्डर करना चाहता हूं।पैरामीटर

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 

क्या मैं के लिए द्वारा आदेश में लिख सकते हैं कि कार्य करें:

मैं एक कम से कम उदाहरण के पोस्ट?

धन्यवाद

+1

एक अपरिवर्तित डेटासेट वापस करने और परिणामों को कोड में क्रमबद्ध करने के बारे में कैसे? –

+0

आपके द्वारा पारित बाहरी पैरामीटर स्थिर होगा, तो आप इसके द्वारा कैसे ऑर्डर कर सकते हैं? – NibblyPig

उत्तर

8

आप 2 विकल्प हैं, या तो एक मामला बयान का उपयोग, या गतिशील एसक्यूएल

का उपयोग इस मामले बयान

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 

का एक उदाहरण होगा और यह हो सकता है और गतिशील एसक्यूएल का उदाहरण हैं

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 पहला व्यक्ति सुरक्षित या सुरक्षित है एसक्यूएल इंजेक्शन – garik

+0

यदि आप केस/जब विधि का उपयोग करते हैं, तो यह बहुत महत्वपूर्ण है कि प्रत्येक कॉलम में एक ही डेटा प्रकार होता है। एसक्यूएल संकलन समय पर एक केस/जब अभिव्यक्ति के परिणामी डेटा प्रकार का मूल्यांकन करता है और आउटपुट डेटा प्रकार निर्धारित करने के लिए डेटा प्रकार की प्राथमिकता का उपयोग करता है। डेटटाइम कॉलम के साथ एक पूर्णांक कॉलम मिश्रण करने का प्रयास करें और आप देखेंगे कि मेरा क्या मतलब है। –

-1

आप उपयोग स्ट्रिंग संयोजन और sp_executesql के लिए जा रहे हैं।

2

एक और विकल्प उस कॉलम के लिए अभिव्यक्ति का उपयोग करना है जिसे आप सॉर्ट करना चाहते हैं।

DECLARE @OrderBy INT 

SET @OrderBy = 4 

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

यदि आप कर सकते हैं तो गतिशील एसक्यूएल से बचने के लिए आमतौर पर बेहतर होता है।