一种利用EXCEL快速写SQL语句的方法

使用Excel快速生成Sql语句 使用Excel快速生成Sql语句 例如我们想把下边Excel中的数据插入到数据库中,如下图: 数据库的id是自增的,所以都null 接下来开始在Excel中编辑数据 先好模板语句,插入数据库,检查语句是否正确 insert into user values(null,‘测试’,1,‘测试1’,‘1@163.com’); 然后复制这条SQL语句打开Excel,选中表格后的一个单元格,在上方... 阅读详情

复杂的SQL我从不手工写,都是在EXCEL中利用现有的表格直接粘贴到源程序中的,下面我详细介绍这种方法。
下面这个插入过程有没有可读性?要知道每一行'+'号前面的内容都是从现成的EXCEL中直接粘贴过来的,工作量很小。
pu_insert('fhd',[                   //写发货单到数据库中
        '    Fid integer         工厂代号     '+  factid
        '    FHDCode Varchar 20      单据编号     '+  cxbuttonedit1.text
        '    OrderNo Varchar 20  必填 定单编号     '+  cxtextedit3.text
        '    FHDDate datetime        必填 发货日期     '+  pu_today
        '    Remark  Varchar 200     备注     '+  cxtextedit6.text
        '    car Varchar 10      车队代号     '+  cxtextedit1.text
        '    receiverman Varchar 10      收货人      '+  cxtextedit5.text
        '    DeliverTo   Varchar 80      交货地点     '+  cxtextedit2.text
        ]);                             

===========pu_insert过程的delphi源码如下====================
procedure pu_insert(tablename:string;sarr:array of string);
var rets,s,s1,s2:string;i,j,k,m,l:integer;c:char;
begin
rets:='(';l:=high(sarr);
for i:=0 to l do
 begin
    s:=sarr[i];k:=0; s1:='';
    m:=length(s);
    for j:=0 to m do
     begin
        if s[j]=#9 then inc(k) else
           begin
             if k=1 then s1:=s1+s[j];
           end;
     end;
    if i=l then rets:=rets+s1+') values(' else rets:=rets+s1+',';
 end;           //以上取完了所有键名
for i:=0 to l do
 begin
    s:=sarr[i];k:=0; s1:='';s2:='';
    m:=length(s);
    for j:=0 to m do
     begin
        if s[j]=#9 then inc(k) else
           begin
             if k=2 then s1:=s1+s[j];
             if k=11 then s2:=s2+s[j];
           end;
     end;
    c:=upcase(s1[1]);
    if i=l then begin
                   if (c='D') and (s2='') then rets:=rets+' null) ' else  //日期为空时
                   if (c='F') or (c='I') then rets:=rets+s2+') ' else     //数值类型
                   rets:=rets+#39+s2+#39+') ';                            //#39是MSSQL字串分隔符
                end
                   else
                begin
                   if (c='D') and (s2='') then rets:=rets+' null,' else
                   if (c='F') or (c='I') then rets:=rets+s2+',' else rets:=rets+#39+s2+#39+',';
                end;
 end;
if debug then tell('insert into '+tablename+' '+rets);
pu_exec('insert into '+tablename+' '+rets);
end;

我还编了另一个过程pu_update也类似,只是多了一个条件参数,就不介绍了。
因为这种方法在运行时要解释执行,比较慢,正式发布前,我会用另一个工具对源代码进行翻译成真正的SQL,这个工具软件的核心源码摘录如下:
function doinsert2(ss:string):string;
var l:tstringlist;i,j:integer;s:string;st:string;hav:boolean;
    ch:string;label next1,next2,next3;
begin//
try l:=tstringlist.create;
s:='';
for i:=1 to length(ss) do//分行,第一行专用
begin
 if (ss[i]<>#13) and (ss[i]<>#10) then s:=s+ss[i];
 if ss[i]=#13 then begin l.Add(s);s:='' end;
end;
for i:=1 to l.count-1 do//清除第一个'号前的所有字符
  begin
     if l[i][1]='/' then goto next3;
     hav:=false;
     s:='';for j:=1 to length(l[i]) do
           begin
              if l[i][j]=#39 then hav:=true;
              if hav then s:=s+l[i][j];
           end;
    l[i]:=s;
    next3:
  end;
st:='///insert'#13#10+
'pu_exec('#39'insert into '+myfind(ss,12,#39)+' (';
for i:=1 to l.Count-1 do
 begin
   if l[i][1]='/' then goto next1;
   if (i<>l.count-1) and ((i mod 8)=0) then st:=st+#39'+'#13#10#39;
   if i<>l.count-1 then st:=st+mytab(l[i],1)+','
                   else st:=st+mytab(l[i],1)+') values('#39;
 next1:
 end;
for i:=1 to l.Count-1 do
 begin
   if l[i][1]='/' then goto next2;
   st:=st+#13#10;
   if mytab(l[i],2)[1] in ['F','I','f','i'] then ch:='' else ch:='#39+';
   if i<>l.count-1 then st:=st+'+'+ch+mytab(l[i],12)+'+'+ch+#39','#39
                   else st:=st+'+'+ch+mytab(l[i],12)+'+'+ch+#39')'#39')';
 next2:
 end;
result:=st;
finally
l.Free;
end;
end;

function doupdate(ss:string):string;
var l:tstringlist;i,j:integer;s:string;st:string;hav:boolean;
    ch:string;label next1,next2,next3;
begin//
try l:=tstringlist.create;
s:='';
for i:=1 to length(ss) do//分行,第一行专用
begin
 if (ss[i]<>#13) and (ss[i]<>#10) then s:=s+ss[i];
 if ss[i]=#13 then begin l.Add(s);s:='' end;
end;
for i:=1 to l.count-1 do//清除第一个'号前的所有字符
  begin
     if l[i][1]='/' then goto next3;
     hav:=false;
     s:='';for j:=1 to length(l[i]) do
           begin
              if l[i][j]=#39 then hav:=true;
              if hav then s:=s+l[i][j];
           end;
    l[i]:=s;
   next3:
  end;
st:='///update'#13#10+
'pu_exec('#39'update '+myfind(ss,12,#39)+' set '#39;
for i:=1 to l.Count-1 do
 begin
   if l[i][1]='/' then goto next1;
   st:=st+#13#10'+'#39;
   if mytab(l[i],2)[1] in ['F','I','f','i'] then ch:='' else ch:='#39+';
   st:=st+mytab(l[i],1)+'='#39;
   if i<>l.count-1 then st:=st+'+'+ch+mytab(l[i],12)+'+'+ch+#39','#39
                   else st:=st+'+'+ch+mytab(l[i],12)+'+'+ch;
 next1:
 end;
i:=pos(',',l[0]);
st:=st+#39' where '#39'+'+myfind(l[0],i+1,',')+')';
result:=st;
finally
l.Free;
end;
end;
// end of doupdate


function doinsert(ss:string):string;
var st,s,sod,snew:string;i,i1,i2,i3,i4,l:integer;hav:boolean;
begin//
st:=ss;
//开始qkinsert
repeat
i1:=pos('pu_insert('#39,st); if i1<=0 then break;
        sod:='';
        for i:=i1 to length(st) do
          begin
            sod:=sod+st[i];
            if (st[i]=')') and (st[i-1]=']') and ((st[i+1]=';') or (st[i-2]=#10) or (st[i-2]=#13)) then break;
          end;
        snew:=doinsert2(sod);
        st:=stringreplace(st,sod,snew,[rfReplaceAll]);
until 1>2;

//开始qkupdate
repeat
i1:=pos('pu_update('#39,st); if i1<=0 then break;
        sod:='';
        for i:=i1 to length(st) do
          begin
            sod:=sod+st[i];
            if (st[i]=')') and (st[i-1]=']') and ((st[i+1]=';') or (st[i-2]=#10) or (st[i-2]=#13)) then break;
          end;
        snew:=doupdate(sod);
        st:=stringreplace(st,sod,snew,[rfReplaceAll]);
until 1>2;
result:=st;
end;

procedure TForm1.Button11Click(Sender: TObject);label lb1;
var
  sr: TSearchRec;
  i1,FileAttrs,i: Integer;
  t,f:file;
  a:array[1..1000000]of char;s1,fff:string;
  st:string;stin:string;
begin
 if open1.Execute=false then exit;
 s1:=open1.FileName;
 memo2.text:=''; FileAttrs :=  faAnyFile;
 s1:=extractfilepath(s1);//showmessage(s1);exit;
 if FindFirst(s1+'*.pas',FileAttrs, sr) = 0 then
      repeat
       if sr.attr=fareadonly then begin memo2.text:=memo2.text+'操作失败:';goto lb1 end;
       if sr.attr=faVolumeID then begin memo2.text:=memo2.text+'操作失败:'; goto lb1 end;
       if sr.attr=fadirectory then begin memo2.text:=memo2.text+'操作失败:'; goto lb1 end;
       assignfile(t,s1+sr.Name);
       reset(t,1);
       blockread(t,a,1000000,i1);
       closefile(t);
       if i1>=1000000 then begin memo2.text:=memo2.text+'文件太大,操作失败';goto lb1 end;
       if i1>0 then
         try
         stin:='';
         for i:=1 to i1 do stin:=stin+a[i];
         if deb=10 then showmessage('in          '+stin);
         st:=doinsert(stin);
         if deb=10 then showmessage('out            '+st);
         assignfile(f,s1+sr.Name);
         rewrite(f,1);
         blockwrite(f,st[1],length(st));
         closefile(f);
         except
           memo2.Text:=memo2.text+'打开失败:'
         end;
 lb1:  memo2.Text:=memo2.text+sr.name+#13#10;
       application.ProcessMessages;
       until FindNext(sr) <> 0;
end;

我是这样写复杂的查询语句的,如我编了一个查询当前发库的窗口,源程序主体(下例中的前16行)也是从EXCEL排好版粘过来,
注意这个示例中不仅生成了SQL,而且还设定了dbgrid1的各字段的宽度,及字段的中文名。也就是说它的数据显示随源程序而变。
t.s_add(1,'s','','a.trnno','发货单号',90,'','','','');
t.s_add(1,'s','','a.orderno','订单号',90,'','','','');
t.s_add(1,'s','','c.branchcode','分公司',61,'','','','');
t.s_add(1,'s','','month(a.times)','月份',60,'','','','');
t.s_add(1,'s','','a.times','发货日期',75,'','','','');
t.s_add(1,'s','','upper(b.modleserial)','系列',60,'','','','');
t.s_add(1,'s','','a.k_modle','成品型号',100,'','','','');
t.s_add(1,'s','','b.modlesm','成品说明',100,'','','','');
t.s_add(1,'s','','(-a.qty)','发货数量',75,'','','','');
t.s_add(1,'s','','a.n_ccj','标准出厂价',85,'','','','');
t.s_add(1,'s','','(-a.qty * a.n_ccj)','出厂价总额',130,'','','','');
t.s_add(1,'s','','b.factoryprice','当前出厂价',85,'','','','');
t.s_add(1,'s','','(-a.qty * b.factoryprice)','当前价总额',130,'','','','');
t.s_add(1,'s','','a.realccj','订单出厂价',85,'','','','');
t.s_add(1,'s','','(-a.qty * a.realccj)','订单价总额',130,'','','','');
t.s_add(1,'s','','d.remark','备注',150,'','','','');
t.s_add(1,'f','','chg_stkcrd a,modle b,orders c,fhd d','',0,'','','','');
t.s_add(1,'w','','','',0,'','','','a.k_modle=b.modle and a.k_fid='+_factid+' and a.trntype='#39'发货'#39
              +' and a.orderno=c.orderno and a.trnno=d.fhdcode');
t.s_add(1,'w','cxbuttonedit2','a.k_modle','',0,'=',#39,#39,'');
t.s_add(1,'w','cxbuttonedit1','b.modlesm','',0,'like',#39'%','%'#39,'');
t.s_add(1,'w','cxbuttonedit7','b.modleserial','',0,'=',#39,#39,'');
t.s_add(1,'w','cxtextedit5','(-a.qty)','',0,'>=','','','');
t.s_add(1,'w','cxtextedit4','(-a.qty)','',0,'<=','','','');
t.s_add(1,'w','cxdateedit1','a.times','',0,'>=',#39,#39,'');
t.s_add(1,'w','cxdateedit2','a.times','',0,'<=',#39,c59+#39,'');
t.s_add(1,'w','cxbuttonedit3','a.trnno','',0,'=',#39,#39,'');
t.s_add(1,'w','cxbuttonedit5','a.orderno','',0,'=',#39,#39,'');
t.s_add(1,'w','cxbuttonedit6','c.branchcode','',0,'=',#39,#39,'');
pu_cdsql(q1,t.s_getsql(1)); //执行SQL并放在cd1这个内存表中
t.S_GridWidth(1,dbgrid1);   //设dbgrid1各个字段的宽度
其中T是一个专用于生成SQL的对象(源代码较长,略过),其运行画面及产生的SQL语句见此blog后附的图片http://blog.csdn.net/images/blog_csdn_net/zhangrex/29359/r_exceltosql.jpg
总之我这种方法写SQL,非常快,而且维护方便,编一个查询窗口总共不到50行代码就完事了。

雷电模拟器安装面具环境并过软件检测系列(看这一篇就够了!) 雷电模拟器安装面具环境并过基本软件的环境检测 阅读详情

相关推荐

无线控制的隐形桥梁:深入解析NRF24L01在电机控制中的数据传输艺术

本文深入解析NRF24L01无线模块在电机控制中的数据传输技术,涵盖通信机制优化、抗干扰策略及实时性保障。通过舵机和无刷电机的实战案例,展示如何构建稳定高效的无线控制系统,为嵌入式开发提供完整解决方案。

j7k8l的博客 307

Excelsql语句

1、点击行最后的空白格输入sql,例如="insert into xxx (xh,name,pwd) values ( __,'"&&"','"&&"') ;" 2、光标放在&&之间,然后点击此行数据中对应的格子即可 3、如果想要自动生成id,mysql数据库可以使用UUID()代替__,Oracle数据库使用sys_guid()代替__,SQL...

zhx0114的博客 1万+

全民所有自然资源资产清查实物量整合工作交流会会议-20211029上午.zip

全民所有自然资源资产清查实物量整合工作交流会会议-20211029上午

Excel中使用SQL语句的四种方法

总结在 Excel 中使用 SQL 语句的四种方法,各个方法都有各自的适用场景,可以选择自己熟悉的方式,或者用自己觉得简单的方式。本文以在 Excel 中操作 MS SQL 数据库的数据为例进行说明。MS SQL 的数据如下,使用微软 SQLExpress 版本。

王敏的专栏 1万+

使用Excel生成sql脚本(insert/update/delete)

使用Excel生成sql脚本(insert/update/delete)

Javaの甘乃迪的博客 1万+

Excel中使用SQL语言

在学会VS操作MySQL数据库后,相信很多人都会想说试一试用VS来操作Excel,毕竟Excel也是一个数据库而且更常用,更方便。确实,这是可以实现的,这里有参考的网站,亲测可用,所有这里就不多做解释了。 https://www.cnblogs.com/MirageFox/p/4919672.html 但是过其他数据库连接的朋友,应该都知道,在查询和增删改的时候,SQL语言很重要,错了,程序就无法正常运行,常常想要查询的表格出不来,也没有增删改成功。我个人的经验是从MySQL那边调试完正确的SQ...

weixin_42405102的博客 1万+

使用Excel批量生成SQL语句,用过的人都说好

Excel的公式自动生成想必大家都知道了,就是好一个公式后直接往下拖,就可以将后面数据的公式自动生成。今天我们就用这个功能来快速生成SQL语句

主要分享测试的学习资源,帮助快速了解测试行业,帮助想转行、进阶、小白成长为高级测试工程师。 4171

使用Excel快速生成SQL语句,用过的人都说好

点击关注上方“SQL数据库开发”,设为“置顶或星标”,第一时间送达干货Excel的公式自动生成想必大家都知道了,就是好一个公式后直接往下拖,就可以将后面数据的公式自动生成。今天我们就用...

SQL数据库开发 1418

excel生成mysql语句_如何用Excel快速生成SQL语句,用过的人都说好

Excel的公式自动生成想必大家都知道了,就是好一个公式后直接往下拖,就可以将后面数据的公式自动生成。今天我们就用这个功能来快速生成SQL语句。导入Excel数据Excel的数据有多种方式,这里我们演示用SQL代码导入Excel中的数据。例如我们想把左边Excel中的数据插入到数据库中,如下图:好模板语句我们可以先一条插入语句,如下:INSERT INTO Person VALUES(1,'...

weixin_31265041的博客 551

tp5循环查询语句_如何用Excel快速生成SQL语句,用过的人都说好

Excel的公式自动生成想必大家都知道了,就是好一个公式后直接往下拖,就可以将后面数据的公式自动生成。今天我们就用这个功能来快速生成SQL语句。导入Excel数据Excel的数据有多种方式,这里我们演示用SQL代码导入Excel中的数据。例如我们想把左边Excel中的数据插入到数据库中,如下图:好模板语句我们可以先一条插入语句,如下:INSERT INTO Person VALUES(1,'...

weixin_36411269的博客 225

快速入行软件测试行业+功能测试必备技能+测试用例快速 】--保姆级教程

功能测试是软件测试中最重要的一部分,旨在验证软件系统的各项功能是否按照需求规格说明书的要求正常工作。以下是快速入门功能测试所需的技能、操作步骤、SQL语句和用例撰方法SQL(结构化查询语言)是与数据库交互的标准语言。功能测试中,SQL常用于验证数据的准确性和完整性。:用户已注册且记得邮箱地址。

Dreams°的博客 1112

如何快捷高效的sql建表语句

Excel中,连接字符串使用的是&符号,因此我们可以在D2单元格中将A2B2C2连接起来形成一串字符。首先我们将建表需要的字段在EXCEL中罗列,这个肯定要自己吧,这个总不能自己生成对吧。然后我们在后面出字段类型,大多数字段类型都是varchar(255)吧,接下来点击D2单元格按住加号往下拖就可以直接生成所有的建表语句。如图所示,接下来我们就可以excel公式自动生成建表语句拉。如果你还想在语句中添加其他关键字同理。接下来字段注释,这个也得自己吧这个真生成不了,

qq_31727471的博客 652

如何成功把EXCEL表的数据导入到SQL数据库,代码如何编

/*===================   导入/导出 Excel 的基本方法 ===================*/从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句:/*===================================================================*/--如果接受数据导入的表已经存在insert into 表

szg3827的专栏 842

如何用Excel快速生成SQL语句,用过的人都说好

导读:Excel的公式自动生成想必大家都知道了,就是好一个公式后直接往下拖,就可以将后面数据的公式自动生成。今天我们就用这个功能来快速生成SQL语句。作者:丶平凡世界来...

大数据 1616

Excel分割获取指定内容(获取修改批量的sql语句

例如: 修改数据插入语句(删除中间的数据库名称) 步骤一、将内容复制到A列,选中A列。通过 Excel的【数据-分列】操作。通过设定分割符号或者固定长度进行分割。(此处为利用分割符号‘.’进行分割。获取到‘.’后面到内容为B列何C列)。 步骤二、在D列入算法:‘=LEFT(A:A,11)’,获取A列从左开始前11个字符。 步骤三、在E列入算法:‘=D:D&B:B&C:C’,获取D列+B列+C列的拼接数据。则E列为我所需数据。如下图: ...

ZJLOVE的博客 280

利用Excel中CONCATENATE函数生成SQL语句

Excel动态生成SQL语句 记录一下Excel比较有实用性的技巧,后续碰到了再补充。 Excel动态生成SQL语句 情形:最近接到了一个需求,有一个excel文件,上面是需要建表通过程序去维护的字段,表是建好了,但是数据较多,如何快速的导入表中呢? excel中的CONCATENATE函数可以帮助我们批量生成SQL,从而快速将数据导入表中。 以下是百度百科上CONC...

wangzhihao的博客 3065
上一篇: 一种基于组件的跨WEB/手机/WINDOS/UNIX平台的多层开发框架构思
下一篇: 打算用Java+Delphi作个自已的RIA
zhangrex
博客等级 码龄22年 17粉丝 9原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值