CREATE PROCEDURE H_FENYE 
@PAGENUM INT OUTPUT ,--页数
@BG_ID INT,--信息所属的大类
@CURRPAGE INT,--当前页的索引
@PAGESIZE INT--页大小
AS
 DECLARE @SQLTABLE AS NVARCHAR(500)
 SELECT @PAGENUM=COUNT(*) FROM DETAILCLASS WHERE BG_ID=@BG_ID
IF(@PAGENUM=1)
 BEGIN
   SET @SQLTABLE=N'SELECT TOP'+STR(@PAGESIZE)+'* FROM DETAILCLASS WHERE BG_ID='+STR(@BG_ID)
 END
ELSE
 BEGIN
   SET @SQLTABLE=N'SELECT TOP'+STR(@PAGESIZE)+'* FROM DETAILCLASS WHERE (DET_ID>(SELECT MAX(DET_ID) FROM (SELECT TOP' +STR(@PAGESIZE * (@CURRPAGE-1))+'DET_ID FROM DETAILCLASS WHERE BG_ID=STR(@BG_ID) ORDER BY DET_ID)AS T ))WHERE @BG_ID='+STR(@BG_ID)
 END
 EXEC sp_executesql @SQLTABLE
GO
大家帮忙看一下!我在查询分析器里执行了一下,能输出参数,可是老报错说where附近有语法错误

解决方案 »

  1.   

    你可以在exec语句之前加一条语句:
    print @SQLTABLE
    然后在运行这个存储过程,把查询结果中print出来的字符串拷贝到一个新的查询窗口,运行查看一下看结果是否正确。我们一般在写动态sql语句的时候,最好能用print来调试,这样可以解决很多问题。
      

  2.   

    print @SQLTABL
    --check it
      

  3.   

    现在存储过程没问题了!可是我定义的输出参数@PAGENUM在程序里获取不了,老报错说:"未将对象引用之实例",希望大家再帮帮忙!我是不是应该在上面的存储过程的最后加上return @PAGENUM啊?
    我感觉程序应该没问题!
    ....
    SqlParameter[] paras=new SqlParameter[4]
    ...
    paras[3]=new SqlParameter("@PAGENUM",SqlDbType.Int,4,ParameterDirection.OutPut.ToString())
    this.label1.Text=paras[3].value.Tostring();
    ....
    就是label1获取不了值。
      

  4.   

    --简单存储过程如下:
    ----------------------------------------------------------------------------------------
    CREATE PROC P_TEST
    @Name VARCHAR(20),
    @Rowcount INT OUTPUT
    AS
    BEGIN
     SELECT * FROM T_Customer WHERE NAME=@Name
     SET  @Rowcount=@@ROWCOUNT
    END
    GO
    ----------------------------------------------------------------------------------------
    --存储过程调用如下:
    ----------------------------------------------------------------------------------------
    DECLARE @i INT
    EXEC P_TEST 'A',@i OUTPUT
    SELECT @i
    --结果
    /*
    Name       Address    Tel                  
    ---------- ---------- -------------------- 
    A          Address    Telphone(所影响的行数为 1 行)            
    ----------- 
    1(所影响的行数为 1 行)
    */
    ----------------------------------------------------------------------------------------
    --DotNet 部分(C#)
    --WebConfig 文件:
    ----------------------------------------------------------------------------------------
    ......
     </system.web>
     
       <!-- 数据库连接字符串
       -->
     <appSettings>
          <add key="ConnectString" value="server=(local);User ID=sa;Password=;database=Test" />
    </appSettings>
       
    </configuration>
    ----------------------------------------------------------------------------------------
    --C#代码:(用到两个测试控件,DataGrid1(用于显示绑定结果集合),Lable(用于显示存储过程返回单值)
    ----------------------------------------------------------------------------------------
    //添加数据库引用
    using System.Data.SqlClient;
    ......
     private void Page_Load(object sender, System.EventArgs e)
      {
       // 在此处放置用户代码以初始化页面
       String DBConnStr;
       DataSet MyDataSet=new DataSet();
       System.Data.SqlClient.SqlDataAdapter DataAdapter=new System.Data.SqlClient.SqlDataAdapter();
       DBConnStr=System.Configuration.ConfigurationSettings.AppSettings["ConnectString"];
       System.Data.SqlClient.SqlConnection myConnection = new System.Data.SqlClient.SqlConnection(DBConnStr);
       if (myConnection.State!=ConnectionState.Open) 
       {
        myConnection.Open();
       }   
       System.Data.SqlClient.SqlCommand myCommand = new System.Data.SqlClient.SqlCommand("P_Test",myConnection);
       myCommand.CommandType=CommandType.StoredProcedure;
       //添加输入查询参数、赋予值
       myCommand.Parameters.Add("@Name",SqlDbType.VarChar);
       myCommand.Parameters["@Name"].Value ="A";   //添加输出参数
       myCommand.Parameters.Add("@Rowcount",SqlDbType.Int);
       myCommand.Parameters["@Rowcount"].Direction=ParameterDirection.Output;
       myCommand.ExecuteNonQuery();
       DataAdapter.SelectCommand = myCommand;   if (MyDataSet!=null)
       {
         DataAdapter.Fill(MyDataSet,"table");
       }
       
       DataGrid1.DataSource=MyDataSet;
       DataGrid1.DataBind();
       //得到存储过程输出参数
       Label1.Text=myCommand.Parameters["@Rowcount"].Value.ToString();   if (myConnection.State == ConnectionState.Open)
       {
        myConnection.Close();
       }  }
    ----------------------------------------------------------------------------------------
    运行以上代码即可(返回记录集合和存储过程返回值)
      

  5.   

    SET @SQLTABLE=N'SELECT TOP'+STR(@PAGESIZE)+'* FROM DETAILCLASS WHERE (DET_ID>(SELECT MAX(DET_ID) FROM (SELECT TOP' +STR(@PAGESIZE * (@CURRPAGE-1))+'DET_ID FROM DETAILCLASS WHERE BG_ID='+STR(@BG_ID)+' ORDER BY DET_ID)AS T ))WHERE BG_ID='+STR(@BG_ID)
      

  6.   

    如果我定义一个带输出参数的存储过程,那么我在只要把这个输出参数定义成output类型的就可以在程序中获取吗
      

  7.   

    大家好!这个问题又转换了!开始出现
    “SqlParameterCollection 仅接受非空的 SqlParameter 类型对象。参数名: value ”这种错误!
    我真的郁闷坏了!我觉得还是那个输出参数不能输出,我参考了“zlp321002的代码”虽然结果还是不行但我非常感谢大家的帮助,分数已经散出去了,不论得分的还是没得分的我心里都很感谢大家!
    如果大家有时间就再看看我上面刚出现问题!再次感谢