2015-04-14 74 views
1

因此,我試圖編寫一個t-sql函數,它將搜索數據庫中的某些字段,但前提是字段不爲空。所以在下面的查詢中,我的c#調用會傳入這些參數,但是如果我不想傳入其中一個參數或者其中一個參數爲null,我希望它仍然可以搜索,但只能通過不是' t null(基本上從where子句中排除)。是否有捷徑可尋?或者我將不得不爲每個輸入組合單獨查詢?如何用變量或未知數量的參數編寫tsql搜索函數?

CREATE FUNCTION [dbo].[Search] 
(
    @firstname VarChar(50), 
    @lastname VarChar(80), 
    @userId VarChar(50), 
    @vehicle VarChar(50) 
) 
RETURNS @returntable TABLE 
(
    firstname VarChar(50), 
    lastname VarChar(80), 
    userId VarChar(50), 
    vehicle VarChar(50), 
    passengers VarChar(50) 
) 
AS 
BEGIN 
    INSERT @returntable 
    SELECT * FROM Drivers 
    Where firstname = @firstname and lastname = @lastname and 
      userid = @userId and vehicle = @vehicle 
RETURN 
END 
+0

爲什麼你想寫它作爲一個fucntion? – mybirthname

+3

當然這很常見。這是一個全面的查詢。這裏是關於這個話題的優秀文章。 http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/順便說一下,這將更適合作爲存儲過程而不是表值函數。 –

回答

1

這將允許忽略設置爲NULL的參數。

CREATE FUNCTION [dbo].[Search] 
(
    @firstname VarChar(50), 
    @lastname VarChar(80), 
    @userId VarChar(50), 
    @vehicle VarChar(50) 
) 
RETURNS @returntable TABLE 
(
    firstname VarChar(50), 
    lastname VarChar(80), 
    userId VarChar(50), 
    vehicle VarChar(50), 
    passengers VarChar(50) 
) 
AS 
BEGIN 
    INSERT @returntable 
    SELECT * FROM Drivers 
    Where (@firstname IS NULL OR firstname = @firstname) AND 
      (@lastname IS NULL OR lastname = @lastname) AND 
      (@userId IS NULL OR userid = @userId) AND 
      (@vehicle IS NULL OR vehicle = @vehicle) 
RETURN 
END 
+0

太棒了!我希望能有這樣簡單的東西,謝謝你的幫助! – Bdh2991

+2

如果將它轉換爲內聯表值函數,這將更適合。寫入的方式不必要的慢於需要。 –

+0

但是,當我嘗試使用SqlDataAdapter(c#)調用它時,我遇到了此方法的問題。它似乎不喜歡我傳遞函數空值,並導致拋出異常,如果參數丟失... – Bdh2991

2

可以跳過濾波器,是null

CREATE FUNCTION [dbo].[Search] 
( 
    @firstname VarChar(50), 
    @lastname VarChar(80), 
    @userId VarChar(50), 
    @vehicle VarChar(50) 
) 
RETURNS TABLE 
AS 
RETURN 
(
    SELECT * FROM Drivers 
    Where 
    (@firstname is null or firstname = @firstname) 
    and (@lastname is null or lastname = @lastname) 
    and (@userId is null or userid = @userId) 
    and (@vehicle is null or vehicle = @vehicle) 
) 
+0

你可以看看我上面引用的文章。這種方法運行良好,但如果處理不當,可能會導致一些嚴重的性能問題。 –

+0

@SeanLange,這是我在我的項目中使用的一種方法。感謝您的鏈接,我已經開始閱讀它。 – ASh

相關問題