SQL 執行存儲過程之 [sp_executesql] - 重用SQL


SQL 執行存儲過程之 [sp_executesql] - 重用SQL

  執行可重復使用多次的Transact-SQL語句或批處理,或動態生成的語句或批處理。Transact-SQL語句或批處理可以包含嵌入參數。

sp_executesql [ @stmt = ] statement  
[   
  { , [ @params = ] N'@parameter_name data_type [ OUT | OUTPUT ][ ,...n ]' }   
     { , [ @param1 = ] 'value1' [ ,...n ] }  
]

參數:

  • [@stmt=] statement
    • 是包含Transact-SQL語句或批處理的Unicode字符串@stmt必須是Unicode常量或Unicode變量。不允許使用更復雜的Unicode表達式,例如使用+運算符連接兩個字符串。不允許使用字符常量。如果指定了Unicode常量,則它必須以N作為前綴。例如,Unicode常量N'sp_who'有效,但字符常量'sp_who'無效。字符串的大小僅受可用數據庫服務器內存的限制。在64位服務器上,字符串的大小限制為2 GB,即nvarchar的最大大小(max)。
    • @stmt中包含的每個參數在@params參數定義列表和參數值列表中都必須有相應的條目。
  • [@params=]N'@parameter_name data_type[,…N]'
    • 是一個字符串,包含@stmt中嵌入的所有參數的定義。字符串必須是Unicode常量或Unicode變量。每個參數定義由一個參數名和一個數據類型組成。n是表示其他參數定義的占位符。@stmt中指定的每個參數都必須在@params中定義。如果@stmt中的Transact-SQL語句或批處理不包含參數,則不需要@params。此參數的默認值為NULL。
  • [@param1=]'value1'
    • 是參數字符串中定義的第一個參數的值。該值可以是Unicode常量或Unicode變量。必須為@stmt中包含的每個參數提供一個參數值。當@stmt中的Transact-SQL語句或批處理沒有參數時,這些值不是必需的。
  • [ OUT | OUTPUT ]
    • 指示該參數是輸出參數。text、ntext和image參數可以用作輸出參數,除非該過程是公共語言運行時(CLR)過程。使用output關鍵字的輸出參數可以是光標占位符,除非該過程是CLR過程。
  • n
    • 是其他參數值的占位符。值只能是常量或變量。值不能是更復雜的表達式,如函數或使用運算符生成的表達式。

返回值:0成功 ,非0 失敗

其他注意事項:

  • sp_executesql參數必須按照本主題前面“語法”部分所述的特定順序輸入。如果輸入的參數順序不正確,將出現錯誤消息。
  • sp_executesql在批處理、名稱范圍和數據庫上下文方面的行為與EXECUTE相同。在執行sp_executesql語句之前,不會編譯sp_executesql@stmt參數中的Transact-SQL語句或批處理。然后將@stmt的內容編譯並作為一個執行計划執行,該執行計划與名為sp_executesql的批處理的執行計划分開。sp_executesql批處理無法引用在調用sp_executesql的批處理中聲明的變量。sp_executesql批處理中的本地游標或變量對調用sp_executesql的批處理不可見。數據庫上下文中的更改只持續到sp_executesql語句的末尾。
  • 當對Transact-SQL語句的參數值的更改是唯一的變化時,可以使用sp_executesql代替存儲過程多次執行該語句。由於Transact-SQL語句本身保持不變,並且只有參數值會更改,因此SQL Server查詢優化器可能會重用它為第一次執行生成的執行計划。

示例1:

use TaoRoy2022;  
go  
declare @sSQL nvarchar(500);  
declare @Parm1 nvarchar(500);  
declare @SaNum nvarchar(25);  
declare @InVar int;  
set @sSQL = N'select @SaOUT = max(SaNum)  
    from Sales.SaHer  
    where CuID = @CuID';  
set @Parm1 = N'@CuID int,@SaOUT nvarchar(25) output';  
set @InVar = 5201314;  
execute sp_executesql  
     @sSQL 
    ,@Parm1 
    ,@CuID = @InVar  
    ,@SaOUT = @SaNum output;  
select @SaNum;    -- 此select語句返回輸出參數的值。
-- 此select語句使用where子句中輸出參數的值。  
select sDate,sTotal from Sales.SaHer where SaNum=@SaNum;

示例2:

create procedure [dbo].[sp_GetUId]
(
    @uId varchar(100),
    @uName varchar(100) output
)
as
begin
    declare @sql nvarchar(1000)
    set @sql=N'select @uName=UName from TB1 where UId=@uId'
    exec sp_executesql @sql,N'@uId varchar(100),@uName varchar(100) output',@uId,@uName output
    select @uName
end

  

  

 

 

創建時間:2022.01.26  更新時間:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM