2013-10-13 70 views

回答

0

我會使用動態查詢:

DECLARE @FirstName NVARCHAR(50), @LastName NVARCHAR(50); 
SET @FirstName = 'John'; 
SET @LastName = 'Johnson'; 

DECLARE @SqlStatement NVARCHAR(MAX), @SqlParamters NVARCHAR(MAX); 
SET @SqlStatement = N'SELECT e.EmployeeID, e.FirstName, e.LastName FROM dbo.Employee e 
' 
+ CASE WHEN @FirstName IS NOT NULL OR @LastName IS NOT NULL THEN 'WHERE ' 
+ CASE WHEN @FirstName IS NOT NULL THEN 'e.FirstName = @pFirstName' 
+ CASE WHEN @LastName IS NOT NULL THEN 'e.LastName = @pLastName'; 

-- PRINT @SqlStatement; 

EXEC sp_executesql 
    @SqlStatement, 
    N'@pFirstName NVARCHAR(50), @pLastName NVARCHAR(50)', 
    @pFirstName = @FirstName, 
    @pLastName = @LastName; 

索引:如果您有以下指標

CREATE INDEX IX_Employee_LastName_FirstName 
On dbo.Employee (LastName, FirstName); 

則只有以下謂詞是可優化搜索(索引查找):

WHERE e.LastName = @pLastName 

WHERE e.LastName = @pLastName AND e.FirstName = @pFirstName 

,但下面的謂詞不是可優化搜索(索引掃描):

WHERE e.FirstName = @pFirstName 
1

您可以使用以下查詢。我假設你有2個參數@FirstName@LastName,如果你不想按它們搜索,它可以是NULL。

SELECT * FROM EMPLOYEE 
WHERE ([First Name] = @FirstName OR @FirstName IS NULL) 
    AND ([Last Name] = @LastName OR @LastName IS NULL)