CREATE PROCEDURE jing @aName Char(40) @aStr Char(1) 
OutPut AS IF @aName = '古董' BEGIN @aStr = 'Y' END SELECT *
                                                                       FROM Glass_Price
                                                                       WHERE Price_Name = @aName
                                                                              GO这样一个存储过程在SQL Server 2000里编译没有通过!请教错在那儿!
另外:请问,同样一个Insert语句带十几个参数,是放在程序里执行效率高呢?还是写成存储过程,在程序里调用效率高!

解决方案 »

  1.   

    还有,差点忘了!哈哈就是
    Adoquery.sql.add(sSQL)//-------以上的语句
    问题是:@aStr Char(1)这个返回参数怎么样取出来!
      

  2.   

    CREATE PROCEDURE jing 
                         @aName Char(40) ,
                        @aStr Char(1)  OutPut 
    AS 
    IF @aName = '古董' 
    BEGIN 
       select @aStr = 'Y' 
    END 
    SELECT *  FROM Glass_Price  WHERE Price_Name = @aName
    return
      

  3.   

    改成这样:
    CREATE PROCEDURE jing @aName Char(40), @aStr Char(1) 
    OutPut AS
    IF @aName = '古董' 
    BEGIN 
    select @aStr = 'Y' 
    END 
    SELECT *
    FROM Glass_Price
    WHERE Price_Name = @aName
    go
      

  4.   

    取返回参数:
    declare @str char(1) 
    exec jing 'aa', @str output
    select @str
      

  5.   

    程序中得到输出参数的值:
    edit1.text:=adostroproc.params[1].value;//1为参数序号
     
     
                                                                           
                                                                            
                                                                                 
      

  6.   

    to: pandarus(Delphi里流浪的云) 关键我没有用adostroproc,我直接在adoquery里写SQL的!
      

  7.   

    也就是adoquery执行后,取出返回的值
      

  8.   

    都是一样的,因为你在存储过程中宝岛了两个参数
    在Adoquery中连接此存储过程也会有两个参数,第二个就是你要的输出参数
    即edit1.text:=adoquery.params[1].value
      

  9.   

    adoquery.fields[i].value;//这样也可以的吧。
      

  10.   

    另外:请问,同样一个Insert语句带十几个参数,是放在程序里执行效率高呢?还是写成存储过程,在程序里调用效率高!
      

  11.   

    ---- 多个参数间以逗号分开 ----
    CREATE PROCEDURE jing
      @aName Char(40)
      ,@aStr Char(1) OutPut
    AS
      IF @aName = '古董'
        @aStr = 'Y'
      ELSE
        @aStr = 'N'
      SELECT * FROM Glass_Price WHERE Price_Name = @aName
    GO
    -----------------------------
    当ADOQuery被执行后,它的Parameters.ParamByName('@aStr').Value 就会返回Y或N了
    -------------------------
    另外:请问,同样一个Insert语句带十几个参数,是放在程序里执行效率高呢?还是写成存储过程,在程序里调用效率高
    明确地告诉你,放在存诸过程里效率高,高得多,我测试过的,速度提高N倍。
      

  12.   

    to SeaWave(NoSound) :
      sSQL:='Exec Jing ''古董'','''' ';
      with Frm_Data.ADOQuery do
        begin
          Close;
          SQL.Clear;
          SQL.Add(sSQL);
          Open;
          a:=Frm_data.ADOQuery.Parameters.ParamByName('@aStr').Value ;///------这儿报错!说@aStr没有找到!我换了aStr也试过了,也是这样!
          ShowMessage(a);
      

  13.   

    你弄混淆了,把存储过程与直接的SQL语句弄混了。
    在调用存储过程时,如果该存储过程不返回数据集,最好用ADOCommand,这是效率最高的,就算是要返回数据集,只要不是非得让它兼容TDataSet(也就是说不需要绑定数据敏感控件)的话,用ADOCommand也是最好的,它会返回_Recordset。
    言归正转:
    ADOCommand1.CommandType := cmdStoreadProc;   //是调用存储过程
    ADOCommand1.CommandText := 'jing';           //存储过程名是jing
    ADOCommand1.Parameters.Refresh;              //从服务器取得参数详情
    ADOCommand1.Parameters.ParamByName('@aName').Value := 'xxxx';
    ADOCommand1.Parameters.ParamByName('@aStr').Value := ' ';
    ADOCommand1.Execute;
    ShowMessage(ADOCommand1.Parameters.ParamByName('@aStr').Value);
      

  14.   

    最好用ADOStoredProc
    如果确实要用adoquery ,则:
      with adoquery1 do
      begin
        sql.Clear;
        sql.Add('declare @str char(1)');
        sql.Add('exec jing ''古董'', @str output');
        sql.Add('select @str');
        open;
      end;
      showmessage(adoquery1.Fields[0].value);