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

資料庫查詢結果動態排序(四):動態執行 EXEC/sp_executesql、權限模型與欄位編號簡短寫法

     編輯:關於SqlServer

動態執行技術簡化動態排序

動態構建 SELECT 陳述式,使用 EXEC() 或 sp_executesql 執行:

基本動態排序預存程序
ALTER PROC GetSortedShippers
    @ColName AS SYSNAME
AS
EXEC('SELECT * FROM Shippers ORDER BY ' + @ColName)

sp_executesql 優勢 (SQL 2000/7.0)

BOL 建議優先使用 sp_executesql,優於 EXEC():參數化、計畫重用、安全性較佳。

權限模型關鍵限制

動態 SQL 打破所有權鏈,需額外授權:

  • 條件:僅用 DML、所有物件同擁有者、無動態命令 → 可僅授予 EXEC 權限
  • 動態排序不滿足第三條件 → 必須額外授予 Shippers 表的 SELECT 權限 給所有使用者/角色

欄位編號參數化兩種寫法

Listing 8:CASE 判斷欄位名稱
ALTER PROC GetSortedShippers @ColNumber AS INT
AS
DECLARE @cmd VARCHAR(8000)
SET @cmd = 'SELECT * FROM Shippers ORDER BY ' +
    CASE @ColNumber
        WHEN 1 THEN 'ShipperID'
        WHEN 2 THEN 'CompanyName'
        WHEN 3 THEN 'Phone'
        ELSE 'NULL'
    END
EXEC(@cmd)
Listing 9:直接使用欄位位置 (SQL-92 標準)
ALTER PROC GetSortedShippers @ColNumber AS INT
AS
DECLARE @cmd VARCHAR(8000)
SET @cmd = 'SELECT * FROM Shippers ORDER BY ' + CAST(@ColNumber AS VARCHAR(4))
EXEC(@cmd)
警告: ANSI SQL-99 不支援 ORDER BY 位置編號,最好避免使用 Listing 9 寫法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved