2015-07-03 22 views
-2

下面是我的存儲過程,它可以正常執行,沒有錯誤,但數據無法基於參數值正確顯示。選擇查詢沒有完全顯示WHERE條件1 = 0或1 = 1的結果

例:

exec dbo.[SP_ViewAdvanceSearchDetails] 
NULL,NULL,NULL,'AP','Saudi','1','2','2','Looking',NULL 

默認情況下,數據顯示,即使數據不表提供整個列表

我的問題是WHERE clause 1=1(工作罰款所有默認值,但是當我改變)和1 = 0(工作正常,當我通過一些值)

我越來越頭痛,無法知道我該怎麼做。

 DECLARE @sql nvarchar(max) 
     SET @sql=N'SELECT  Tbl_JobSeekers.National_Id,  Tbl_JobSeekers.JobSeeker_EnglishName, Tbl_JobSeekers.JobSeeker_Arabicname, Tbl_JobSeekers.Mobile, Tbl_JobSeekers.City, 
        Tbl_JobSeekers.Nationality, Tbl_JobSeekers.Education, Tbl_JobSeekers.Experience, Tbl_JobSeekers.Category, Tbl_JobSeekers.JobSeekerStatus, 
        Tbl_JobSeekers.StatusEmployer, Tbl_JobSeekers.ImagePath, Tbl_JobSeekers.ResumePath, Tbl_JobSeekers.Remarks, Tbl_JobSeekers.Email, 
        Tbl_JobSeekers.Created_Date, Tbl_City.City_Name, Tbl_Qualification.Education_Name, Tbl_Experience.Experience_Years, Tbl_Categories.Category_Name, 
        Tbl_Employers.Employer_EnglishName 
    FROM Tbl_JobSeekers INNER JOIN 
        Tbl_City ON Tbl_JobSeekers.City = Tbl_City.City_Id INNER JOIN 
        Tbl_Qualification ON Tbl_JobSeekers.Education = Tbl_Qualification.Education_Id INNER JOIN 
        Tbl_Experience ON Tbl_JobSeekers.Experience = Tbl_Experience.Experience_Id INNER JOIN 
        Tbl_Categories ON Tbl_JobSeekers.Category = Tbl_Categories.Category_Id LEFT OUTER JOIN 
        Tbl_Employers ON Tbl_JobSeekers.StatusEmployer = Tbl_Employers.Employer_Id WHERE (1=0) ' 

--set @sql = @sql + ' 1=1 OR ' 
if (@National_Id is NOT NULL) set @sql = @sql + ' OR Tbl_JobSeekers.National_Id LIKE ''%' + @National_Id + '%'' ' 
if (@JobSeeker_EnglishName is not NULL) set @sql = @sql + ' OR Tbl_JobSeekers.JobSeeker_EnglishName LIKE ''%' + @JobSeeker_EnglishName + '%'' ' 
if (@Mobile is not NULL) set @sql = @sql + ' OR Tbl_JobSeekers.Mobile LIKE ''%' + @Mobile + '%'' ' 
if (@City <> 'All') set @sql = @sql + ' OR [email protected] ' 
if (@Nationality is not NULL) set @sql = @sql + ' OR [email protected] ' 
if (@Education <> 'All') set @sql = @sql + ' OR [email protected] ' 
if (@Experience <> 'All') set @sql = @sql + ' OR [email protected] ' 
if (@Category <> 'All') set @sql = @sql + ' OR [email protected] ' 
if (@JobSeekerStatus <> 'All') set @sql = @sql + ' OR [email protected] ' 
if (@Email is not NULL) set @sql = @sql + ' OR Tbl_JobSeekers.Email LIKE ''%' + @Email + '%'' ' 


--PRINT @National_Id --+',' + @JobSeeker_EnglishName + ',' + @Mobile + ',' + @City + ',' + @Nationality + ',' + @Education + ',' + @Experience + ',' + @Category + ',' + @JobSeekerStatus + ',' + @Email 

PRINT @sql 

EXEC sp_executesql @sql, 

N'@National_Id nvarchar(25),@JobSeeker_EnglishName nvarchar(50), @Mobile nvarchar(25), @City varchar(10), @Nationality varchar(10), @Education varchar(10) , @Experience nvarchar(25), @Category nvarchar(25), @JobSeekerStatus nvarchar(25), @Email nvarchar(100)', 
    @National_Id, @JobSeeker_EnglishName, @Mobile, @City, @Nationality, @Education, @Experience ,@Category, @JobSeekerStatus, @Email 


END 
+0

我可以知道爲什麼我們需要將1 = 1或1 = 0用於OR條件嗎?有什麼需要?請參閱下面我的建議答案 – staticvoidmain

回答

0

如何完全忽略常量?然後,把你的where條款在一起:

declare @where varchar(max) = ''; 

if (@National_Id is NOT NULL) 
set @where = @where + ' OR Tbl_JobSeekers.National_Id LIKE ''%' 
        + @National_Id + '%'' ' 

. . . 

最後,

set @sql = @sql + (case when @where <> '' 
         then 'where ' + stuff(@where, 1, 3, '') 
         else '' 
        end); 
0

書面,一旦你到

OR 1 = 1 OR ......

查詢返回所有記錄,因爲(1 = 1)爲TRUE,其餘無關緊要。

這就是爲什麼要使用一些其他變量來構建WHERE子句,並將其添加之後

考慮:

DECLARE @SQL VARCHAR(max) 
    , @WHERE VARCHAR(MAX) = '' 

然後

-- take the WHERE 1=0 off the END of your current @SQL 
SET @SQL = '... Tbl_Employers ON Tbl_JobSeekers.StatusEmployer = Tbl_Employers.Employer_Id ' 


-- build your @WHERE 
if (@National_Id is NOT NULL) set @WHERE = @WHERE + ' OR Tbl_JobSeekers.National_Id LIKE ''%' + @National_Id + '%'' ' 
if (@JobSeeker_EnglishName is not NULL) set @WHERE = @WHERE + ' OR Tbl_JobSeekers.JobSeeker_EnglishName LIKE ''%' + @JobSeeker_EnglishName + '%'' ' 
if (@Mobile is not NULL) set @WHERE = @WHERE + ' OR Tbl_JobSeekers.Mobile LIKE ''%' + @Mobile + '%'' ' 
if (@City <> 'All') set @WHERE = @WHERE + ' OR [email protected] ' 
if (@Nationality is not NULL) set @WHERE = @WHERE + ' OR [email protected] ' 
if (@Education <> 'All') set @WHERE = @WHERE + ' OR [email protected] ' 
if (@Experience <> 'All') set @WHERE = @WHERE + ' OR [email protected] ' 
if (@Category <> 'All') set @WHERE = @WHERE + ' OR [email protected] ' 
if (@JobSeekerStatus <> 'All') set @WHERE = @WHERE + ' OR [email protected] ' 
if (@Email is not NULL) set @WHERE = @WHERE + ' OR Tbl_JobSeekers.Email LIKE ''%' + @Email + '%'' ' 

-- conditionally add @WHERE to @SQL 
IF LEN(@WHERE) > 0 SET @SQL = @SQL + ' WHERE 1=0 ' + @WHERE; 
-- note: if @WHERE is empty, there is NO WHERE clause at all 
0

我希望你OR聲明不是必需的。在代碼中,您正在使用WHERE 1=0 OR匹配一些其他條件。在任何情況下,如果其中一個是真的WHERE 1=0 OR <your sql condition>它將返回記錄。第一個條件將默認返回false,第二個條件必須爲true。我們不要求where 1=0 or where 1=1OR條件使用它。這將是好離開它這樣

SET @sql=N'SELECT  Tbl_JobSeekers.National_Id,  Tbl_JobSeekers.JobSeeker_EnglishName,  Tbl_JobSeekers.JobSeeker_Arabicname, Tbl_JobSeekers.Mobile, Tbl_JobSeekers.City, 
        Tbl_JobSeekers.Nationality, Tbl_JobSeekers.Education, Tbl_JobSeekers.Experience, Tbl_JobSeekers.Category, Tbl_JobSeekers.JobSeekerStatus, 
        Tbl_JobSeekers.StatusEmployer, Tbl_JobSeekers.ImagePath, Tbl_JobSeekers.ResumePath, Tbl_JobSeekers.Remarks, Tbl_JobSeekers.Email, 
        Tbl_JobSeekers.Created_Date, Tbl_City.City_Name, Tbl_Qualification.Education_Name, Tbl_Experience.Experience_Years, Tbl_Categories.Category_Name, 
        Tbl_Employers.Employer_EnglishName 
    FROM Tbl_JobSeekers INNER JOIN 
        Tbl_City ON Tbl_JobSeekers.City = Tbl_City.City_Id INNER JOIN 
        Tbl_Qualification ON Tbl_JobSeekers.Education = Tbl_Qualification.Education_Id INNER JOIN 
        Tbl_Experience ON Tbl_JobSeekers.Experience = Tbl_Experience.Experience_Id INNER JOIN 
        Tbl_Categories ON Tbl_JobSeekers.Category = Tbl_Categories.Category_Id LEFT OUTER JOIN 
        Tbl_Employers ON Tbl_JobSeekers.StatusEmployer = Tbl_Employers.Employer_Id' 

嘗試執行這樣

exec dbo.[SP_ViewAdvanceSearchDetails] 'NULL','NULL','NULL','AP','Saudi','1','2','2','Looking','NULL' 

之間的SP,爲什麼所有列VARCHAR類型的?這是要求嗎?