2016-01-21 220 views
-2

動態SP返回值,我使用MS SQL和創建一個動態的存儲過程:以相反的順序

ALTER Procedure [dbo].[sp_MTracking] 
(
@OList varchar(MAX) 
) 
    As 
    BEGIN TRY 
    SET NOCOUNT ON 
    DECLARE @SQL varchar(600) 

    SET @SQL = 'select os.X,os.Y from Table1 as os join Table2 as s on os.sID=s.sID where s.SCode IN ('+ @OList +')' 

    exec (@SQL) 


    END TRY         
    BEGIN CATCH 
     Execute sp_DB_ErrorInfo 
     Select -1 Result 
    END CATCH 

GO 

它工作正常,但我以相反的順序得到的x,y值。 例如,如果我傳遞'scode1,scode2'作爲參數,我將第2行中的scode1的x,y值和第2行中的x,y值作爲scode2。

我怎樣才能解決這個問題

感謝

回答

3

這是有點長了評論。

SQL表和結果集表示無序集。沒有排序,除非明確使用ORDER BY子句。您的查詢沒有ORDER BY。因此,你沒有理由期望結果以任何特定的順序。另外,在查詢的不同運行中排序可能不同。如果您想按特定順序顯示結果,請添加ORDER BY

也許最簡單的方法是使用charindex()

order by charindex(',' + s.code + ',' , ',''' + @olist + ''',') 

這是動態SQL有點更麻煩:

SET @SQL = ' 
select os.X,os.Y 
from Table1 os join 
    Table2 s 
    on os.sID = s.sID 
where s.SCode IN (' + @OList + ') 
order by charindex('','' + s.code + '','', '',''' + @OList + ''', '') 
'; 
+0

你擊敗了我10秒。如果我只能輸入幾個字符,我可能會有一個代表推動400k。給你我的讚賞,因爲完成我輸入的內容會使它看起來該死的近似我現在剽竊你。 – LDMJoe

+0

謝謝Gordon Linoff,我如何根據我的參數列表訂購 –

0

沒有動態的SQL -

ALTER PROCEDURE [dbo].[sp_MTracking] 
(
    @OList VARCHAR(MAX) 
) 
AS BEGIN 

    SET NOCOUNT ON 

    DECLARE @t TABLE (val VARCHAR(50) PRIMARY KEY WITH(IGNORE_DUP_KEY=ON)) 
    INSERT INTO @t 
    SELECT item = t.c.value('.', 'INT') 
    FROM (
     SELECT txml = CAST('<r>' + REPLACE(@OList, ',', '</r><r>') + '</r>' AS XML) 
    ) r 
    CROSS APPLY txml.nodes('/r') t(c) 

    SELECT os.X, os.Y 
    FROM Table1 os 
    JOIN Table2 s ON os.[sID] = s.[sID] 
    WHERE s.SCode IN (SELECT * FROM @t) 
    --OPTION(RECOMPILE) 

END 
GO 
+2

儘管您的觀點有效且重要,但它並不回答提出的原始問題。 –

1

好,這裏有幾件事。
第一個事情是戈登寫的 - 確保結果集的順序您必須使用order by條款。

第二個,就像Devart在他的回答中演示的那樣,你不需要動態sql來處理這類程序。

第三,如果你想按照列表中參數的順序排列結果,那麼你應該使用一個稍微不同的方法,然後Devart寫道。
爲此,這裏是我的2美分:

如果你可以改變存儲過程接受VARCHAR(max)一個table valued parameter代替,這將是您最好的選擇恕我直言。
如果不是,則必須使用split function從該varchar創建一個表格,然後在選擇中使用該表格。
請注意,您將不得不選擇一個分割函數,該函數返回一個帶有兩列的表格 - 一個用於值,另一個用於原始字符串中的位置。

無論如何可以是,該SQL的其餘部分應該是這樣的:

SELECT os.X, os.Y 
FROM Table1 os 
INNER JOIN Table2 s ON os.[sID] = s.[sID] 
INNER JOIN @TVP t ON s.SCode = t.Value 
ORDER BY t.Sort 

這是假設@TVP是含有一個Value列這是在表2 SCode同一數據類型的表,和一個Sort列(自然是int)。