首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

動態排序查詢結果進階技巧(二):以欄位名稱作為參數與資料類型優先權處理

     編輯:關於SqlServer

方案二:欄位名稱作為參數

修改預存程序接收欄位名稱參數,CASE 運算式決定 ORDER BY 使用哪個欄位:

CREATE PROC GetSortedShippers
    @ColName sysname
AS
SELECT * FROM Shippers
ORDER BY
    CASE @ColName
        WHEN 'ShipperID' THEN ShipperID
        WHEN 'CompanyName' THEN CompanyName
        WHEN 'Phone' THEN Phone
        ELSE NULL
    END;

資料類型優先權陷阱

測試 EXEC GetSortedShippers 'CompanyName' 失敗,錯誤:

Syntax error converting the nvarchar value 'Speedy Express' to a column of data type int.

原因:CASE 運算式回傳型別由最高優先權決定。int (ShipperID) 優先權高於 nvarchar (CompanyName, Phone),導致隱含轉換失敗。

解決方案:統一轉換為字串

將數值欄位轉換為 varchar,使 nvarchar 成為最高優先權:

ALTER PROC GetSortedShippers
    @ColName sysname
AS
SELECT * FROM Shippers
ORDER BY
    CASE @ColName
        WHEN 'ShipperID' THEN CAST(ShipperID AS varchar(11))
        WHEN 'CompanyName' THEN CompanyName
        WHEN 'Phone' THEN Phone
        ELSE NULL
    END;

驗證結果

三個參數皆正確排序。但注意:ShipperID 轉字串後按字典序排序(1, 10, 2...),若需數值序需額外處理(如左補零)。

小結

以欄位名稱參數動態排序靈活,但必須處理 CASE 運算式資料類型優先權問題,統一轉換為相容型別為關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved