关于SQL Server 存储过程的一点问题

1. 如何使用SQL Server 生成一条存储过程?

   打开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);
        }


作者:DanielWise
出处:http://www.cnblogs.com/danielWise/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/danielWise/p/1900548.html