2016-08-10 1 views
1

ich möchte Suchbegriff Abfrage akzeptieren Parameter von asp.net Web-AnwendungSQL wo mit zwischen Klausel über col Typ Datum

wenn @firstName richtig mit zwischen Klausel

create proc test 
    @From Datetime, 
    @to Datetime, 
    @firstName varchar(50) 
    as 
    begin 
    select * from Employee 
    where Empfname=(case when @firstName != '' then @firstName else Empfname end) 
    and 1=(case when @From != null and @From != '' and @to != null and @to != '' 
    then EmpJoinDate between @From and @to else 1 end) end 
+0

Verwenden Sie nicht 'case' in der where-Klausel, wechseln Sie stattdessen zu' and'/'or'. (Etwas wie 'where (@firstName = '' oder @firstName = Empfname) ....) – jarlh

Antwort

1

Erstens, ich möchte Sie ermutigen, bei der Verwendung von „Platzhalter“ in Einklang zu stehen. Ihr Code scheint leere Zeichenfolgen zu verwechseln und NULL. Verwenden Sie einfach die Konvention, dass ein NULL Wert bedeutet, dass alles erlaubt ist.

Dann entfernen Sie die case aus der where Klausel und explizit die Logik auflisten. Hier ist eine Methode:

create proc test (
    @From Datetime, 
    @to Datetime, 
    @firstName varchar(50) 
) as 
begin 
    select e.* 
    from Employee e 
    where (Empfname = @firstName or @firstname is null) and 
      ((@from is null and @to is null) or 
      (@from is null and EmpJoinDate <= @to) or 
      (@to is null and EmpJoinDate >= @from) or 
      (EmpJoinDate >= @from and EmpJoinDate <= @to) 
     ); 
end; 

Dann sollten Sie die Notwendigkeit für eine gespeicherte Prozedur erneut besuchen. Was Sie haben, ist wirklich besser geeignet für eine Tabellenwertfunktion.

0
aber nicht funktioniert Suche machen

Ersetzen Sie fallbasierte Vergleiche. Statt

Empfname=(case when @firstName != '' then @firstName else Empfname end) 

Schreib

(@firstName='' OR [email protected]) 

statt

1=(case when @From != null ... 

Schreib

(@From='' OR @To='' OR EmpJoinDate BETWEEN convert(datetime, @From) 
AND convert(datetime, @To)) 

Hinweis: Wenn Sie mit NULL va Lues für Ihre Parameter anstelle von leeren Strings '', gelten nicht = und != Operatoren zu ihnen, weil sie nicht funktionieren. Verwenden Sie stattdessen die Operatoren IS NULL und IS NOT NULL.

+0

Abfrage gibt nicht alle Datensätze zurück, wenn Parameter leer sind – user2561115

+0

@ user2561115 Übergeben Sie leere Zeichenfolgen oder' NULL's? – dasblinkenlight

+0

dasblinkenlight ich bin Null übergeben – user2561115

0

Meine Syntax stimmt nicht genau, da ich die Zieldatenbank nicht kenne. Im Allgemeinen würde ich die Argumente auf nicht null (erforderlich) ändern, auf eine oder mehrere leere Zeichenfolgen testen, wobei, wenn dies der Fall ist, dann das parametrisierte SQL ausgeführt wird.

create proc test 
    @From Datetime not null, 
    @to Datetime not null, 
    @firstName varchar(50) not null 
    as 
    begin 
     If @From != '' or @To != '' or @FirstName != '' 
      select * from Employee 
      where Empfname= @firstName 
      and EmpJoinDate between @From and @to 
     end if 
    end 
+0

Danke für die Antwort. Die Zieldatenbank wird als Tag in der Frage veröffentlicht. – lrnzcig

+0

So ist es .... neu dazu, also danke für die Hinweise. – JBizz

0

versuchen Ihr Verfahren auf diese eine Fixierung:

-- test '20160101','20160810', 'z' 
alter proc test 
    @From Datetime, 
    @to Datetime, 
    @firstName varchar(50) 

as 
DECLARE @DateCondition varchar(100), 
     @FNameCondition VARCHAR(200), 
     @SQLStr VARCHAR(2000) 

begin 
    IF @From <> '' AND @To <> '' 
     SET @DateCondition = ' EmpJoinDate between ''' + CONVERT(VARCHAR(20),@From) + ''' and ''' + CONVERT(VARCHAR(20),@To) + '''' 

    IF @firstName != '' 
     SET @FNameCondition = '''' + @firstName + '''' 
    ELSE 
     SET @FNameCondition = ' Empfname ' 

    SET @SQLStr = '  
    select * from Employee 
    where Empfname= ' + @FNameCondition + ' 
    and ' + @DateCondition 

    PRINT (@SQLStr) 
    EXEC (@SQLStr) 

END 
Go 
+0

Die Verwendung von dynamischem SQL ist ein cleverer Ansatz. Es ist jedoch unverantwortlich, eine solche Lösung vorzuschlagen, indem die Parameter direkt in die Abfragezeichenfolge eingegeben werden, da der Code dadurch Syntaxfehlern und SQL-Injection-Angriffen ausgesetzt ist. Der richtige Ansatz verwendet Parameter und 'sp_executesql'. –

+0

Ich dachte, ich habe es als eine Prozedur gemacht, die externe Parameter akzeptiert – Zeina

Verwandte Themen