查詢結果的動態排序 4

2021-04-17 04:19:56 字數 1374 閱讀 5899

四、動態執行

使用動態執行技術,我們能夠更輕鬆地編寫出getsortedshippers儲存過程。使用這種方法時,我們只需動態地構造出select語句,然後用exec()命令執行這個select語句。假設傳遞給儲存過程的引數是列的名字,儲存過程可以大大縮短:

alterprocgetsortedshippers

@colnameassysname

a***ec('select*fromshippersorderby'+

@colname)

在2000和7.0中,你可以用系統儲存過程sp_executesql替代exec()命令。bol說明了使用sp_executesql比使用exec()命令更有利的地方。一般地,如果滿足以下三個條件,你能夠在不授予儲存過程所涉及物件許可權的情況下,授予執行儲存過程的許可權:首先,只使用datamanipulationlanguage(dml)語言(即select,insert,update,delete);其次,所有被引用的物件都有與儲存過程同樣的所有者;第三,沒有使用動態命令。

上面的儲存過程不能滿足第三個條件。在這種情況下,你必須為所有需要使用儲存過程的使用者和組顯式地授予shippers表的select許可權。如果這一點可以接受的話,一切不存在問題。

類似地,你可以修改儲存過程,使它接受乙個列號引數,如listing8所示。

【listing8:用列號作為引數,動態執行(**較長的方法)】

alterprocgetsortedshippers

@colnumberasint

asdeclare@cmdasvarchar(8000)

set@cmd='select*fromshippersorderby'+

case@colnumber

when1then'shipperid'

when2then'companyname'

when3then'phone'

else'null'

endexec(@cmd)

注意,當你使用了函式時,你應該在乙個變數而不是exec()命令內構造select語句。此時,case表示式動態地確定使用哪乙個列。還有一種更簡短的格式,t-sql允許在orderby子句中指定select清單中列的位置,如listing9所示。這種格式遵從了sql-92標準,但ansisql-99標準不支援這種格式,所以最好不要使用這種格式。

【listing9:列號作為引數,動態執行(**較短的方法)】

alterprocgetsortedshippers

@colnumberasint

asdeclare@cmdasvarchar(8000)

set@cmd='select*fromshippersorderby'+cast(@colnumberasvarchar(4))

exec(@cmd)

資料庫查詢結果的動態排序 4

假設我們把更多的貨主加入到表,如listing 4所示 shipperid列有identity屬性,sql server自動為該列生成值 listing 4 向shippers表插入一些記錄 insert into shippers values shipper4 111 222 9999 inse...

MYSQL 動態查詢結果

今天遇到乙個需求需要把這樣的 轉化為這樣的 第一張圖是從臨時表來的,也就是第二個圖的列名是不固定的,如果列名是固定的就是乙個簡單的行轉列,但是現在列名不固定,我們必須使用動態的行轉列,完成這個裝換我們需要使用兩個知識點 1.使用動態語句執行sql set sql concat create temp...

pymysql動態查詢結果

如果程式需要檢查資料庫中的某個動態的資料,只有當這個資料滿足條件時才會繼續執行 比如需要實現的功能如下 def check status status 資料庫查詢結果 初始化當前的status值 while status 條件 status 資料庫查詢結果 如果不滿足條件則持續獲取該結果 sleep...