2016-05-13 10 views
0

leer ist, ich habe die folgende SQL-AbfrageWie eine Zeile zu schreiben, die auf eine Tabelle Variable

Declare @EIDDetail Table 
(inc_synopsis varchar(5000),EmployeeName varChar(50),inc_id int, acc_id int 
,acc_eid int, inc_event_Number Varchar(12), inc_date_occurred_startdate,acc_afg_id int, 
inc_time_occurred_start varchar(8),inc_date_recvd date,inc_date_closed date,inc_is_uof bit, 
InvestigatorName VarChar(42),inc_is_comp_via_sup bit, 
inc_is_comp_via_psdbit, inc_is_admin_review bit 
, inc_comp_is_inquiry bit, inc_comp_is_invest bit, div_name VarChar(50), inc_comp_is_referral bit) 

INSERT INTO @EIDDetail SELECT b.inc_synopsis, a.EmployeeName As AccusedName, b.inc_id, a.acc_id, a.acc_eid, 
b.inc_event_number, b.inc_date_occurred_start, a.acc_afg_id,  b.inc_time_occurred_start, b.inc_date_recvd, b.inc_date_closed, b.inc_is_uof, 
c.InvestigatorName, b.inc_is_comp_via_sup, b.inc_is_comp_via_psd,b.inc_is_admin_review,b.inc_comp_is_inquiry,b.inc_comp_is_invest, d.div_name, 
b.inc_comp_is_referral 
FROM dbo.VW_ACCUSED_DISCIPLINABLE_CHARGE AS a INNER JOIN 
dbo.Tbl_Incident AS b ON a.acc_inc_id = b.inc_id LEFT OUTER JOIN 
dbo.VW_INCIDENT_INVESTIGATOR AS c ON b.inc_id = c.inc_id LEFT OUTER JOIN 
dbo.Tbl_Division AS d ON b.inc_inv_div_id = d.div_id 
WHERE 
a.acc_eid IN (435,35) And (b.inc_comp_is_inquiry = 'False') AND (b.inc_deleted = 'False') OR 
a.acc_eid IN (435,35) And(b.inc_deleted = 'False') AND (b.inc_comp_is_invest = 'False') OR 
a.acc_eid IN (435,35) And(b.inc_deleted = 'False') AND (b.inc_comp_is_referral = 'False') OR 
a.acc_eid IN (435,35) And(b.inc_deleted = 'False') AND (b.inc_is_uof = 'True') 

select * from @EIDDetail 

Dies funktioniert in Ordnung, bis ich einen Parameter haben, die keine Datensätze hat. Wenn das passiert, muss ich den durch den Parameter identifizierten Mitarbeiter einbeziehen und im Datensatz den Namen des Mitarbeiters und "Keine Datensätze gefunden" in meinem Synopsenfeld anzeigen.

Ich kann das anscheinend nicht herausfinden. Ich habe es versucht die ISNULL-Funktion wie diese

SELECT ISNULL((SELECT My code above)), (new select here)) 

Aber das gibt mir eine Fehlermeldung „Nur ein Ausdruck in der Auswahlliste angegeben werden kann, wenn die Unterabfrage nicht mit EXISTS eingeführt wird.“

Bin ich in der richtigen Position Richtung mit der ISNUll-Funktion oder gibt es eine andere Möglichkeit, dies

zu erreichen
+0

Vielleicht können Sie klären - ist dies eine Suche, wo Sie möchten, dass ein Mitarbeiter einen Datensatz zurückgibt, aber füllen nur die Felder als EmployeeName, wenn Datensätze gefunden werden? –

+0

Lassen Sie mich versuchen, die Situation zu klären. Ich habe eine Liste von Mitarbeiter-ID-Nummern über 1.400 in dieser Liste. Ich habe einen Bericht erstellt, der einen Parameter mit mehreren Werten verwendet, der einige Informationen zu den Mitarbeitern in meiner ID-Liste enthält. Der Repot wählt alle diese ID-Nummern aus, wenn er ausgeführt wird. Nicht alle Mitarbeiter in der Mitarbeiter-ID-Liste verfügen über Daten, über die berichtet werden kann. Ich muss diese Mitarbeiter ohne Daten in meinen Bericht aufnehmen. Es wurde der Name des Mitarbeiters angezeigt und keine Einträge angezeigt. Also ISNULL wird nicht funktionieren, @@ RowCount wird nicht funktionieren und ich habe gerade versucht, wenn EXISTEN keine funktionieren – Perry

Antwort

1

Ich würde so etwas wie:

DECLARE @EIDDetail Table <etc> 

INSERT INTO @EIDDetail 
SELECT <etc> 

IF @@rowcount = 0 
    INSERT INTO @EIDDetail 
    SELECT <query designed for "no data available" parameters> 

Nur weil es möglich ist, alles in einer einzigen Abfrage jammen (etwas, was ich von mir selbst schuldig bin) macht es nicht eine gute Idee.

+0

Danke für Ihren Vorschlag, aber das funktioniert nicht scheint, da der Parameter in diesem Fall 2 Datensätze hat, von denen einer Daten und einen hat das ist nicht der @@ RowCount wird größer als 0. – Perry

+0

Überprüfen Sie Ihre Abfrage näher: versuchen Sie, den inneren Join auf 'dbo.Tbl_Incident' zu einem linken äußeren Join zu drehen, an dem Punkt isnelling alle Spalten aus dieser Tabelle tun sollten, was Sie wollen . Außerdem verwechselt mich Ihre where-Klausel, sollten Klammern um die Sätze von 'und' -Klauseln bestehen, die durch diese drei 'oder' getrennt sind? –

0

Wenn Sie den ISNULL-Ausdruck verwenden möchten, müssen Sie ihn für dieses bestimmte Feld verwenden (keine ganze SELECT-Anweisung). Also, Sie so etwas wie haben könnte:

SELECT ISNULL(field1, "Empty") AS field1, ISNULL(field2, "Empty") AS field 2 
FROM TableName 

Die oben geht davon aus, dass Field1 und Feld2 String-Typen sind (zum Beispiel Varchar).

0

Die Ausgabe der Abfrage dann links sein sollte beitreten oder äußere Anwendung, wenn Ihre primäre Tabelle die Liste der IDs, die Sie in (entweder in flex-Parameter oder eine Tabelle mit variabler Form) übergeben, so:

SELECT IDs.ID, ISNULL(Records.A, "No Data Available")[, ...n] 
FROM @TableOfIDs IDs 
    OUTER APPLY (
     <query returning results you are interested in> 
     WHERE IDs.ID = InnerIDTable.ID 
    ) Records 

Richten Sie dann auf der Berichtsseite Ihre Ausgaben als Reaktion auf das erste Auftreten von "Keine Daten verfügbar" ein, damit die Ausgabe neu formatiert wird. Wie oben erwähnt, stellen Sie sicher, dass Ihre Ausgabe von ISNULL vom Typ der Spalte ist, die Sie auswählen.

Verwandte Themen