1

我想通過使用下面的查詢,如將參數傳遞給存儲過程與排序方向和按作爲輸入列參數如何處理空值,當我們在sql服務器中排序

ALTER PROCEDURE [dbo].[tp_SelectTransactionHistorySearch] 
(
    @OffSetRowNo INT,  
    @FetchRowNo INT, 
    @StatusSelection NVARCHAR(MAX), 
    @IsReviewed Bit, 
    @ProjectCaseNumber VARCHAR(MAX), 
    @CostPageNumber VARCHAR(MAX), 
    @TransactionTypeChange VARCHAR(MAX), 
    @DescriptionChange VARCHAR(MAX), 
    @TrasactionCreateOnBeginDate DATE, 
    @TransactionCreatedOnEndDate DATE, 
    @TransactionUpdatedOnBeginDate DATE, 
    @TransactionUpdateOnEndDate DATE, 
    @ItemID VARCHAR(MAX), 
    @SortOrder VARCHAR(MAX), 
    @SortByColumnName VARCHAR(MAX) 
) 
AS 

    SELECT 
     TransactionID,IsReviewed,ItemID,CostPageNumber,Comments, 
     CreatedBy,CreatedDateTime,UpdatedBy,UpdatedDateTime, 
     TransactionDescription,TransactionTypeID,PROJCASE, 
     TransactionStatusID, TransactionStatusTypeName, 
     TransactionStatusTypeDescription,  
     TransactionTypeName, TransactionTypeDescription, 
     COUNT(*) OVER() as TotalCount 
FROM 
(//select 
    // union 
    // select 
    // union 
    //like select statement from union results 
) ResultSet 
     //here i am doing sorting 
    ORDER BY 
CASE @SortOrder 
    WHEN 'ASC' THEN 
     CASE @SortByColumnName 
     WHEN 'TransactionID' THEN CONVERT(VARCHAR(MAX), ResultSet.TransactionID) 
     WHEN 'ItemID' THEN CONVERT(VARCHAR(MAX), ResultSet.ItemID) 
     WHEN 'CostPageNumber' THEN ResultSet.CostPageNumber 
     WHEN 'Comments' THEN ResultSet.Comments 
     WHEN 'CreatedBy' THEN ResultSet.CreatedBy 
     WHEN 'CreatedDateTime' THEN CONVERT(VARCHAR(MAX), ResultSet.CreatedDateTime) 
     WHEN 'UpdatedBy' THEN ResultSet.UpdatedBy 
     WHEN 'UpdatedDateTime' THEN CONVERT(VARCHAR(MAX), ResultSet.UpdatedDateTime) 
     WHEN 'TransactionDescription' THEN ResultSet.TransactionDescription 
     WHEN 'TransactionTypeName' THEN ResultSet.TransactionTypeName 
     WHEN 'PROJCASE' THEN ResultSet.PROJCASE 
     WHEN 'TransactionStatusTypeName' THEN ResultSet.TransactionStatusTypeName 
     WHEN 'TransactionStatusTypeDescription' THEN ResultSet.TransactionStatusTypeDescription 
     END 
    END 
    ASC, 
CASE @SortOrder 
    WHEN 'DESC' THEN    
     CASE @SortByColumnName 
     WHEN 'TransactionID' THEN CONVERT(VARCHAR(MAX), ResultSet.TransactionID) 
     WHEN 'ItemID' THEN CONVERT(VARCHAR(MAX), ResultSet.ItemID) 
     WHEN 'CostPageNumber' THEN ResultSet.CostPageNumber 
     WHEN 'Comments' THEN ResultSet.Comments 
     WHEN 'CreatedBy' THEN ResultSet.CreatedBy 
     WHEN 'CreatedDateTime' THEN CONVERT(VARCHAR(MAX), ResultSet.CreatedDateTime) 
     WHEN 'UpdatedBy' THEN ResultSet.UpdatedBy 
     WHEN 'UpdatedDateTime' THEN CONVERT(VARCHAR(MAX), ResultSet.UpdatedDateTime) 
     WHEN 'TransactionDescription' THEN ResultSet.TransactionDescription 
     WHEN 'TransactionTypeName' THEN ResultSet.TransactionTypeName 
     WHEN 'PROJCASE' THEN ResultSet.PROJCASE 
     WHEN 'TransactionStatusTypeName' THEN ResultSet.TransactionStatusTypeName 
     WHEN 'TransactionStatusTypeDescription' THEN ResultSet.TransactionStatusTypeDescription 
     END 
END 
OFFSET (@OffSetRowNo-1) * @FetchRowNo ROWS 
    FETCH NEXT @FetchRowNo ROWS ONLY 

這裏不使用任何的OrderBy(排序方法)我得到two rows因爲即使他們是在列空值的結果,但與排序(即)排序依據,我能夠得到的只有一個行作爲結果 ,我不知道如何處理空值時使用順序,但我已經嘗試以下語句

WHEN ColumnB IS NULL THEN 1 ELSE 0 END ASC, 

但是當應用此一個我得到的語法錯誤.... 將任何請提出任何想法如何時爲了使其在這種情況下.. 我使用SQL Server 2012版來處理空值

非常感謝在提前....

回答

1

下面給出了動態排序順序和排序字段的簡化方案。

--TEST DATA 
DECLARE @MYTable TABLE (EmpID INT, EmpName VARCHAR(10) , JoinDate DATETIME) 

INSERT INTO @MYTable VALUES (1,'E1','1/1/2001'); 
INSERT INTO @MYTable VALUES (2,'E2','2/2/2002'); 
INSERT INTO @MYTable VALUES (3,'E3','5/5/2001'); 

--INPUT Parameters 
DECLARE @SortParam VARCHAR(MAX) 
SET @SortParam = 'JoinDate' 

DECLARE @SortDirection VARCHAR(MAX) 
SET @SortDirection = 'DESC' 


[email protected] Variable 
DECLARE @RankTypeID INT 

--EMPNAME 
IF (@SortParam = 'EmpName' AND @SortDirection = 'ASC') 
BEGIN 
    SET @RankTypeID = 1 
END 

IF (@SortParam = 'EmpName' AND @SortDirection = 'DESC') 
BEGIN 
    SET @RankTypeID = -1  
END 

--EmpID 
IF (@SortParam = 'EmpID' AND @SortDirection = 'ASC') 
BEGIN 
    SET @RankTypeID = 2 
END 

IF (@SortParam = 'EmpID' AND @SortDirection = 'DESC') 
BEGIN 
    SET @RankTypeID = -2 
END 

--JoinDate 
IF (@SortParam = 'JoinDate' AND @SortDirection = 'ASC') 
BEGIN 
    SET @RankTypeID = 3 
END 

IF (@SortParam = 'JoinDate' AND @SortDirection = 'DESC') 
BEGIN 
    SET @RankTypeID = -3 
END 


-- SELECT 
SELECT * 
FROM @MYTable M 
ORDER BY 
     CASE @RankTypeID WHEN 1 then EmpName ELSE null end ASC, 
     CASE @RankTypeID WHEN -1 then EmpName ELSE null end DESC, 

     CASE @RankTypeID WHEN 2 then [EmpID] else null end ASC , 
     CASE @RankTypeID WHEN -2 then [EmpID] else null end DESC , 

     CASE @RankTypeID WHEN 3 then JoinDate else null end ASC, 
     CASE @RankTypeID WHEN -3 then JoinDate else null end DESC 


--END 
+1

很多感謝它的完美工作...... –

1

您是否嘗試過使用內建ISNULL()功能?

ISNULL(ColumnB, 1)