Transact-SQL中的存储过程,非常类似于编程语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。
基本概念
存储过程是由SQL 语句和控制流程语句构成的语句块(语句集合)。他不仅可以输入参数,还可以输出参数。存储过程可以通过接收参数向调用者返回结果集,结果集的格式由调用者确定。可以在存储过程中调用另一个存储过程
创建存储过程并SSMS中执行
使用 SQL Server Management Studio
- 在 “对象资源管理器”中,连接到 数据库引擎 的实例,然后展开该实例。
- 依次展开 “数据库”、 AdventureWorks2012 数据库和 “可编程性”。
- 右键单击“存储过程”,再单击“新建存储过程”。
- 在 “查询” 菜单上,单击 “指定模板参数的值”。
- 在 “指定模板参数的值” 对话框中,输入下列所示的参数值。
参数 | 值 |
---|---|
author | 作者 |
Create date | 创建日期 |
Descript | 介绍 |
Procedure_name | GetXHG |
@Param1 | @UserName |
@Datatype_For_Param1 | nchar(100) |
Default_Value_For_Param1 | NULL |
@Param2 | |
@Datatype_For_Param2 | |
Default_Value_For_Param2 |
- 点击“确定”
在查询编辑器中,试用一下语句代替SELECT 语句
SELECT password,email,sex,RANK,groupname,isdelete,buildtime from Member where UserName = @username
- 若要测试语法,请在 “查询” 菜单上,单击 “分析”。 如果返回错误消息,则请将这些语句与上述信息进行比较,并视需要进行更正。
- 若要创建该过程,请在 “查询” 菜单上单击 “执行”。 该过程作为数据库中的对象创建。
- 若要查看在对象资源管理器中列出的过程,请右键单击“存储过程”,然后选择“刷新”。
- 若要运行该过程,请在对象资源管理器中右键单击存储过程名称 GetXHG,然后选择“执行存储过程”。
- 在“执行过程”窗口中,输入 xiehongguang 作为参数 @UserName 的值。
使用 Transact-SQL 在查询编辑器中创建过程
- 在 “对象资源管理器”中,连接到 数据库引擎的实例。
- 从 “文件” 菜单中,单击 “新建查询”。
将以下示例复制并粘贴到查询窗口中,然后单击 “执行”。 该示例将使用其他过程名称创建与上述相同的存储过程。
USE LuckyGitlabStats; GO CREATE PROCEDURE GetXHG @UserName nchar(100) AS SELECT password,email,sex,RANK,groupname,isdelete,buildtime from Member where UserName = @username; GO
若要运行该过程,请将以下示例复制并粘贴到一个新的查询窗口中,然后单击 “执行”。 请注意,将显示指定参数值的不同方法。
[USE Lucky;] [GO] EXECUTE GetXHG N'xiehongguang'; -- Or EXEC dbo.GetXHG @username = N'xiehongguang'; GO -- Or EXECUTE GetXHG @username = N'xiehongguang'; GO
C# 调用执行
public List<Member> gettest()
{
List<Member> members = new List<Member>();
ConnectLocalSQL connectLocaldb = new ConnectLocalSQL();
SqlConnection conn = connectLocaldb.ConnectDataBase();
//打开数据库
conn.Open();
//创建查询语句
SqlCommand querySingleInfo = conn.CreateCommand();
querySingleInfo.CommandText = "GetXHG";
querySingleInfo.CommandType = System.Data.CommandType.StoredProcedure;
//querySingleInfo.Parameters.Add("@username", SqlDbType.NChar);
//querySingleInfo.Parameters["@username"].Value = "xiehongguang";
querySingleInfo.Parameters.AddWithValue("@username", "xiehongguang");
SqlDataReader userInfoReader = querySingleInfo.ExecuteReader();
//有多行数据,用while循环
while (userInfoReader.Read())
{
Member member = new Member();
// member.username = userInfoReader["UserName"].ToString().Trim();
member.password = userInfoReader["Password"].ToString().Trim();
member.email = userInfoReader["Email"].ToString().Trim();
member.sex = userInfoReader["Sex"].ToString().Trim();
member.rank = userInfoReader["Rank"].ToString().Trim();
member.groupName = userInfoReader["Groupname"].ToString().Trim();
member.isdelete = userInfoReader["IsDelete"].ToString().Trim();
members.Add(member);
}
//关闭查询
userInfoReader.Close();
//关闭数据库连接
conn.Close();
return members;
}
参考
https://docs.microsoft.com/zh-cn/sql/relational-databases/stored-procedures/create-a-stored-procedure
https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand(v=vs.110).aspx
《SQL 查询的艺术》