2016-09-22 6 views
3

Ich habe eine Select-Abfrage in einer Variablen deklariert. Jetzt möchte ich überprüfen, ob die Abfrage 0 Zeilen zurückgibt, dann muss ich mit anderen Bedingungen gehen. Ich verwende SQL SERVER 2012. Wie überprüfe ich die Variable, wenn sie 0 Zeilen enthält. Mit freundlicher vorschlagenWie zähle ich die Rückgabe ausgewählter Zeilen in 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

Die Variable enthält absolut keine Zeilen lesen. Es ist nur eine Zeichenfolge. Auf der anderen Seite enthält es eine * Menge * von SQL-Injection-Schwachstellen –

Antwort

2

könnten Sie einfach Ihre Anfrage an

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

Es gibt alle Zeilen der Datenübertragung kein Punkt, wenn Sie in der Zählung nur interessiert sind.

Außerdem geben fast alle Datenbankbibliotheken eine Eigenschaft mit der Anzahl der Zeilen zurück, wenn Sie eine Abfrage ausführen. Sie können diese nach der von Ihnen verwendeten Bibliothek durchsuchen.

Mit Blick auf Ihr Update gibt es hier keine Notwendigkeit für dynamische SQL - und die Verwendung wird Ihre Leistung zerstören. Sie müssen lediglich einige bedingte Logik

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

Für T-SQL ist es '@@ ROWCOUNT'. Obwohl das OP das gesamte Problem überdenken sollte - "bedingte" Abfragen sind ein starker Geruch. Gespeicherte Prozeduren, die die eine oder andere Anweisung basierend auf den Ergebnissen der Abfrage ausführen, sind eine andere. B. versuchen, auf der Grundlage von Daten "EINFÜGEN" oder "AKTUALISIEREN" auszuwählen, wenn das Ausführen beider Anweisungen aufgrund von Indizierung und Optimierung schneller wäre –

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

Danke für die Antwort. Gibt es irgendwelche Ideen für die Überprüfung mit den deklarieren Variablen becaues Ich habe 3 bis 4 Bedingung für das Einchecken Where-Klausel. – user6672226

+0

Ich bin mir nicht sicher, ob ich deine Anforderung vollständig verstanden habe. Kannst du bitte die Frage aktualisieren, was von allen Antworten hier behindert wurde? – TheGameiswar

+0

@TheGameiswar Er sagte, dass seine Select-Anweisung in einer Variable ist, ich nehme an, dass er die Ergebnisse zählen will diese Variable, wenn es ausgeführt wird - z 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

Sie auch @@rowcount überprüfen sollten, dass

die Anzahl der Zeilen von der letzten Anweisung betroffen zurück.

Also, nach Ihrer Anfrage fügen Sie einfach

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

Achten Sie darauf, auch @@ROWCOUNT (Transact-SQL)

Verwandte Themen