如何优化以下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)
答案 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。