怎么做替换动态查询?

时间:2017-01-03 13:32:47

标签: sql-server sql-server-2012 dynamic-sql

如何优化以下sql查询,以任何方式将动态查询替换为?...谢谢

 DECLARE @NUM INT,
         @NAME VARCHAR(20),
         @SQL VARCHAR(MAX)
    SET  @SQL='SELECT * FROM EMPLOYEE A'
IF(@NUM<>0)
BEGIN
SET @SQL=@SQL+'JOIN DEPARTMENT B ON A.N_ID=B.N_ID'
END
IF @NAME IS NOT NULL
BEGIN
SET @SQL=@SQL+'WHERE ENAME like '''+'%'+@NAME+'%'+''''
END EXEC(@SQL)

2 个答案:

答案 0 :(得分: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)+'%'

更新:(基于评论) 如果您允许用户将SQL代码作为参数传递,请阅读以下链接: SQL Injection

答案 1 :(得分: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 '%'+@NAME+'%'
END

当然这是按顺序执行的。因此,如果@NUM <> 0 @NAME IS NOT NULL,则只会执行第一个IF。