关于SQL Server 存储过程的一点问题
时间:2010-12-08 来源:DanielWise
打开SQL Server管理平台,展开节点“对象资源管理器”→“数据库服务器”→“可编程性”→“存储过程”,在窗口的右侧显示出当前数据库的所有存储过程。单击鼠标右键,在弹出的快捷菜单中选择“新建存储过程”命令。
Note: 现在你可以从打开的窗口编辑自己的存储过程,但是除非你的存储过程可以执行通过,否则不会被SQL Server添加为一条合法的存储过程。
2. 存储过程该怎么写?
CREATE PROC[EDURE] procedure_name [; number ] //修改procedure_name 为你自己的存储过程名;
[{@parameter data_type }[VARYING] [=default] [OUTPUT]] [, ...n ]
//@parameter 是输入参数名,或输出参数名,可以想象成一个函数的参数。
// data_type 是类型,关于SQL 类型的更多内容请参考MSDN。
// OUTPUT 表明此参数是输入参数还是输出参数。
// 例: @accountName nchar(10)=null, @balance float output
[WITH{ RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [,...n ]
//这里要写你的sql 语句,包括Declare 内部变量,并SET 内部变量的初始值等等。
3. 如何确认我们的存储过程是逻辑上可行的而非仅仅编译可行?
语法:[[EXEC[UTE]]
{[@return_status=] procedure_name [;number]|@procedure_name_var}
// @return_status是存储过程的返回值,procedure_name 是存储过程名字
[[@parameter=]{value|@variable [OUTPUT]|[DEFAULT]][ ,...n ]
//@parameter 为存储过程输入参数, output 表示是输出参数
[WITH RECOMPILE ]
例: Declare @balance float
exec GetBalance 'checking', @balance output
select @balance
4. 我们写的存储过程会出什么问题?
最常见的问题是逻辑不正确,比如自己感觉sql 都正确,但就是不能得到正确结果。这里有一个不具代表性的例子,也许可以正好解决你的问题:
CREATE PROCEDURE GetBalance
@accountName nchar(10), @balance float OUTPUT
AS
SET @balance=(
SELECT amount
FROM AccountInfo
WHERE accountName=@accountName)
执行时@balance一直不能返回Null, 后来发现是由于未对@accountName 进行声明导致的。
5. 如何使用C# 语言调用存储过程?
public static double GetBalance(string accountName) { SqlConnection conn; string cs = ConfigurationManager.ConnectionStrings["sampleDB"].ConnectionString; conn = new SqlConnection(cs); conn.Open(); SqlParameter[] paras = new SqlParameter[2]; paras[0] = new SqlParameter("@accountName", accountName); paras[1] = new SqlParameter("@balance", System.Data.SqlDbType.Float); paras[1].Direction = System.Data.ParameterDirection.Output; SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.CommandText = "GetBalance"; for (int i = 0; i < paras.Length; i++) { cmd.Parameters.Add(paras[i]); } int n = cmd.ExecuteNonQuery(); object o = cmd.Parameters["@balance"].Value; return Convert.ToDouble(o); }