--------------创建存储过程-----------------CREATE PROC [ EDURE ] procedure_name [ ; number ][ { @parameter data_type }[ VARYING ] [ = default ] [ OUTPUT ]] [ ,...n ][ WITH{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ][ FOR REPLICATION ]AS sql_statement [ ...n ]--------------调用存储过程-----------------EXECUTE Procedure_name "" --存储过程如果有参数,后面加参数格式为:@参数名=value,也可直接为参数值value--------------删除存储过程-----------------drop procedure procedure_name--在存储过程中能调用另外一个存储过程,而不能删除另外一个存储过程创建存储过程的参数:
针对上面的表,我使用存储过程对它做一些操作:
1. 只返回单一记录集的存储过程
-------------创建名为GetUserAccount的存储过程----------------create Procedure GetUserAccountasselect * from UserAccountgo-------------执行上面的存储过程----------------exec GetUserAccount结果:相当于运行 select * from UserAccount 这行代码,结果为整个表的数据。
-------------创建名为GetUserAccount的存储过程----------------create Procedure inUserAccountasinsert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(9,9,"2013-01-02",9)go-------------执行上面的存储过程----------------exec inUserAccount结果:相当于运行 insert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(9,9,"2013-01-02",9) 这行代码。
-------------创建名为GetUserAccount的存储过程----------------create Procedure inUserAccountReasinsert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(10,10,"2013-01-02",10)return @@rowcountgo-------------执行上面的存储过程----------------exec inUserAccountRe解释:这里的@@rowcount为执行存储过程影响的行数,执行的结果是不仅插入了一条数据,还返回了一个值即 return value =1 ,这个可以在程序中获取,稍后在c#调用存储过程中会有说到。
-------------创建名为GetUserAccount的存储过程----------------create Procedure GetUserAccountRe@UserName nchar(20),@UserID int outputasif(@UserName>5)select @UserID=COUNT(*) from UserAccount where UserID>25elseset @UserID=1000go-------------执行上面的存储过程----------------exec GetUserAccountRe "7",null解释:@UserName为输入参数,@UserID为输出参数。 运行结果为@userID为COOUT(*)即 =1。
-------------创建名为GetUserAccount的存储过程----------------create Procedure GetUserAccountRe1@UserName nchar(20),@UserID int outputasif(@UserName>5)select @UserID=COUNT(*) from UserAccount where UserID>25elseset @UserID=1000return @@rowcountgo-------------执行上面的存储过程----------------exec GetUserAccountRe1 "7",null结果:@userID为COOUT(*)即 =1,Retun Value=1。
-------------创建名为GetUserAccount的存储过程----------------create Procedure GetUserAccountRe2@UserName nchar(20),@UserID int outputasif(@UserName>5)select @UserID=COUNT(*) from UserAccount where UserID>25elseset @UserID=1000select * from UserAccountreturn @@rowcountgo-------------执行上面的存储过程----------------exec GetUserAccountRe2 "7",null结果:返回执行 select * from UserAccount 这句代码的结果集,同时@userID为COOUT(*)即 =1,Retun Value=9。
-------------创建名为GetUserAccount的存储过程----------------create Procedure GetUserAccountRe3asselect * from UserAccountselect * from UserAccount where UserID>5go-------------执行上面的存储过程----------------exec GetUserAccountRe3结果:返回两个结果集,一个为 select * from UserAccount,另一个为 select * from UserAccount where UserID>5 。
public partial class ProcedureTest : System.Web.UI.Page{public static string conn = ConfigurationManager.ConnectionStrings["StuRelationDBConnectionString"].ConnectionString;public SqlConnection con = new SqlConnection(conn);protected void Page_Load(object sender, EventArgs e){runGetUserAccountRe3();}//只返回单一记录集的存储过程GetUserAccountpublic void runGetUserAccount(){SqlDataAdapter dp = new SqlDataAdapter(common("GetUserAccount"));DataSet ds = new DataSet();// 填充dataset dp.Fill(ds);rpt.DataSource = ds;rpt.DataBind();}//没有输入输出的存储过程inUserAccountpublic void runinUserAccount(){con.Open();Label1.Text = common("inUserAccount").ExecuteNonQuery().ToString();con.Close();}//有返回值的存储过程inUserAccountRepublic void runinUserAccountRe(){// 创建参数 SqlCommand cmd = common("inUserAccountRe");IDataParameter[] parameters = {new SqlParameter("rval", SqlDbType.Int,4)};// 将参数类型设置为 返回值类型 parameters[0].Direction = ParameterDirection.ReturnValue;// 添加参数 cmd.Parameters.Add(parameters[0]);con.Open();// 执行存储过程并返回影响的行数 Label1.Text = cmd.ExecuteNonQuery().ToString();con.Close();// 显示影响的行数和返回值 Label1.Text += "-" + parameters[0].Value.ToString();}//有输入参数和输出参数的存储过程public void runGetUserAccountRe(){SqlCommand cmd = common("GetUserAccountRe");// 创建参数 IDataParameter[] parameters = {new SqlParameter("@UserName", SqlDbType.NChar,20) ,new SqlParameter("@UserID", SqlDbType.Int) , };// 设置参数类型 parameters[0].Value = "7"; parameters[1].Direction = ParameterDirection.Output; // 设置为输出参数 // 添加参数 cmd.Parameters.Add(parameters[0]);cmd.Parameters.Add(parameters[1]);con.Open();// 执行存储过程并返回影响的行数 Label1.Text = cmd.ExecuteNonQuery().ToString();con.Close();// 显示影响的行数和输出参数 Label1.Text += "-" + parameters[1].Value.ToString();}//同时具有返回值、输入参数、输出参数的存储过程GetUserAccountRe1public void runGetUserAccountRe1(){SqlCommand cmd = common("GetUserAccountRe1");// 创建参数 IDataParameter[] parameters = {new SqlParameter("@UserName", SqlDbType.NChar,20) ,new SqlParameter("@UserID", SqlDbType.Int) , new SqlParameter("rval", SqlDbType.Int,4)};// 设置参数类型 parameters[0].Value = "7";parameters[1].Direction = ParameterDirection.Output; // 设置为输出参数 parameters[2].Direction = ParameterDirection.ReturnValue; //设置为返回值// 添加参数 cmd.Parameters.Add(parameters[0]);cmd.Parameters.Add(parameters[1]);cmd.Parameters.Add(parameters[2]);con.Open();// 执行存储过程并返回影响的行数 Label1.Text = cmd.ExecuteNonQuery().ToString();con.Close();// 显示影响的行数和输出参数 Label1.Text += "-输出参数为:" + parameters[1].Value.ToString();Label1.Text += "-返回值为:" + parameters[2].Value.ToString();}//同时返回参数和记录集的存储过程GetUserAccountRe2public void runGetUserAccountRe2(){SqlCommand cmd = common("GetUserAccountRe2");// 创建参数 IDataParameter[] parameters = {new SqlParameter("@UserName", SqlDbType.NChar,20) ,new SqlParameter("@UserID", SqlDbType.Int) , new SqlParameter("rval", SqlDbType.Int,4)};// 设置参数类型 parameters[0].Value = "7";parameters[1].Direction = ParameterDirection.Output; // 设置为输出参数 parameters[2].Direction = ParameterDirection.ReturnValue; //设置为返回值// 添加参数 cmd.Parameters.Add(parameters[0]);cmd.Parameters.Add(parameters[1]);cmd.Parameters.Add(parameters[2]);con.Open();// 执行存储过程并返回影响的行数 Label1.Text = cmd.ExecuteNonQuery().ToString();DataSet ds = new DataSet();SqlDataAdapter dt = new SqlDataAdapter(cmd);dt.Fill(ds);rpt.DataSource = ds;rpt.DataBind();con.Close();// 显示影响的行数和输出参数 Label1.Text += "-输出参数为:" + parameters[1].Value.ToString();Label1.Text += "-返回值为:" + parameters[2].Value.ToString();}//返回多个记录集的存储过程public void runGetUserAccountRe3(){DataSet ds = new DataSet();SqlDataAdapter dt = new SqlDataAdapter(common("GetUserAccountRe3"));dt.Fill(ds);rpt1.DataSource = ds.Tables[0].DefaultView;rpt1.DataBind();rpt2.DataSource = ds.Tables[1].DefaultView;rpt2.DataBind();}public SqlCommand common(string proName){SqlCommand cmd = new SqlCommand();// 设置sql连接 cmd.Connection = con;// 如果执行语句 cmd.CommandText = proName;// 指定执行语句为存储过程 cmd.CommandType = CommandType.StoredProcedure;return cmd;}}附带SQLServer数据库的一些全局变量
select APP_NAME ( ) as w --当前会话的应用程序select @@IDENTITY--返回最后插入的标识值 select USER_NAME()--返回用户数据库用户名SELECT @@CONNECTIONS --返回自上次SQL启动以来连接或试图连接的次数。 SELECT GETDATE() --当前时间 SELECT @@CPU_BUSY/100 --返回自上次启动SQL 以来 CPU 的工作时间,单位为毫秒USE tempdb SELECT @@DBTS as w --为当前数据库返回当前 timestamp 数据类型的值。这一 timestamp 值保证在数据库中是唯一的。 select @@IDENTITY as w --返回最后插入的标识值 SELECT @@IDLE as w --返回SQL自上次启动后闲置的时间,单位为毫秒 SELECT @@IO_BUSY AS w--返回SQL自上次启动后用于执行输入和输出操作的时间,单位为毫秒 SELECT @@LANGID AS w--返回当前所使用语言的本地语言标识符(ID)。 SELECT @@LANGUAGE AS w--返回当前使用的语言名 SELECT @@LOCK_TIMEOUT as w --当前会话的当前锁超时设置,单位为毫秒。 SELECT @@MAX_CONNECTIONS as w --返回SQL上允许的同时用户连接的最大数。返回的数不必为当前配置的数值 EXEC sp_configure --显示当前服务器的全局配置设置 SELECT @@MAX_PRECISION as w --返回 decimal 和 numeric 数据类型所用的精度级别,即该服务器中当前设置的精度。默认最大精度38。 select @@OPTIONS as w --返回当前 SET 选项的信息。 SELECT @@PACK_RECEIVED as w --返回SQL自启动后从网络上读取的输入数据包数目。 SELECT @@PACK_SENT as w --返回SQ自上次启动后写到网络上的输出数据包数目。 SELECT @@PACKET_ERRORS as w --返回自SQL启动后,在SQL连接上发生的网络数据包错误数。 SELECT @@SERVERNAME as w --返回运行SQL服务器名称。 SELECT @@SERVICENAME as w --返回SQL正在其下运行的注册表键名 SELECT @@TIMETICKS as w --返回SQL服务器一刻度的微秒数 SELECT @@TOTAL_ERRORS AS w --返回 SQL服务器自启动后,所遇到的磁盘读/写错误数。 SELECT @@TOTAL_READ as w --返回 SQL服务器自启动后读取磁盘的次数。 SELECT @@TOTAL_WRITE as w --返回SQL服务器自启动后写入磁盘的次数。 SELECT @@TRANCOUNT as w --返回当前连接的活动事务数。 SELECT @@VERSION as w --返回SQL服务器安装的日期、版本和处理器类型。以上就是本文的全部内容,希望对大家的学习有所帮助。