2017-01-03 45 views

回答

1

隨着返回的列的數量之外,此查詢應該是正確的。它可能需要調整一下你的精確表結構。

我不知道這是否是最佳解決方案,它取決於您是否在[Ename]上有索引。

DECLARE @num INT 
     ,@name VARCHAR(20) 

SELECT 
    * 
FROM 
    EMPLOYEE A 
     LEFT JOIN DEPARTMENT B 
      ON 
      A.N_ID = B.N_ID 
      AND 
      @num <> 0 
WHERE 
    EName LIKE '%'+ISNULL(@name,EName)+'%' 

UPDATE:(基於評論) 如果允許用戶通過SQL代碼作爲參數,請讀了以下鏈接: SQL Injection

+0

感謝pacreely,如果我已經通過參數(@QRY)傳遞查詢字符串,那麼如何實現? 'DECLARE @NUM INT, \t \t @NAME VARCHAR(20), @QRY VARCHAR(MAX)= 'AND DEPT IN(5,6)' \t \t @SQL VARCHAR(MAX) \t \t SET @SQL = 'SELECT * FROM EMPLOYEE A' \t IF(@NUM <> 0) \t BEGIN \t SET @ SQL = @ SQL + 'JOIN部門B ON A.N_ID = B.N_ID' \t END \t IF @NAME IS NOT NULL \t BEGIN \t SET @ SQL = @ SQ L + 'WHERE ENAME像 ''' + '%' + @ NAME + '%' + '' '' \t END IF @QRY IS NOT NULL BEGIN SET @ SQL = @ SQL + @ QRY END EXEC(@SQL )' –

+0

@QRY代表了一段SQL代碼,而不是離散值,包含它的唯一方法是使用動態SQL。您有一個選項是將值5和6加載到另一個表中,然後對該表執行Inner Join。 – pacreely

+0

非常感謝,@ QRY只是最終用戶的一個參數,他們會像部門一樣給出任何一段SQL代碼。 –

0

無需動態部分.. 。您的IF語句將決定執行哪條語句

DECLARE @NUM INT, @NAME VARCHAR(20) 

IF(@NUM<>0) 
BEGIN 
    SELECT * FROM EMPLOYEE A JOIN DEPARTMENT B ON A.N_ID=B.N_ID 
END 
IF @NAME IS NOT NULL 
BEGIN 
    SELECT * FROM EMPLOYEE A WHERE ENAME like '%'[email protected]+'%' 
END 

當然這是按順序執行的。所以如果@NUM <> 0@NAME IS NOT NULL,只有第一個IF將被執行。

+0

感謝scsimon,你的查詢只適用於簡單的動態部分,如果我有很多線內的動態部分,那麼如何可以實現? –

+0

你必須詳細說明@Thangadurai並提供一個更好的例子。很可能你可以添加另一個IF和ELSE子句 – scsimon