SQL Server的存储过程怎么写?

上周有个客人问我SQL Server里怎么存储数据,还特别提到了存储过程。
我就给他演示了一下。
首先,我们得准备数据,创建一个测试表books_test,里面有几个字段:book_id、book_name、book_price和book_auth。

sql CREATE TABLE books_test ( book_id INT IDENTITY(1 ,1 ) PRIMARY KEY, book_name VARCHAR(2 0), book_price FLOAT, book_auth VARCHAR(1 0) );
然后,我们插入一些测试数据:
sql INSERT INTO books_test (book_name, book_price, book_auth) VALUES ('论语', 2 5 .6 , '孔子'), ('天龙八部', 2 5 .6 , '金庸'), ('雪山飞狐', 3 2 .7 , '金庸'), ('平凡的世界', 3 5 .8 , '路遥'), ('史记', 5 4 .8 , '司马迁');
接下来,我们创建一个无参存储过程getAllBooks,用来查询表中的所有数据:
sql IF EXISTS (SELECT FROM sys.objects WHERE name = 'getAllBooks') DROP PROCEDURE getAllBooks; GO CREATE PROCEDURE getAllBooks AS BEGIN SELECT FROM books_test; END; GO
调用这个存储过程:
sql EXEC getAllBooks;
然后,我们修改一下这个存储过程,让它只返回book_name字段:
sql ALTER PROCEDURE getallbooks AS SELECT book_name FROM books_test; GO
改完名字,方便记忆:
sql EXEC sp_rename 'getallbooks', 'proc_get_allbooks'; GO EXEC proc_get_allbooks; GO
接下来,我们创建一个带参数的存储过程searchbooks,可以根据book_id来查找书籍:
sql IF EXISTS (SELECT FROM sys.objects WHERE name = 'searchbooks') DROP PROCEDURE searchbooks; GO CREATE PROCEDURE searchbooks (@bookid INT) AS BEGIN DECLARE @book_id INT; SET @book_id = @bookid; SELECT FROM books_test WHERE book_id = @book_id; END; GO
执行这个存储过程:
sql EXEC searchbooks 1 ;
最后,我们创建一个带两个参数的存储过程book_test2 ,可以根据book_id和book_name来查找书籍:
sql IF EXISTS (SELECT FROM sys.objects WHERE name = 'book_test2 ') DROP PROCEDURE book_test2 ; GO CREATE PROCEDURE book_test2 (@bookid INT, @bookname VARCHAR(2 0)) AS BEGIN DECLARE @book_id INT; DECLARE @book_name VARCHAR(2 0); SET @book_id = @bookid; SET @book_name = @bookname; SELECT FROM books_test WHERE book_id = @book_id AND book_name = @book_name; END; GO
执行这个存储过程:
sql EXEC book_test2 1 , '论语';
这样,我们就完成了数据的存储和存储过程的创建。
如果你需要更详细的解释或者有其他问题,反正你看着办。
我还在想这个问题呢。

sql server 中 一个要输入参数和输出参数的存储过程。

打开SQL Server Management Studio。
新建数据库表。
插入样例数据。
右键可编程性,新建存储过程。
编写SQL语句。
执行存储过程。
使用EXEC调用,传入参数。

SQL SERVER 中存储过程、游标、嵌套循环、CASE、中间表使用实例

哎哟,这个SQLSERVER的存储过程PRO_EducationInputStatus啊,它就是专门用来处理教育输入状态的,挺复杂的。
我见过不少类似的,不过这个还真是挺有特点的。

它首先定义了四个变量,分别对应计划号、月、课程代码和班次,这在做这种操作的时候是很常见的。
然后呢,存储过程的核心部分是创建了一个临时表,叫mytemp,这临时表的作用就是存储课程通过与否的信息。

这里有个游标schnoCursor,它是从Trainsched_Master表里逐个获取计划号的,这个表肯定就是存储培训计划信息的地方。
获取到一个计划号后,存储过程又进行嵌套循环,这层循环里定义了smonthCursor和courseCodeCursor,这两个游标分别用来查询计划月和课程代码的。

这嵌套得挺深的啊,然后再一层循环获取班次。
这一步是通过CASE语句来完成的,根据查询结果判断课程是否通过,这个结果就被存储到了之前创建的mytemp中间表中。

这过程挺繁琐的,不过也还是挺高效的。
处理完所有的查询后,记得要把游标关了,别让它一直占用资源,那样可就不好了。

创建这个临时表的方式也挺特别的,因为这个表需要多次插入数据,所以不适合一次性创建,得手动创建并管理。

然后,CASE语句在这里的作用就大了,它可以根据查询结果进行条件判断,然后把判断结果赋值给PassedApprove字段。
这CASE语句的使用啊,其实就是在做简单的条件分支。

最后,执行存储过程中的用户自定义SQL语句,整个流程就算完成了。
这存储过程啊,看着复杂,但其实核心也就是那么几个步骤。
我当时也没想明白它为什么这么设计,但现在想想,这设计得还是挺合理的。
毕竟,它要处理的数据挺复杂的。