2016-09-22 62 views
3

我有一個選擇查詢在變量中聲明。現在我想檢查查詢是否返回0行,那麼我必須去處理其他條件。我正在使用SQL SERVER 2012.如何檢查包含0行的變量。請建議如何計算SQL Server中選定行的返回值?

set @sql = 'select tsf.StaffId,tsf.FullName,tsf.[Address],tsf.PhoneNo,tsf.Email,tsf.Gender,tsf.MobileNo1,tsf.MobileNo2, tsf.Post,       tsf.Salary,ts.AdvanceSalary,ts.[Description],ts.[Month] from Tbl_Salary ts 
         JOIN Tbl_Staff tsf on ts.StaffId = tsf.StaffId' 
         If @CategoryId is not null   
         set @sql = @sql + ' where tsf.StaffId='''+cast(@CategoryId as varchar(10))+'''' 
         If @MonthName is not null 
         set @sql = @sql +' and ts.Month='''+cast(@MonthName as varchar(50))+'''' 
         If @Year is not null 
         set @sql = @sql +' and ts.Year='''+cast(@Year as varchar(50))+'''' 
      exec(@sql) 
+0

變量絕對不包含任何行。這只是一個字符串。另一方面,它包含一大堆SQL注入漏洞 –

回答

2

你可以簡單地查詢更改爲

select COUNT(*) 
from Tbl_Machine where MachineId = @MachineId 

是毫無意義的數據傳輸的所有行,如果你只在計數感興趣。

此外,當您執行查詢時,幾乎所有數據庫庫都會返回一個包含行數的屬性 - 您可能希望查看您使用的任何庫。


看看你的更新,這裏絕對不需要動態sql - 使用它會破壞你的性能。您只需一些有條件的邏輯

select tsf.StaffId,tsf.FullName,tsf. [Address],tsf.PhoneNo,tsf.Email,tsf.Gender,tsf.MobileNo1,tsf.MobileNo2, tsf.Post,       tsf.Salary,ts.AdvanceSalary,ts.[Description],ts.[Month] 
from Tbl_Salary ts 
JOIN Tbl_Staff tsf on ts.StaffId = tsf.StaffId 
WHERE (@CategoryId IS NULL OR [email protected]) 
AND (@MonthName IS NULL OR [email protected]) 
AND (@Year IS NULL OR and [email protected]) 
+0

對於T-SQL它是'@@ ROWCOUNT'。雖然OP應該重新思考整個問題 - 「有條件的」查詢是一種強烈的嗅覺。基於sume查詢結果執行一個或另一個語句的存儲過程是另一個。例如,嘗試在數據的存在的基礎上選擇「INSERT」或「UPDATE」時,由於索引和優化,只運行這兩個語句會更快 –

0
if not exists 
(select MachineId, MachineName, PurchasedDate, CompanyName, ModelNo, Amount, InsuranceCom, 
MnthlyInstallAmt, TotalPaid, MnthlyInstallDate from Tbl_Machine 
where MachineId = @MachineId) 
begin 
--returned 0 rows 
--go with other conditions 
end 
+0

感謝您的迴應。是否有任何想法檢查聲明變量,因爲我有3到4條件檢查where子句。 – user6672226

+0

我不確定,我完全理解你的要求,你能否更新問題以阻止這裏的所有答案 – TheGameiswar

+0

@TheGameiswar他說他的select語句在一個變量中,我假設他想要計算結果當它被執行時這個變量 - 例如EXEC(@sql) – Iztoksson

0
set @sql = "select count(temp_all.MachineId) AS 'Total_count' from 
      (select MachineId, MachineName, PurchasedDate, CompanyName, ModelNo, 
      Amount, InsuranceCom, MnthlyInstallAmt, TotalPaid, MnthlyInstallDate 
      from Tbl_Machine where MachineId = @MachineId) AS temp_all" 
1

您也應該檢查@@rowcount,即

返回受上一語句的行數。

所以,你的查詢後,只需添加

IF @@ROWCOUNT =0 
    BEGIN 
    --do something 
    END 

一定要還閱讀@@ROWCOUNT (Transact-SQL)