2016-07-07 5 views
2

mir eine gespeicherte Prozedur in T-SQL Schreiben aus der folgenden Tabelle Datensätze auszuwählen:Nullwerte Passing während zwischen Abfrage in einer mit

CREATE TABLE [dbo].[PHM_News_Entry] 
(
    [NewsID] [int] IDENTITY(1,1) NOT NULL, 
    [NewsTitle] [varchar](200) NULL, 
    [NewsDate] [datetime] NULL, 
    [NewsDescription] [nvarchar](max) NULL, 
    [NewsDateEntry] [datetime] NULL, 
    [NewAuthor] [varchar](200) NULL, 
    [NewModificationDate] [datetime] NULL, 
    [NewModifiedBy] [varchar](100) NULL, 
    [Status] [varchar](50) NULL, 
    [NewsAttatchmentPath] [nvarchar](max) NULL, 
    [NewsImagePath] [nvarchar](max) NULL, 
) 

Die gespeicherte Prozedur wird wie folgt dar:

CREATE PROCEDURE Select_News 
    @NewsTitle VARCHAR(200), 
    @FromDate DATE, 
    @ToDate DATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT * 
    FROM PHM_News_Entry 
    WHERE (NewsTitle LIKE '%'[email protected]+'%' OR @NewsTitle IS NULL) 
     AND NewsDate BETWEEN @FromDate AND @ToDate OR NewsDate IS NULL 
END 

Die Parameter viz., @NewsTitle, @FromDate und @ToDate können entweder Werte haben oder NULL sein. Wenn alle 3 Parameter oder NULL sind, sollte kein Datensatz ausgewählt sein, aber wenn einer von ihnen einen Nicht-Null-Wert hat, sollte er einen oder mehrere übereinstimmende Datensätze auswählen.

Wenn ich NULL an alle 3 Parameter übergebe, funktioniert es wie erwartet, d. H. Wählt keine Datensätze aus, aber funktioniert nicht anders, d. H. Wenn einer von ihnen einen oder zwei von null verschiedene Werte hat.

Bitte helfen Sie mir, die richtige Abfrage für diesen Fall zu schreiben.

Danke und Gruß,

Shyam Singh

+0

Welches Verhalten möchten Sie tun, wenn zum Beispiel '@ FromDate'' NULL' sein, aber die anderen beiden nicht 'NULL' sein? –

+0

Es sollte alle Datensätze bis zum ToDate passend zum NewsTitel auswählen. –

Antwort

0

Versuchen Sie, diese select Abfrage

SELECT * 
FROM phm_news_entry 
WHERE (newstitle LIKE '%' + @NewsTitle + '%' 
      OR @NewsTitle IS NULL) 
     AND (newsdate BETWEEN @FromDate AND @ToDate 
       OR @FromDate IS NULL 
       OR @ToDate IS NULL) 
     AND (@NewsTitle IS NOT NULL 
       OR @FromDate IS NOT NULL 
       OR @ToDate IS NOT NULL) 
+0

Nein, es funktioniert nicht. –

+0

@ShyamSingh - Können Sie Beispieldaten und erwartetes Ergebnis hinzufügen –

+0

Hier ist der SQL-Skript die Tabelle mit Daten zu erstellen: https://gist.github.com/anonymous/73a4c53abb44930b2582fa4ba63ddd3e Für erwartetes Ergebnis, wenn ich die Prozedur ausführen mit '@ FromDate' als' NULL', '@ NewsTitle' als' NULL' und '@ ToDate' als' '6/29/2016'' sollte es nur einen Datensatz anzeigen. –

-1

wenn man von params null ist - ganze Operator ist null - if SomeThing between @d1 and NULL = null und nul or @d = null Verwendung isnull Funktion

FROM PHM_News_Entry 
WHERE NewsDate BETWEEN isnull(@FromDate, '01-01-1753') AND isnull(@ToDate, '01-01-1753') OR NewsDate IS NULL 
0

Verwenden Sie diese WHERE Klausel:

WHERE (NewsTitle LIKE '%'[email protected]+'%' OR @NewsTitle IS NULL) AND 
     (NewsDate BETWEEN COALESCE(@FromDate, CAST('1753-01-01' AS DATE)) AND 
         COALESCE(@ToDate, CAST('9999-12-31' AS DATE)) OR NewsDate IS NULL) 

Erläuterung:

COALESCE(@FromDate, CAST('1753-01-01' AS DATE)) 

Dies wird den Wert von @FromDate, wenn es nicht NULL sein verwenden, oder es wird die kleinstmögliche Datum in SQL Server verwenden, wenn es ist NULL. Wenn also @FromDateNULL ist, dann würde dieser Ausdruck alle Daten zulassen, die älter sind als @ToDate. Eine ähnliche Logik gilt für den anderen Ausdruck COALESCE.

+0

Ich habe versucht, die Prozedur ausgeführt wird, nachdem es mit der WHERE-Klausel von Ihnen wie folgt zu ändern und es wählt alle Datensätze, die unerwartet ist: 'ERKLÄREN \t @return_value int EXEC \t @return_value = [dbo].[Select_News] \t \t @NewsTitle = NULL, \t \t @FromDate = NULL, \t \t @ToDate = '2016.06.29' SELECT \t 'Rückgabewert' = @ return_value' Für diese Ausführung es sollte nur Datensätze bis zum 2016-06-29 auswählen und nicht darüber hinaus. –

+0

Die Abfrage sollte keine Datensätze außerhalb des '@ ToDate's zurückgeben. Ich habe Klammern in die 'WHERE'-Klausel eingefügt, vielleicht ist die Logik, die ausgeführt wird, nicht das, was Sie denken. –

+0

Ausführen der folgende Code gibt keine Aufzeichnungen jetzt: 'ERKLÄREN \t @return_value int EXEC \t @return_value = [dbo] [Select_News] \t \t @NewsTitle = NULL, \t \t @FromDate = NULL, \t \t. @ToDate = '6/29/2016' SELECT \t 'Rückgabewert' = @ return_value' –

0

Hoffe, dass es für Sie arbeitet,

SELECT *, 
FROM PHM_News_Entry 
WHERE (NewsTitle LIKE '%'[email protected]+'%' 
     OR @NewsTitle IS NULL) 
    AND (NewsDate BETWEEN COALESCE(@FromDate, CAST(NewsDate AS DATE)) AND COALESCE(@ToDate, CAST(NewsDate AS DATE))) 
    OR (@NewsTitle IS NULL 
     AND @FromDate IS NULL 
     AND @ToDate IS NULL) END 
Verwandte Themen