delphi+SQL2000数据库编程,对存储过程不很熟悉,
想通过存储过程来处理然后显示某个数据集,但字符表示很长,想用个变量来先赋值然后再加进语句,
怎么写?给个例子看看如在Delphi 表示为:
str1:='if object_id(''tempdb..#TONE'') is not null   drop table #TONE  select ...'
     +'...';  with ADOQuery2 do
      begin
       close();
        SQL.Clear;
        SQL.Text:=str1;
      ExecSql;
      end;

解决方案 »

  1.   

    用ADOStoredProc
    form show:
    procedure TfQuery.FormShow(Sender: TObject);
    begin
      with self.adopItem do
      begin
        ProcedureName := 'myproc001';
        Parameters.Clear;
        Parameters.CreateParameter('@fdate1',ftDateTime,pdinput,8,'1900-01-01');
        Parameters.CreateParameter('@fdate2',ftDateTime,pdinput,8,'3000-01-01');
        Parameters.CreateParameter('@fitem1',ftWideString,pdinput,40,'abcdefgh');
        Parameters.CreateParameter('@fitem2',ftWideString,pdinput,40,'abcdefgh');
        Parameters.CreateParameter('@finvcode1',ftWideString,pdinput,40,'abcdefgh');
        Parameters.CreateParameter('@finvcode2',ftWideString,pdinput,40,'abcdefgh');
      end;
    end;query click:
    procedure TfQuery.BitBtn1Click(Sender: TObject);
    begin
      with self.adopItem do
      begin
        Close;
        Parameters.ParamByName('@fdate1').Value := strtodate(self.dtp1.Text);
        Parameters.ParamByName('@fdate2').Value := strtodate(self.dtp2.Text);
        Parameters.ParamByName('@fitem1').Value := trim(self.edtItem1.Text);
        Parameters.ParamByName('@fitem2').Value := trim(self.edtItem2.Text);
        Parameters.ParamByName('@finvcode1').Value := trim(self.edtNumber1.Text);
        Parameters.ParamByName('@finvcode2').Value := trim(self.edtNumber2.Text);
      end;
    end;
      

  2.   

    含参赋值吧,不懂DEPHI,不过和。NET的写法差不多.
      

  3.   


    我主要是请教在SQL2000下如何创建
      

  4.   


    Create proc SeachSP
    @table nvarchar(400),
    @selectStr nvarchar(4000),
    @whereStr nvarchar(4000)
    as
    declare @Str varchar(8000)
    set @str=@selectStr+' ' + @table+ ' '+@whereStr
    exec(@str)exec SeachSP 'csms_imei_time','select * from','where CreateDATE>=''2009-06-30'''------------------结果------------
    36099 352022030571069   NULL 2010-10-16 21:03:00 2009-07-06 10:25:00 1 0 2009-04-17 21:03:00 1
    3575 352022030571077   NULL 2010-02-16 18:04:00 2009-07-06 10:25:00 1 0 2009-02-17 18:04:00 NULL
    31193 352022034348076   NULL 2010-04-12 15:31:00 2009-07-06 10:25:00 1 0 2009-04-13 15:31:00 NULL
    32679 352965035256682   NULL 2010-04-13 20:59:00 2009-07-06 10:25:00 1 0 2009-04-14 20:59:00 NULL
    34282 353798020185866   NULL 2010-04-15 10:41:00 2009-07-06 10:25:00 1 0 2009-04-16 10:41:00 NULL
    36306 353798020185940   NULL 2010-04-16 23:24:00 2009-07-06 10:25:00 1 0 2009-04-17 23:24:00 NULL
    34898 353798020187896   NULL 2010-04-15 20:41:00 2009-07-06 10:25:00 1 0 2009-04-16 20:41:00 NULL
    35179 353798020188027   NULL 2010-04-16 00:12:00 2009-07-06 10:25:00 1 0 2009-04-17 00:12:00 NULL
    32793 353798020192144   NULL 2010-04-13 22:33:00 2009-07-06 10:25:00 1 0 2009-04-14 22:33:00 NULL
    36332 353798020194322   NULL 2010-04-16 23:42:00 2009-07-06 10:25:00 1 0 2009-04-17 23:42:00 NULL
    35065 353798020195774   NULL 2010-10-15 00:00:00 2009-07-06 10:25:00 1 0 2009-07-13 00:00:00 1
    23260 354011001138001   NULL 2010-08-17 00:00:00 2009-07-06 10:25:00 1 0 2009-07-10 00:00:00 1
    23261 354011001138002   NULL 2010-02-25 00:00:00 2009-07-06 10:25:00 1 0 2009-07-12 00:00:00 NULL
    36618 354011001347005 2009-01-31 00:00:00 2010-05-03 00:00:00 2009-07-06 13:47:00 0 1 NULL NULL
    36656 354011001506003 2009-03-28 00:00:00 2010-07-01 00:00:00 2009-07-15 15:07:00 1 1 2009-07-02 00:00:00 NULL
    36678 354011001873669 NULL 2011-01-13 00:00:00 2009-07-17 13:23:00 1 0 2009-07-14 00:00:00 1
      

  5.   


    差不多是你这样吧,但你举的例子下面这句有些不明白
    'csms_imei_time'指什么意思?
    'select * from','where CreateDATE>=''2009-06-30'''这些都不是完整的语句啊
    exec SeachSP 'csms_imei_time','select * from','where CreateDATE>=''2009-06-30'''
      

  6.   

    哦,我来解释一下。Create proc SeachSP  --这是一个存储过程的命名
    @table nvarchar(400), --实际上这里是用来传表名的,就是你数据表的名字 select * from tb1 where 1=1
    @selectStr nvarchar(4000), --这个是查询语句 就是 select -- from 这一段,中间的--表示你要查的字段 select * from tb1 where 1=1
    @whereStr nvarchar(4000) --这个实际是 select * from tb1 where 1=1(标记红色的这一段的SQL代码)
    as
    declare @Str varchar(8000)
    set @str=@selectStr+' ' + @table+ ' '+@whereStr
    exec(@str)
      

  7.   


    Create proc SeachSP这是一个存储过程的命名@table nvarchar(400), 实际上这里是用来传表名的,
    就是你数据表的名字 select * from tb1 where 1=1@selectStr nvarchar(4000),这个是查询语句 就是 select -- from 这一段,
    中间的--表示你要查的字段 select * from tb1 where 1=1@whereStr nvarchar(4000) 这个实际是 select * from tb1 where 1=1
    (标记红色的这一段的SQL代码)as
    declare @Str varchar(8000)  --这里自定一个接受所有字符串的参数
    set @str=@selectStr+' ' + @table+ ' '+@whereStr这里其实就是将 前3个所说的参数拼起来,做一个查询语句
    例如:@str='select * from' +' ' + 'tb1'+ ' '+'where 1=1'exec(@str)将拼起来的SQL语句执行!
      

  8.   

    哦,我来解释一下。
    SQL codeCreateproc SeachSP--这是一个存储过程的命名@tablenvarchar(400),--实际上这里是用来传表名的,就是你数据表的名字 select * from tb1 where 1=1@selectStrnvarchar(4000),--这个是查询语句 就是 select -- from 这一段,中间的--表示你要查的字段 select * from tb1 where 1=1@whereStrnvarchar(4000)--这个实际是 select * from tb1 where 1=1(标记红色的这一段的SQL代码)asdeclare@Strvarchar(8000)set@str=@selectStr+''+@table+''+@whereStrexec(@str)
    [/Quote]可能我说的不够明白,是这样的,我的过程很简单,只是说我的语句很长,要在过程里用一个变量表示
    简单点举例吧,我的本意是要在SQL2000里建立一个存储过程,然后在Delphi直接调用,比如不考虑语句如何复杂的情况下过程应该是这样建立CREATE PROCEDURE TELEPRO AS
    select *
    from ta1
    GO现在关键是我的语句不是 select * from ta1 那么简单
    我要用一个字符串表示,如str='select * from ta1'那么如何在SQL2000建立一个带变量的过程,至于字符串的赋值我是在delphi里面事先赋值,
    等到程序运行时,我再把这个变量赋值给存储过程的变量,就这样简单
      

  9.   

    我上面的那个存储过程可以实现。只是你要传3个参数。
    理解了么?3个参数合起来就是等于你的 如str='select * from ta1' 这个意思
    理解?只不过我把你原本需要传一个参数的分开了。
    第1个是个表名称,就是你需要查的那个表名第2个是传 select * from 这一段的,这一快你可以写:
    select id,……………… from
    第3个是传where 1=1 查询条件的这一段。
    如果你没有查询条件,可以赋个空的变量过去。