2016-06-20 4 views
0

Ich habe iPhone APP, die heute veröffentlicht wurde. Daten für die App stammen aus der Datenbank. Während des Testens fiel mir auf, dass einer der SPs Datensatz mit 4 Tabellen von Tabelle zu Tabelle3 zurückgibt. Tabelle3 einige Zeit existiert nicht in Abhängigkeit von der WHERE Claus für einige der Client. Innerhalb der App habe ich angenommen, dass es vorhanden ist, so dass Ergebnis ist in der für das Wörterbuch der Array. Ich suche direkt nach ObjectATIndex. Wenn die Tabelle nicht zurückkehrt, scheitert die Bedingung und die App stürzt ab.get Tabelle mit Standardwerten, wenn keine Zeile von StoredProcedure

Da App heute selbst veröffentlicht wurde, kann ich den Code ab sofort nicht ändern. Kann ich einige Standardwerte innerhalb der Tabelle senden.

meine Abfrage für die Tabelle

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- =============================================    
-- Author: <Author,,Name>    
-- ALTER date: <ALTER Date,,>    
-- Description: <Description,,>    
-- =============================================    
ALTER PROCEDURE [dbo].[_spGetEmpList]     
@strComCode as varchar(50), 
@iDepID as INT, 
@strType AS varchar(20) 

AS    
BEGIN    
DECLARE @bNameOrder as bit 

SET NOCOUNT ON; 
SELECT @bNameOrder = dbo.svnGetSetupOption(@iDepID, 
              'LastNamePreceedsFirstName', 
              @strComCode) 
IF (@bNameOrder IS NULL) 
    SET @bNameOrder = 0 

IF(@strType = 'Emp') 
BEGIN 

    --0**************************************    
    SELECT EmpID AS ResourceID, EmpNumber   
    FROM Emuloyeetbl 
     WHERE Emuloyeetbl.IsActive = 1 AND DepID = @iDepID 
    ORDER BY EmpFName 

    --1************************************** 
    SELECT DepartmentName 
    FROM tblDepartment 
    WHERE IsActive = 1 

    --2************************************** 
    SELECT OptionValue AS EmpRole 
    FROM EmpRole 
    WHERE OptionName = 'EmployeeRole' AND DepID = @iDepID AND IsActive = 1 

    --3************************************** 

    Select EmployeeFirstName + ' '+EmplouyeeLastName as EmpName 
    from EmpTable 
    Where DepID = @iDepID AND EmpSalary < 10 
END   

END 

Above Abfrage zurückgeben keine Zeilen ist Angenommen, aber in meiner app, die ich für Tisch bin Überprüfung (angenommen I Tabelle vorhanden sein wird), ist es eine Möglichkeit, ich kann Überprüfen Sie, ob Zeile vorhanden ist oder nicht, wenn nicht, dann senden Sie einen leeren Wert für EmpName, mindestens App wird nicht Crach .....

+0

Auf der positiven Seite, ich denke, es kann behoben werden, aber bitte posten volle SP, Ihre Beschreibung ist schwer zu folgen. Möglicherweise verwechseln Sie Terminologie mit Recordset und Tabelle. – Alex

+0

Welche Version von SQL Server verwenden Sie? – Alex

+0

Ich habe Frage bearbeitet. – user2813740

Antwort

2

Ich denke nicht, dass dies eine gute Lösung insgesamt ist. Wenn du feststellst, dass du feststeckst, wird das vielleicht für dich funktionieren.

Create Table #EmpTable (EmployeeFirstName Varchar(8000), EmployeeLastName Varchar(8000), EmpSalary Decimal(15,2)) 
    Insert #EmpTable Values ('Jill', 'Jacobs', 20000) 
    Insert #EmpTable Values ('Joe', 'Johnson', 60000) 

Die Abfrage sieht wie folgt aus:

If Exists(Select null from #EmpTable Where EmpSalary < @Filter) 
     Select EmployeeFirstName + ' '+EmployeeLastName as EmpName from #EmpTable Where EmpSalary < @Filter 
     Else 
     Select '' as EmpName 


-- If looking for less than 10 a blank row is returned.  
    Declare @Filter Decimal = 10 
    If Exists(Select null from #EmpTable Where EmpSalary < @Filter) 
    Select EmployeeFirstName + ' '+EmployeeLastName as EmpName from #EmpTable Where EmpSalary < @Filter 
    Else 
    Select '' as EmpName 

-- This returns the record for Jill Jacobs  
    Declare @Filter Decimal = 30000 
    If Exists(Select null from #EmpTable Where EmpSalary < @Filter) 
    Select EmployeeFirstName + ' '+EmployeeLastName as EmpName from #EmpTable Where EmpSalary < @Filter 
    Else 
    Select '' as EmpName 
0

Dies ist eine alternative Antwort mit CTE:

CREATE TABLE EmpTable(EmployeeFirstName VARCHAR(10), EmplouyeeLastName VARCHAR(10), EmpSalary INT) 
INSERT INTO EmpTable 
VALUES 
('John', 'Smith', 9), 
('Bob', 'Smith', 11) 

DECLARE @MaxSalary INT 
SET @MaxSalary = 7 

;WITH EmpTable2 (EmpName) 
AS 
(
    SELECT EmployeeFirstName + ' '+EmplouyeeLastName as EmpName 
    FROM EmpTable 
    WHERE EmpSalary < @MaxSalary 
) 
SELECT * 
FROM EmpTable2 
/* Add Dummy row when no records have been returned by CTE */ 
UNION ALL 
SELECT 'None' AS EmpName 
WHERE NOT EXISTS(SELECT * FROM EmpTable2) 

Der obige Code einen CTE um Ihre ursprüngliche Abfrage setzt. Der Teil, der auf UNION ALL folgt, fügt bedingt eine Zeile "Dummy" hinzu, wenn keine Datensätze von CTE zurückgegeben wurden.

Ein anderer Weg:

SELECT EmpName 
FROM 
    (SELECT EmpName, COUNT(*) OVER() AS Cnt 
    FROM 
     (SELECT EmployeeFirstName + ' ' + EmplouyeeLastName AS EmpName 
     FROM EmpTable 
     WHERE EmpSalary < @MaxSalary 
     UNION ALL 
     SELECT 'None' AS EmpName 
     ) AS a 
    ) AS b 
WHERE (Cnt > 1 AND EmpName != 'None') OR Cnt = 1 
0

Ich habe keine Tabelle erstellt, sondern als Joe C i verwendet haben erwähnt, wenn vorhanden.

einfache Art und Weise:

IF EXISTS(Select EmployeeFirstName + ' '+EmplouyeeLastName as EmpName 
    from EmpTable 
    Where DepID = @iDepID AND EmpSalary < 10) 
    BEGIN 
     Select EmployeeFirstName + ' '+EmplouyeeLastName as EmpName 
     from EmpTable 
     Where DepID = @iDepID AND EmpSalary < 10 
     ORDER BY EmpName 
    END 
    ELSE 
    BEGIN 
     SELECT '' AS EmpName 
    END 

Danke Joe C für schnelle Hilfe.

+0

Bitte beachten Sie, dass Sie die Antwort von Joe C als akzeptiert markieren (großes "Tick-Symbol") neben seiner Frage – Alex

Verwandte Themen