很久沒用存儲過程了,撈個例子出來剖析剖析,溫習一下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
該參數表示從某操做(如存儲過程、內置函數或用戶定義的函數)返回的值。
以上就是本身總結的調用存儲過程一個小例子,簡單易懂。
該參數爲輸入參數。這是默認設置。 |
|
該參數可執行輸入和輸出。 |
|
該參數爲輸出參數。 |
|
該參數表示從某操做(如存儲過程、內置函數或用戶定義的函數)返回的值。 |