6、MSSQL存储过程

http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html

语法

create proc | procedure pro_name
    [{@参数数据类型} [=默认值] [output],
     {@参数数据类型} [=默认值] [output],
     ....
    ]
as
    SQL_statements

简单的存储过程

--创建存储过程
if (exists (select * from sys.objects where name = 'proc_get_datatype'))
    drop proc proc_get_datatype
go
create proc proc_get_datatype
as
    select * from dbo.DataType;

--调用、执行存储过程
exec proc_get_datatype;

--查询所有存储过程
select * from sys.objects where type = 'P';

sys.objects中name是存储过程名称,object_id 存储过程的id,type=P 自定义函数type=F 

带输入输出参数的过程

--创建存储过程
if (exists (select * from sys.objects where name = 'proc_ouput'))
    drop proc proc_ouput
go
create proc proc_ouput
(
	@name VARCHAR(20) ='' OUT,--输出参数,默认值为空
	@age  INT =0 OUTPUT 	--输入输出参数,默认值0
)
as
    select  @age = @age+28,@name=@name+'666';
go
--调用、执行存储过程
declare @age int,@name varchar(20);     
SELECT @age=20,@name='qing'  ;			--设置值
exec proc_ouput @name OUT,@age OUTPUT;  --调用存储过程
SELECT @age AS 'age',@name AS 'name'    --查询返回值

拼接SQL执行

sp_executesql

DECLARE @SQL NVARCHAR(1000)
SELECT @SQL = 'SELECT * FROM dbo.DataType'
EXECUTE sys.sp_executesql @SQL
--EXECUTE(@SQL) --没参数的话用这个更方便

带输入输出参数

DECLARE @SQL NVARCHAR(1000),@OldIdNewTableNumber INT,@OldIdUpdateTimes INT,@OldTableNumber INT
SELECT @OldTableNumber=4
SELECT @SQL=N'SELECT @OldIdNewTableNumber=NewTableNumber,@OldIdUpdateTimes=UpdateTimes FROM TB_Form WHERE Id='+CONVERT(VARCHAR(100),@OldTableNumber)
EXECUTE sys.sp_executesql @SQL,N'@OldIdNewTableNumber INT OUTPUT,@OldIdUpdateTimes INT OUTPUT',@OldIdNewTableNumber OUTPUT,@OldIdUpdateTimes  OUTPUT
 
SELECT @OldIdNewTableNumber,@OldIdUpdateTimes

存储过程模板

IF OBJECT_ID('存储过程名','P') IS NOT NULL
BEGIN
DROP PROCEDURE 存储过程名
END
GO
CREATE PROCEDURE 存储过程名 (with encryption 可选加密)
AS
BEGIN
BEGIN TRANSACTION;
BEGIN TRY;
--DECLARE @SQL NVARCHAR(4000)
--  SET @SQL=' INSERT INTO dbo.T_Test(LogDate) VALUES(GETDATE())'
--  EXECUTE(@SQL)
--  SET @SQL=' INSERT INTO dbo.T_Test(LogDate) VALUES(GETDATE())'
--  EXECUTE(@SQL)
COMMIT;
END TRY
BEGIN CATCH
        DECLARE @ErrorMessage NVARCHAR(4000);
		DECLARE @ErrorSeverity INT;
		DECLARE @ErrorState INT;
		SELECT @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY(),@ErrorState = ERROR_STATE();
		RAISERROR(@ErrorMessage,@ErrorSeverity,@ErrorState);		
 ROLLBACK TRANSACTION
END CATCH
END
GO

处理xml参数

sp_xml_preparedocument hdoc(INT) OUTPUT
[, xmltext]
[, xpath_namespaces]

DECLARE @Xml VARCHAR(1000);
DECLARE @Pointer INT; 
SET @Xml='<body><Student name="qing" /></body>'
EXECUTE sp_xml_preparedocument @Pointer OUTPUT,@Xml;  
IF OBJECT_ID('tempdb..#Tem') IS NOT NULL
DROP TABLE #Tem
  create table #Tem
    (
		Name varchar(30)
    )
    ;     
    insert into #Tem
    (
		Name
    )        
    select name
    FROM   
	OPENXML(@Pointer, '/body/Student') 
	with 
	(
		name varchar(30)
    )
    ;
	EXECUTE sp_xml_removedocument @Pointer;
	SELECT * FROM #Tem


其他例子

--创建数据库
create table books(
 book_id int identity(1,1) primary key,
 book_name varchar(20),
 book_price float,
 book_auth varchar(10)
);
--
select * from books
--
--插入测试数据
 insert into books(book_name,book_price,book_auth)  values('论语2',25.6,'孔子')
 insert into books(book_name,book_price,book_auth) values('天龙八部',25.6,'金庸')
 insert into books(book_name,book_price,book_auth) values('雪山飞狐',32.7,'金庸')
 insert into books(book_name,book_price,book_auth) values('平凡的世界',35.8,'路遥')
 insert into books(book_name,book_price,book_auth) values('史记',54.8,'司马迁');
 ----------创建无参数存储过程 ----------
 if(exists(select * from sys.objects where name='getAllBooks'))
 drop proc getAllBooks  --删除
 GO
 create procedure getAllBooks
 AS
	select * from books
-- ----------执行 ----------
 EXEC  getAllBooks

 -- ----------修改 ----------
 alter proc getAllBooks
 as
	select book_name from books

-- ----------删除 ----------
drop proc getAllBooks 

--(1)带一个参数的存储过程
if(exists(select * from sys.objects where name='serchBooks'))
drop proc serchBooks
go
	create proc serchBooks(@bookID int)
as
	select * from books where book_id=@bookID;

--执行带参数
exec serchBooks 1;

--(2)两个参数
if(exists(select * from sys.objects where name='serchBooks1'))
drop proc serchBooks1
go 
 create proc serchBooks1(@bookID int,@book_Auth varchar(20))
as
 select * from books where book_id=@bookID and book_auth=@book_Auth;

--执行两个参数 select * from books
exec serchBooks1 2,'金庸';

 --(3)创建有返回值的存储过程

 if(exists(select * from sys.objects where name='getBookId'))
 drop proc getBookId
 go
 --@bookAuth输入参数 无默认值
 --@bookId输入输出参数 无默认值
 create proc getBookId(@bookAuth varchar(20),@bookId int output)
 as
 select @bookId=book_id from books where book_auth=@bookAuth

 --测试执行  update books set book_auth='孔子' where book_id=1
 declare @id int
 exec getBookId '孔子',@id output  --声明变量接收存储过程返回的值
 select @id as bookId

--(4)创建带通配符的存储过程
if (exists (select * from sys.objects where name = 'charBooks'))
    drop proc charBooks
go
create proc charBooks(
    @bookAuth varchar(20)='金%',
    @bookName varchar(20)='%'
)
as 
select * from books where book_auth like @bookAuth and book_name like @bookName;
--执行存储过程charBooks
exec  charBooks '金%','%';

--(5)加密存储过程
if(object_id('books_encryption','p') is not null)
	drop proc books_encryption
go
create proc books_encryption
with encryption
as
	select * from books

--执行
exec books_encryption
--执行下面的语句显示;对象 'books_encryption' 的文本已加密。
exec sp_helptext 'books_encryption'

--(6)不缓存存储过程
if(object_id('books_temp','p') is not null)
	drop proc books_temp
go
create proc books_temp
with recompile
as
	select * from books

--执行
exec books_temp
exec sp_helptext 'books_temp'


--(7)创建带游标参数的存储过程
if (object_id('book_cursor', 'P') is not null)
    drop proc book_cursor
go
create proc book_cursor
    @bookCursor cursor varying output
as
    set @bookCursor=cursor forward_only static for
    select book_id,book_name,book_auth from books
    open @bookCursor;
go
--调用book_cursor存储过程
declare @cur cursor,
        @bookID int,
        @bookName varchar(20),
        @bookAuth varchar(20);
exec book_cursor @bookCursor=@cur output;
fetch next from @cur into @bookID,@bookName,@bookAuth;
while(@@FETCH_STATUS=0)
begin 
    fetch next from @cur into @bookID,@bookName,@bookAuth;
    print 'bookID:'+convert(varchar,@bookID)+' , bookName: '+ @bookName  +' ,bookAuth: '+@bookAuth;
end
close @cur    --关闭游标
DEALLOCATE @cur; --释放游标
posted @ 2026-08-30 17:38  清哥的码农生活  阅读(3)  评论(0)    收藏  举报