2017-01-03 47 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