存儲過程的執行


 

,sp_executesql 的參數必須為UNICODE,即NCHAR,NVARCHAR,NTEXT型,否則報錯

動態sql語句基本語法 
1 :普通SQL語句可以用Exec執行     
    
Select * from tableName 
Exec('select * from tableName') 
Exec sp_executesql N'select * from tableName' -- 請注意字符串前一定要加N 

 

 

存儲過程可以返回的不僅僅是查詢的結果,也可以是一個指示了存儲過程的成功或失敗的標識,我們可以利用return來返回這個標識,return的工作方式不管一個存儲過程是否提供返回值,程序都會收到一個返回值,sqlserver默認的會在完成存儲過程時自動返回一個0值。

使用return可以返回值,例如:return 100

注意:返回值必須為整數!

這個return和其他的語言的函數中的return相似,執行它以后,會從存儲過程中退出,而不會執行以后的代碼。

用這個return的意義是什么呢?實際上我在寫存儲過程的時候確實很少用到它啊,每次新建存儲過程,模板里最后都會有個return,而每次,我都會刪掉它。

考慮一下這個問題,如果返回值默認為0,則意味着沒有錯誤,但是這樣就不是很好,明明存儲過程里出了問題,而仍舊返回0,我們一定要很明確的知道返回值的意義,這樣才不至於得到一個意外的返回值。所以當不符合邏輯時,可以return 一個標識,通過這個標識判斷存儲過程的是否執行正確。

 

alter procedure aa
(
@input int,
@aa int output,
@bb int output
)
as
select @aa=@input+3
set @bb=3
return 44
go

declare @a int
declare @b int
declare @c int
execute @c=aa 4,@a out,@b out //注意輸入,輸出,返回值的寫法
print @a 返回7
print @b  返回3
print @c  返回44


execute 與sp_executesql的區別:

EXEC命令有兩種用法,一種是執行一個存儲過程,另一種是執行一個動態的批處理.

SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) +'WHERE OrderID = '+CAST(@OrderID AS VARCHAR(10))+' ORDER BY ORDERID DESC'
EXEC(@sql);
exec括號中只能包含一個字符串變量,但可以串聯多個變量
EXEC('SELECT TOP('+ CAST(@TopCount AS VARCHAR(10)) +')* FROM '+QUOTENAME(@TableName) +' ORDER BY ORDERID DESC');
 
SQL編譯器就會報錯,編譯不通過,而如果我們這樣:
EXEC(@sql+@sql2+@sql3);
編譯器就會通過;
 
所以最佳的做法是把代碼構造到一個變量中,然后再把該變量作為EXEC命令的輸入參數,這樣就不會受限制了;
SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) +'WHERE OrderID = @OrderID ORDER BY ORDERID DESC'
錯誤:必須聲明標量變量 "@OrderID".但sp_executesql可以 
DECLARE @TableName VARCHAR(50),@sql NVARCHAR(MAX),@OrderID INT;
   2:  SET @TableName = 'Orders ';
   3:  SET @OrderID = 10251;
   4:  SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) + ' WHERE OrderID = @OID ORDER BY ORDERID DESC'
   5:  EXEC sp_executesql
   6:      @stmt = @sql,
   7:      @params = N'@OID AS INT ',
   8:      @OID = @OrderID
 
         
 
         
DECLARE @sql AS NVARCHAR(12),@i AS INT;
SET @sql = N' SET @p = 10';
EXEC sp_executesql 
    @stmt = @sql,
    @params = N'@p AS INT OUTPUT',
    @p = @i OUTPUT
SELECT @i
 
         
EXEC不提供接口
 
這里的接口是指,它不能執行一個包含一個帶變量符的批處理,sp_executesql 提供接口.

DECLARE @tab nvarchar(max),@filds nvarchar(max),@where nvarchar(max),@sql nvarchar(max)

set @tab=' class '
set @filds=' id ';
set @where=1;
set @sql='select id,@filds from class where id>@id'
exec sp_executesql @sql,N'@filds nvarchar(22),@id int',@filds,@where

通用存儲過程:

USE [pinkcitydb]
GO
/****** Object: StoredProcedure [dbo].[mvcPager] Script Date: 02/22/2012 09:10:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[mvcPager]
(
@Psql nvarchar(4000), --生成dataset的語句
@PNum int, --顯示第幾頁
@PSize int, --顯示多少條
@Sort nvarchar(200) = null, --排序語句 如:order by id desc
@RowNumName nvarchar(50), --ROW_NUMBER別名
@Prcount int out, --返回記錄總數
@Pcount int out --返回分頁總數
)
as
set nocount on
declare @sqlTmp nvarchar(1000) --存放SQL語句
declare @sqlTmpCount nvarchar(1000) --存放查詢記錄總數量SQL語句

--計算范圍
declare @Pmax int
declare @Pmin int
set @Pmax = @pnum*@psize --當前頁*頁大小 = 頁最大值
set @Pmin = @Pmax - @psize +1 --頁最大值 - 頁大小 + 1 = 頁最小值
set @sqlTmp='select * from ('+@Psql+')as temptb where '+@rowNumName+' BETWEEN '+cast(@Pmin as varchar(10))+' and '+cast(@Pmax as varchar(10))+''+@sort
set @sqlTmpCount='select @Prcount=count(*) from ('+@Psql+') as temptb' --print @sqlTmpCount
--
--取得查詢記錄總數量-----
exec sp_executesql @sqlTmpCount,N'@Prcount int out ',@Prcount out --print @Prcount
--
取得分頁總數
set @Pcount=(@Prcount+@pSize-1)/@pSize
exec sp_executesql @sqlTmp
set nocount off




免責聲明!

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



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