好久没用存储过程了,捞个例子出来剖析剖析,温习一下
1.例子
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
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) = 0
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 -- 此处可根据客户需求更改
END
END
上面是一个简单的例子,输入一个工单种类@GDZL,得到工单编号@GDBH
(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 的行。
(2)该存储过程调用了不少系统函数,是个比较经典的例子:
如: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
该参数表示从某操作(如存储过程、内置函数或用户定义的函数)返回的值。
以上就是自己总结的调用存储过程一个小例子,简单易懂。
该参数为输入参数。这是默认设置。 | |
该参数可执行输入和输出。 | |
该参数为输出参数。 | |
该参数表示从某操作(如存储过程、内置函数或用户定义的函数)返回的值。 |
转载于:https://blog.51cto.com/1890146/544152