2012-01-20 21 views
8

द्वारा एसक्यूएल सर्वर परिणामों को ऑर्डर करना मेरे पास एक संग्रहित प्रक्रिया है जो आईएन क्लॉज का उपयोग करती है। मेरे एएसपी.नेट आवेदन में, मेरे पास एक मल्टीलाइन टेक्स्टबॉक्स है जो संग्रहीत प्रक्रिया को मूल्य प्रदान करता है। मैं मानों के अनुसार ऑर्डर करने में सक्षम होना चाहता हूं क्योंकि वे टेक्स्टबॉक्स में दर्ज किए गए थे। मैंने पाया कि यह आसानी से mySQL (FIELD फ़ंक्शन का उपयोग करके) में कैसे करें, लेकिन SQL सर्वर समकक्ष नहीं है।आईएन क्लॉज

तो मेरी क्वेरी लगता है:

Select * from myTable where item in @item 

तो मैं मूल्यों में '113,113', '112,112', '114,114' की तरह अपने आवेदन से (एक मनमाना क्रम में) गुजर किया जाएगा। मैं उस सूची के परिणामों को ऑर्डर करना चाहता हूं।

क्या कोई केस स्टेटमेंट व्यवहार्य होगा? मुझे नहीं पता कि टेक्स्टबॉक्स डेटा में कितनी वस्तुएं आ रही हैं।

उत्तर

5

आप IN खंड को पैरामीटर कैसे कर रहे हैं?

जैसा कि आप SQL Server 2008 पर हैं, मैं Table Valued Parameter में दो कॉलम item और sort_order के साथ पास कर दूंगा और इसके बजाय उसमें शामिल हो जाऊंगा। फिर आप अंत में ORDER BY sort_order जोड़ सकते हैं।

+2

+1, या यदि सीएसवी द्वारा, एक पहचान कॉलम के साथ एक @table चर में विभाजित करें जिसमें आप शामिल हो सकते हैं और फिर –

+0

@KM द्वारा ऑर्डर कर सकते हैं तो ओपी को एक साधारण चयन –

+0

@LuisSiquot के लिए स्टोर प्रक्रिया लिखनी होगी - वे पहले से ही संग्रहीत प्रक्रिया का उपयोग कर रहे हैं। लेकिन वे पैरामीटर किए गए प्रश्नों का उपयोग करना चाहिए भले ही वे नहीं थे। केएम द्वारा सुझाए गए अनुसार काम करने वाले बहुत सारे स्प्लिट टेबल मूल्यवान फ़ंक्शन हैं जो ओपी पर शामिल हो सकते हैं लेकिन यदि 2005 की संगतता की आवश्यकता नहीं है तो टीवीपी बेहतर होंगे। –

1

उसी तरह आप जोड़ ('113,113', '112,112', '114,114') जहां clausule में एसक्यूएल वाक्य को पारित करने के लिए आप

order by 
case item  
when '113113' then 1 
when '112112' then 2 
when '114114' then 3 
end 

श्रेणीबद्ध clausule

द्वारा अपने आदेश में पारित करने के लिए कर सकते हैं
+0

संभव नहीं है कि वह नहीं जानता कि कितने मूल्य होंगे - आपका केस स्टेटमेंट 1 से एन तक हो सकता है जहां एन वास्तव में वास्तव में वास्तव में उच्च है। – JonH

+0

@ जोनएच शायद वह जानता है कि कितने मूल्य होंगे। बेशक यह समाधान एक सीमित और "तार्किक" मामलों के लिए है। ओपी मूल्यांकन कर सकता है अगर थोड़ा एन उसकी जरूरतों को फिट करता है। सुनिश्चित करें कि अगर यह प्रेजेंटेशन समस्या के लिए है तो सभी लॉजिकल मामलों को कवर करता है। –

+0

मैं आपसे सहमत हूं हालांकि उन्होंने उल्लेख किया कि वह कितने नहीं जानते हैं। इसलिए मेरी टिप्पणी। – JonH

2

ऊपर किलोमीटर की इस टिप्पणी से ...

मुझे पता है तुम राज्य नहीं लगा कि यह अल्पविराम है अलग, लेकिन अगर यह एक सीएसवी था या यह अंतरिक्ष आप निम्नलिखित कर सकता है अलग भले ही आप है।

DECLARE @SomeTest varchar(100) --used to hold your values 
SET @SomeTest = (SELECT '68,72,103') --just some test data 

SELECT 
    LoginID --change to your column names 
FROM 
    Login --change to your source table name 
INNER JOIN 
( SELECT 
    * 
    FROM fn_IntegerInList(@SomeTest) 
) n 
ON 
    n.InListID = Login.LoginID 
ORDER BY 
    n.SortOrder 

और फिर fn_IntegerInList() बनाएँ:

CREATE FUNCTION [dbo].[fn_IntegerInList] (@InListString ntext) 
RETURNS @tblINList TABLE (InListID int, SortOrder int) 
AS 
BEGIN 
declare @length int 
declare @startpos int 
declare @ctr int 
declare @val nvarchar(50) 
declare @subs nvarchar(50) 
declare @sort int 

set @sort=1 
set @startpos = 1 
set @ctr = 1 
select @length = datalength(@InListString) 

while (@ctr <= @length) 
begin 
    select @val = substring(@InListString,@ctr,1) 

    if @val = N',' 
    begin 
     select @subs = substring(@InListString,@startpos,@[email protected]) 
     insert into @tblINList values (@subs, @sort) 
     set @startpos = @ctr+1 
    end 
    if @ctr = @length 
     begin 
     select @subs = substring(@InListString,@startpos,@[email protected]) 
     insert into @tblINList values (@subs, @sort) 
     end 
    set @ctr = @ctr +1 
    set @sort = @sort + 1 
end 
RETURN 
END 

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

+0

+1, बहुत आलसी/खुद को जवाब देने में व्यस्त ... –