動態 SQL

SQL Server 容許用字符串來動態構造 T-SQL 代碼的一個批處理,接着再執行這個批處理。這種功能稱爲動態SQL (dynamic SQL)。SQL Server提供了兩種執行動態 SQL 的方法:使用 EXEC(EXECUTE 的縮寫)命令和sp_executesql 存儲過程。算法

動態SQL 能夠用於如下幾種用途:sql

♦ 自動化管理任務。例如,對於數據庫實例中的每一個數據庫,查詢其元數據,爲其執行 BACKUP DATABASE 語句。數據庫

♦ 改善特定任務的性能。例如,構造參數化的特定查詢,以重用之前緩存過的執行計劃。緩存

♦ 在對實際數據進行查詢的基礎上,構造代碼元素。例如,當事先不知道在PIVOT運算符的IN子句中應該出現哪些元素時,動態構造PIVOT查詢。安全

注意:當把用戶的輸入拼接爲代碼中的一部分時,要特別當心。黑客們常常會試圖注入(inject )你不想運行的代碼。要防止SQL注入,最好的辦法就是避免將用戶輸入拼接爲代碼的一部分(例如,經過使用參數)。可是若是你確實須要將用戶的輸入拼接爲代碼的一部分,務必對用戶的輸入進行完全檢查,看看有沒有SQL注入的企圖。性能

1. EXEC 命令code

EXEC 命令是T-SQL中最先提供的一種用於執行動態SQL 的方法。EXEC 接受一個字符串做爲在圓括號中輸入的參數,執行字符串中包含的批處理代碼。EXEC 命令的輸入既支持普通字符,也支持Unicode字符。對象

EXEC('SELECT * FROM dbo.Categories');索引

2. sp_executesql 存儲過程接口

sp_executesql 存儲過程是繼EXEC命令以後引入的另外一種執行動態SQL 的方法。從sp_executesql的調用接口來講,使用這個存儲過程更安全和更靈活,由於它支持輸入和輸出參數。

注意:與EXEC命令不一樣的是,sp_executesql 存儲過程只支持使用 Unicode字符串做爲其輸入的批處理代碼。

正由於在動態 SQL 代碼中可使用輸入的輸出參數,這樣就有助於寫出更安全和更有效的代碼。從安全性的角度來講,在代碼中出現的參數並非代碼的一部分,而只是表達式中的運算對象。因此,經過使用參數,就能夠沒必要受SQL 注入的困擾了。

sp_executesql 存儲過程在執行性能上要比EXEC命令更好,由於它的參數化有助於重用緩存過的執行計劃。執行計劃是SQL Server爲查詢生成的物理處理計劃,包含了一組指令,說明要訪問哪些對象、以什麼順序、使用哪一個索引、如何訪問它們、使用什麼聯接算法、等等。爲了簡化處理,若是要重用之前緩存過的執行計劃,必須知足的條件之一就是查詢字符串應該和緩存中已經存在的執行計劃的查詢字符串相同。因此,有效重用查詢執行計劃最好的方法就是使用帶有參數的存儲過程。這樣一來,即便參數值發生了變化,可查詢字符串仍然保持相同。但若是你出於本身的緣由而決定使用特定的代碼,而不使用存儲過程,至少你仍然能夠儘量地使用參數。只不過若是使用sp_executesql則會增長重用執行計劃的機會。

sp_executesql 存儲過程有兩個輸入參數和一個參數賦值部分。在第一個參數@stmt中,須要指定包含想要運行的批處理代碼的Unicode字符串。第二個參數@params是一個Unicode字符串,包含@stmt中全部輸入和輸出參數的聲明。接着爲輸入和輸出參數指定取值,各參數之間用逗號分隔。

EXEC sp_executesql @stmt=N'SELECT orderid ,custid FROM dbo.Orders WHERE orderid=@orderid;',

          @params=N'@orderid AS INT',

          @orderid=10246;

相關文章
相關標籤/搜索