2016-06-20 10 views
0

私はiPhone APPを今日リリースしました。アプリのデータはデータベースから取得しています。テスト中に、テーブルからテーブル3までの4つのテーブルを持つDatasetを返すSPの1つに気付きました。表3では、クライアントによってはWHEREのクラウスによっては時間がありません。アプリの中で私はそれが存在すると仮定しているので、私が得ている結果は配列の辞書のためです。私はObjectATIndexを直接チェックしています。テーブルが条件を返さず、アプリケーションがクラッシュしたとき。StoredProcedureから行が存在しない場合は、デフォルト値でテーブルを取得します

アプリが今日リリースされて以来、私は今のところコードを変更できません。 テーブルの中にいくつかのデフォルト値を送ることはできますか?

テーブルのための私のクエリは、クエリの上

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 

で任意の行を返しませんが、私のアプリの内部で、私は(私はテーブルが存在すると仮定)テーブルをチェックしています、私ができるどのような方法があるとし行 が存在するかどうかを確認してから、EmpNameに空の値を送信してください。少なくともアプリケーションはCrachを実行しません.....

+0

肯定的な側面では、修正することができますが、完全なSPを投稿してください、あなたの説明に従うことは難しいと思います。あなたはレコードセットとテーブルと用語を混ぜているかもしれません。 – Alex

+0

使用しているSQL Serverのバージョンは? – Alex

+0

私は質問を編集しました。 – user2813740

答えて

2

これは全体的に良い解決策だとは思いません。あなたが立ち往生しているのを見て、これはあなたのために働くかもしれません。

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) 

クエリは次のようになります。

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

これは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) 

上記のコードは、あなたの元のクエリの周りCTEを置きます。 UNION ALLの後の部分は、CTEによってレコードが返されない場合、条件付きで「ダミー」行を追加します。

別の方法:

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

私は任意のテーブルを作成していないが、ジョー・Cが存在する場合は、私が使用していると述べました。

簡単な方法:

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 

は、クイックヘルプのためにあなたにジョー・Cをありがとうございます。

+0

彼の質問の横にジョーCの回答を受け入れているとマークしてください(大きな「チックシンボル」) – Alex

関連する問題