2010-06-04 39 views
1

請幫我寫這個搜索SQL存儲過程 過程可能在不同的時間有不同數量的參數 所以任何機構可以幫助我寫這個查詢。我不知道如何連接參數。 我是新來的存儲過程如何連接不同的存儲過程參數

CREATE PROCEDURE searchStudent 
-- Add the parameters for the stored procedure here 
@course int=null, 
@branch int=null, 
@admissionYear varchar(max)=null, 
@passingYear varchar(max)=null, 
@userName varchar(max)=null, 
@sex varchar(max)=null, 
@studyGap varchar(max)=null, 
@firstName varchar(max)=null, 
@lastName varchar(max)=null 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 
DECLARE query STR DEFAULT null 

IF @course IS NOT NULL 
THEN query= 
SELECT * FROM [tbl_students] WHERE 

END 
GO 

請填寫查詢,以便它可以有,它們是具有價值,可以從數據庫參數值的基礎上,搜索參數。但參數每次都可能有所不同取決於搜索條件。

回答

2

您可能需要使用動態SQL來實現此目的。首先,我強烈建議閱讀這篇優秀的文章。 http://www.sommarskog.se/dynamic_sql.html

你是動態的SQL會是這樣的;

Declare @query varchar(max) 

    Set @query = 'Select * From dbo.MyTable Where ' 

    If @Course Is Not Null 
    Begin 
    Set @query = @query + 'Course = ' + Convert(varchar(10), @Course) 
    end 

    If @Branch Is Not Null 
    Begin 
    Set @query = @query + ' and Branch = ' + Convert(varchar(10), @Branch) 
    end 

這只是一個例子!您將需要建立一些檢查以確保您有一個(且只有一個)Where子句,您必須確保integer值正確轉換爲字符串值。您還必須檢查參數沒有任何可能破壞動態SQL的特殊字符 - 如撇號('

使用動態SQL可能很痛苦,而且很難正確使用。

祝你好運!

+1

你可以通過你的初始@query避免這些檢查=「SELECT * FROM dbo.MyTable其中0 = 0」,使每一個附加條款開始「AND <子句邏輯>' – 2010-06-04 18:58:57

+0

啊,當然是一個很好的評論。謝謝! – codingbadger 2010-06-04 19:03:50

+1

我剛剛推薦Sommarskog,該網站是一個很好的參考。對於想要使用TSQL更好的人來說,值得一讀。請注意,在他的網站上,他還演示瞭如何在不使用動態SQL的情況下執行此操作,只要有可能就應該避免使用它。) – Meff 2010-06-04 19:06:56

1

對不起,我很難理解你在問什麼。你的意思是消費者可能會指定一些任意的參數子集,並且你想過濾這些參數嗎?

假設上面有2個選項。

1. 使用WHERE子句是這樣的:

WHERE ([tbl_students].firstName = ISNULL(@firstname,firstName) 
    AND ([tbl_students].lastName = ISNULL(@lastName ,lastName) 

等 這樣做是檢查你的參數有一個值,如果是的話,它會比較它的列。如果param爲null,那麼它會將該列與自己進行比較,從而不會過濾任何內容。

  1. 在你的sproc中使用動態sql,並且只要包含你想要的where子句的行,如果param不爲null。
2

帶有動態搜索條件的關鍵是確保使用索引,而不是如何輕鬆地重用代碼,消除查詢中的重複或嘗試使用相同的查詢執行所有操作。下面是關於如何處理這個話題非常全面的文章:

Dynamic Search Conditions in T-SQL by Erland Sommarskog

它涵蓋了所有的問題,並試圖寫有多個可選的搜索條件的查詢方法。你需要關心的主要事情不是代碼的重複,而是使用索引。如果你的查詢不能使用索引,它會變形很差。有幾種可以使用的技術,可以使用也可以不使用索引。

這裏是表的內容:

 
    Introduction 
     The Case Study: Searching Orders 
     The Northgale Database 
    Dynamic SQL 
     Introduction 
     Using sp_executesql 
     Using the CLR 
     Using EXEC() 
     When Caching Is Not Really What You Want 
    Static SQL 
     Introduction 
     x = @x OR @x IS NULL 
     Using IF statements 
     Umachandar's Bag of Tricks 
     Using Temp Tables 
     x = @x AND @x IS NOT NULL 
     Handling Complex Conditions 
    Hybrid Solutions – Using both Static and Dynamic SQL 
     Using Views 
     Using Inline Table Functions 
    Conclusion 
    Feedback and Acknowledgements 
    Revision History