很久没用存储过程了,捞个例子出来剖析剖析,温习一下sql
1.例子数据库
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
goide
ALTER PROCEDURE [dbo].[UP_GetNew_GDBH]
( @GDZL VARCHAR(10),----------------------------暂时注释
@GDBH VARCHAR(20) OUTPUT
)
AS
BEGIN函数
DECLARE @xh INT
DECLARE @Date DATETIME
SET @Date = GetDate()
declare @gdjx varchar(20)---------------------我后来本身修改添加了
select @gdjx=JX from YW_GDZL where GDZL=@GDZL------------我后来本身修改添加了
SELECT @xh = MAX([XH]) FROM SEQ_GDBH WHERE DateDiff(mm, [SLSJ], @Date) = 0ui
IF @xh IS NULL -- 没有本月的编号
BEGIN
INSERT INTO SEQ_GDBH([SLSJ], [XH]) VALUES(@Date, 1)
SET @GDBH = Convert(varchar(6), @Date, 112) + @gdjx + '000001' -- 此处可根据客户需求更改
END
ELSE
BEGIN
DECLARE @cc VARCHAR(6)
SET @cc = Cast((@xh + 1) AS VARCHAR)
INSERT INTO SEQ_GDBH([SLSJ], [XH]) VALUES(@Date, @xh + 1)
SET @GDBH = Convert(varchar(6), @Date, 112) + @gdjx + Replicate('0', 6 - Len(@cc)) + @cc -- 此处可根据客户需求更改
ENDthis
END
上面是一个简单的例子,输入一个工单种类@GDZL,获得工单编号@GDBHspa
(1)首先解释下 set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON 的用法:对象
这些是 SQL-92 设置语句,使 SQL Server 2000/2005 听从 SQL-92 规则。
当 SET QUOTED_IDENTIFIER 为 ON 时,标识符能够由双引号分隔,而文字必须由单引号分隔。当 SET QUOTED_IDENTIFIER 为 OFF 时,标识符不可加引号,且必须符合全部 Transact-SQL 标识符规则。
L-92 标准要求在对空值进行等于 (=) 或不等于 (<>) 比较时取值为 FALSE。当 SET ANSI_NULLS 为 ON 时,即便 column_name 中包含空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即便 column_name 中包含非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍会返回零行。
当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不听从 SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中包含空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中包含非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回全部不为 XYZ_value 也不为 NULL 的行。get
(2)该存储过程调用了很多系统函数,是个比较经典的例子:input
如:GetDate(),MAX([XH]),DateDiff(mm, [SLSJ], @Date) = 0,
connvert(varchar(6), @Date, 112),Cast((@xh + 1),
Replicate('0', 6 - Len(@cc))等等
(3)DBSqlHelper里的简单调用
public static DataSet RunProcedure(string storedProcName, SqlParameter[] parameters)
{
using (SqlConnection connection = new SqlConnection(db))
{
DataSet dataSet = new DataSet();
connection.Open();
SqlDataAdapter sqlDA = new SqlDataAdapter();
sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
sqlDA.Fill(dataSet);
connection.Close();
return dataSet;
}
}
/// <summary>
/// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
/// </summary>
/// <param name="connection">数据库链接</param>
/// <param name="storedProcName">存储过程名</param>
/// <param name="parameters">存储过程参数</param>
/// <returns>SqlCommand</returns>
private static SqlCommand BuildQueryCommand(SqlConnection connection, string storedProcName, SqlParameter[] parameters)
{
SqlCommand command = new SqlCommand(storedProcName, connection);
command.CommandType = CommandType.StoredProcedure;
if (parameters != null)
{
foreach (SqlParameter pa in parameters)
{
command.Parameters.Add(pa);
}
}
return command;
}
(4)dal层里的调用
public string cunchu1( )
{
string strname = "UP_GetNew_GDBH";
SqlParameter[] listp = {
new SqlParameter("@GDZL",SqlDbType.VarChar,10),
new SqlParameter("@GDBH",SqlDbType.VarChar,20)
};
listp[0].Value = "2";
listp[1].Direction = ParameterDirection.Output;
DBHelper.RunProcedure(strname, listp);
object obj = listp[1].Value;
return obj.ToString();
}
提供 ParameterDirection 属性
该参数为输入参数。这是默认设置。 |
|
该参数可执行输入和输出。 |
|
该参数为输出参数。 |
|
该参数表示从某操做(如存储过程、内置函数或用户定义的函数)返回的值。 |
input
该参数为输入参数。这是默认设置。
output
该参数为输出参数
inputoutput
该参数可执行输入和输出。
returnvalue
该参数表示从某操做(如存储过程、内置函数或用户定义的函数)返回的值。
以上就是本身总结的调用存储过程一个小例子,简单易懂。
该参数为输入参数。这是默认设置。 |
|
该参数可执行输入和输出。 |
|
该参数为输出参数。 |
|
该参数表示从某操做(如存储过程、内置函数或用户定义的函数)返回的值。 |