2010-03-04 30 views
10

Xin chào tôi có quy trình lưu trữ, nơi tôi thực hiện truy vấn chọn. Tôi muốn đặt hàng này theo thông số bên ngoài.đặt hàng theo tham số

tôi gửi một ví dụ nhỏ:

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 

gì tôi có thể viết theo thứ tự bằng cách cho làm điều đó?

nhờ

+1

Làm cách nào để trả về tập dữ liệu chưa phân loại và sắp xếp kết quả bằng mã? –

+0

Tham số bên ngoài bạn chuyển vào sẽ là tĩnh, vậy bạn có thể đặt hàng như thế nào? – NibblyPig

Trả lời

8

Bạn có 2 lựa chọn, hoặc là sử dụng một lệnh CASE, hoặc sử dụng năng động sql

Đây sẽ là một ví dụ về câu lệnh CASE

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 

Và đây sẽ là và ví dụ về sql động

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 Cái đầu tiên được bảo vệ hoặc bảo mật một lần nữa sql injection – garik

+0

Nếu bạn sử dụng phương pháp Case/When, điều quan trọng là mỗi cột có cùng kiểu dữ liệu. SQL đánh giá kiểu dữ liệu kết quả của một biểu thức Case/When tại thời gian biên dịch và sử dụng kiểu dữ liệu ưu tiên để xác định kiểu dữ liệu đầu ra. Hãy thử trộn một cột số nguyên với một cột DateTime và bạn sẽ thấy những gì tôi có ý nghĩa. –

2

Tùy chọn khác là sử dụng biểu thức cho cột mà bạn muốn sắp xếp theo.

DECLARE @OrderBy INT 

SET @OrderBy = 4 

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

Tốt hơn nên tránh sql động nếu có thể.

Các vấn đề liên quan