靜態 sql:靜態 sql 語句一般用於嵌入式 sql 應用中,在程式執行前,sql 語句必須是確定的,例如 sql 語句中涉及的列名和表名必須是存在的。靜態 sql 語句的編譯是在應用程式執行前進行的,編譯的結果會儲存在資料庫內部。而後程式執行時,資料庫將直接執行編譯好的 sql 語句,降低執行時的開銷。
動態 sql:動態 sql 語句是在應用程式執行時被編譯和執行的,例如,使用 db2 的互動式工具 clp 訪問資料庫時,使用者輸入的 sql 語句是不確定的,因此 sql 語句只能被動態地編譯。動態 sql 的應用較多,常見的 cli 和 jdbc 應用程式都使用動態 sql。
動態sql的應用場景:
1:普通sql語句可以用exec執行,但沒有意義,反倒效能低下。
2:欄位名,表名,資料庫名之類作為變數時,必須用動態sql
1.使用exec命令,語法:exec sql
exec命令有兩個用途,乙個是用來執行儲存過程,另乙個是執行動態sql
用法1:無引數的exec動態sql
exec ('select field2 from t1')點評:這樣做其實沒有意義,效能低,動態sql最好用在資料庫名,表名,欄位名作為引數的時候的場景。那時必須用動態sql才能執行。
用法2:有引數的動態sql
參見:
2.使用系統儲存過程
語法:exec excutesql 引數1,引數2,引數3
其中引數1是要執行的動態sql語句,引數2是輸入的引數的定義,引數3是輸入的引數的值
declare @intvariable int,@sqlstring nvarchar(500),@parmdefinition nvarchar(500);
set @sqlstring =n'select * from t1 where field2 = @field';--給需要執行的sql賦值
set @parmdefinition = n'@field int';--以字串的形式給第二個引數賦值
et @intvariable = 1;--給需要傳入的引數賦值
set @sqlstring ='select * from t1 where field2 = @field';--給需要執行的sql賦值
set @parmdefinition = '@field int';--給需要傳入的引數進行定義
set @intvariable = 1;--給需要傳入的引數賦值
注意:執行sp_executesql ,它的3個引數必須是可以隱式轉換為nvarchar型別的引數,否則報錯。如果沒有定義,可以在引數賦值的前面+n
sp_executesql 支援替換 transact-sql 字串中指定的任何引數值,但 execute 語句不支援。因此,由 sp_executesql 生成的 transact-sql 字串比那些由 execute 語句生成的字串更加相似。sql server 查詢優化器可能將 sp_executesql 的 transact-sql 語句與以前所執行的語句的執行計畫相匹配,從而節省編譯新的執行計畫的開銷。
SQL使用小結
1.如果你希望使用selcet top語句,並且還要附帶where條件,那麼條件中的列就得是合適的索引,如聚集索引 復合索引裡的主列 等,同時,where條件裡也要盡量避開使用函式,or,判斷null等會引起全部掃瞄的語句,不然執行的是全表掃瞄。2.通過設定statistics我們可以檢視執行sql...
Linux下動態庫使用小結
1.靜態庫和動態庫的基本概念 靜態庫,是在可執行程式連線時就已經加入到執行碼中,在物理上成為執行程式的一部分 使用靜態庫編譯的程式執行時無需該庫檔案支援,都可以用,但是生成的可執行檔案較大。動態庫,是在可執行程式啟動時載入到執行程式中,可以被多個可執行程式共享使用。使用動態庫編譯生成的程式相對較小,...
Linux下動態庫使用小結
1.靜態庫和動態庫的基本概念 靜態庫,是在可執行程式連線時就已經加入到執行碼中,在物理上成為執行程式的一部分 使用靜態庫編譯的程式執行時無需該庫檔案支援,都可以用,但是生成的可執行檔案較大。動態庫,是在可執行程式啟動時載入到執行程式中,可以被多個可執行程式共享使用。使用動態庫編譯生成的程式相對較小,...