2012-01-20 13 views
8

mam procedury przechowywanej który wykorzystuje zapis IN. W mojej aplikacji ASP.NET mam pole tekstowe wielowierszowe, które dostarcza wartości do procedury przechowywanej. Chcę móc składać zamówienia według wartości wprowadzonych w polu tekstowym. Dowiedziałem się, jak to zrobić z łatwością w mySQL (przy użyciu funkcji FIELD), ale nie w równoważniku SQL Server.Kolejność SQL Wyniki Server, w punkcie

Więc moje zapytanie wygląda następująco:

Select * from myTable where item in @item 

Więc będę przekazując wartości z mojej aplikacji takich jak „113113”, „112112”, „114114” (w dowolnej kolejności). Chcę zamówić wyniki według tej listy.

Czy oświadczenie CASE być wykonalne? Nie wiedziałbym, ile elementów nadchodzi w danych w polu tekstowym.

Odpowiedz

5

Jak się parametryzacja klauzuli IN?

Jak jesteś na SQL Server 2008 Chciałbym przekazać w Table Valued Parameter z dwoma kolumnami item i sort_order i dołącz na tym, że zamiast. Następnie możesz po prostu dodać końcówkę ORDER BY sort_order.

+2

+1 lub jeśli przez CSV, podziel się na zmienną @table z kolumną tożsamości, do której można dołączyć, a następnie zamówić przez –

+0

@KM, więc OP musi napisać procedurę sklepu dla prostego wyboru –

+0

@LuisSiquot - They używają już procedury składowanej. Ale powinny używać sparametryzowanych zapytań, nawet jeśli nie były. Istnieje wiele funkcji opartych na tabelach rozdzielonych, które działają zgodnie z sugestią KM, że OP mógłby się przyłączyć, ale jeśli kompatybilność z 2005 r. Nie będzie potrzebna, TVP będą lepsze. –

1

ten sam sposób można złączyć („113113”, „112112”, „114114”), aby przejść do zdania SQL w którym clausule można złączyć

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

przejść do zamówienia przez clausule

+0

Nie możliwe, że nie wie, ile wartości nie będzie - Twój case może być od 1 do n, gdzie n jest naprawdę naprawdę bardzo wysoki. – JonH

+0

@JonH może on wie, ile wartości będzie. Oczywiście to rozwiązanie jest dla skończonych i "logicznych" n przypadków. OP może ocenić, czy trochę n pasuje do jego potrzeb. Upewnij się, że jeśli dotyczy prezentacji, n obejmuje wszystkie sprawy logiczne. –

+0

Zgadzam się z Tobą, chociaż wspomniał, że nie wie, ile. Stąd mój komentarz. – JonH

2

Od komentarzu km na powyższym ...

wiem, że nie stwierdził, że jest przecinek rozdzielone, ale jeśli to było CSV lub nawet jeśli to przestrzeń oddzielona można wykonać następujące czynności.

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 

a następnie utworzyć 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 

ten sposób Państwa funkcja tworzy tabelę, która trzyma porządek mianowicie SortOrder i identyfikator lub numer są przechodzącą w Można oczywiście zmodyfikować to. tak, że szukasz wartości spacji zamiast wartości ,. W przeciwnym razie Martin ma odpowiedni pomysł w swojej odpowiedzi. Proszę zauważyć w moim przykładzie używam jednego z moich tabel, więc będziesz musiał zmienić nazwę Login na wszystko, z czym masz do czynienia.

+0

+1, zbyt leniwy/zajęty, by odpowiedzieć sobie ... –