CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

如何用动态SQL向内联表或临时表中更新数据

楼主w_jlcc(距离)2005-12-22 19:16:47 在 MS-SQL Server / 应用实例 提问

今天下午碰到个问题:  
  当用exec   sp_executesql向内联表@tablename或临时表#插入数据时,总是报错,调试不过去。请哪位大侠慷慨赐教 问题点数:40、回复次数:11Top

1 楼wangtiecheng(不知不为过,不学就是错!)回复于 2005-12-22 20:38:28 得分 40

请参考---动态sql语句基本语法    
  1   :普通SQL语句可以用Exec执行    
   
  eg:       Select   *   from   tableName    
                    Exec('select   *   from   tableName')    
                    Exec   sp_executesql   N'select   *   from   tableName'         --   请注意字符串前一定要加N    
   
  2:字段名,表名,数据库名之类作为变量时,必须用动态SQL    
   
  eg:        
  declare   @fname   varchar(20)    
  set   @fname   =   'FiledName'    
  Select   @fname   from   tableName                             --   错误,不会提示错误,但结果为固定值FiledName,并非所要。    
  Exec('select   '   +   @fname   +   '   from   tableName')           --   请注意   加号前后的   单引号的边上加空格    
   
  当然将字符串改成变量的形式也可    
  declare   @fname   varchar(20)    
  set   @fname   =   'FiledName'   --设置字段名    
   
  declare   @s   varchar(1000)    
  set   @s   =   'select   '   +   @fname   +   '   from   tableName'    
  Exec(@s)                                 --   成功    
  exec   sp_executesql   @s       --   此句会报错    
   
   
   
  declare   @s   Nvarchar(1000)     --   注意此处改为nvarchar(1000)    
  set   @s   =   'select   '   +   @fname   +   '   from   tableName'    
  Exec(@s)                                 --   成功            
  exec   sp_executesql   @s       --   此句正确    
   
  3.   输出参数    
  declare   @num   int,    
                  @sqls   nvarchar(4000)    
  set   @sqls='select   count(*)   from   tableName'    
  exec(@sqls)    
  --如何将exec执行结果放入变量中?    
   
  declare   @num   int,    
                                @sqls   nvarchar(4000)    
  set   @sqls='select   @a=count(*)   from   tableName   '    
  exec   sp_executesql   @sqls,N'@a   int   output',@num   output    
  select   @num    
   
   
  Top

2 楼w_jlcc(距离)回复于 2005-12-22 20:51:09 得分 0

终于逮到个高手肯指点的,下面是我的一个存储过程内的一段代码,帮我看看  
  临时表时:  
  DECLARE   ...  
   
  create   table   #tp_res(  
        f1   smalldatetime   NULL,  
        f2   smallint   NULL,  
        f3   float   NULL  
  )  
   
  set   @fname='f1'  
  set   @dyni_SQL='insert   into   #tp_res'   +  
  '   (   @pfname)   values   (   @pcur_day)'  
  exec   sp_executesql   @dyni_SQL,N'@pfname   varchar(10),   @pcur_day   SMALLDATETIME',  
            @fname,   @cur_day  
   
  就这样的临时表,不好使,  
  提示为:  
  服务器:   消息   208,级别   16,状态   3,行   1  
  对象名   '#tp_res'   无效。  
   
  当用表变量时:  
  declare   @tn_talbe   table  
  (  
  tn_date   smalldatetime,  
  tn_sp   int,  
  tn_yval   float  
  )  
   
  set   @fname='f1'  
  set   @dyni_SQL='insert   into   @pptn_talbe'   +  
  '   (   @pfname)   values   (   @pcur_day)'  
  exec   sp_executesql   @dyni_SQL,N'@tn_talbe   talbe,@pfname   varchar(10),   @pcur_day     SMALLDATETIME', @tn_talbe,@fname,   @cur_day  
  也不好使,提示:要先声名变量@tn_talbe    
  哪怕我在动态SQL的参数部分把表定义加上也不好使  
   
   
  请指定一、二,深度谢谢Top

3 楼wangtiecheng(不知不为过,不学就是错!)回复于 2005-12-22 21:06:11 得分 0

DECLARE   @fname   varchar(20),  
  @dyni_SQL   varchar(8000),  
  @pcur_day   varchar(20)  
   
  create   table   #tp_res(  
        f1   smalldatetime   NULL,  
        f2   smallint   NULL,  
        f3   float   NULL  
  )  
   
  set   @fname='f1'  
  set   @dyni_SQL='insert   into   #tp_res'   +   '   (   '   +   @fname   +   ')   values   ('''   +     @pcur_day   +   ''')'  
   
  exec   (@dyni_SQL)  
   
  select   *   from   #tp_res  
   
  drop   table   #tp_res  
   
   
  --需要注意,如果字段是数值型,不要用单引号,其他如字符型和日期型都要单引号即:  
  set   @dyni_SQL='insert   into   #tp_res'   +   '   (   '   +   @fname   +   ')   values   ('   +     cast(@pcur_day   as   varchar(50))   +   ')'  
   
  Top

4 楼dutguoyi(新鲜鱼排)回复于 2005-12-22 21:15:19 得分 0

set   @dyni_SQL='insert   into   #tp_res'   +  
  '   ('+   @pfname+')   values   ('''+   @pcur_day+''')'  
  exec   (@dyni_SQL)  
  因为@pfname和@pcur_day不是作为输出,所以直接使用就可以了。Top

5 楼w_jlcc(距离)回复于 2005-12-22 21:32:06 得分 0

wangtiecheng(cappuccino),兄弟,我按照你的改了一下,当结果总是提示:  
  服务器:   消息   295,级别   16,状态   3,过程   up_Svm1Train,行   81  
  从字符串转换为   smalldatetime   数据类型时发生语法错误。  
  我就是因为今天上午用exec()这种方式出现这个错误才改用exec   sp_executesql   的,55555555  
   
  要不,兄弟,把你的QQ号告诉我吧,我要崩溃了,29日必须给导师看啊:-(Top

6 楼w_jlcc(距离)回复于 2005-12-22 21:35:33 得分 0

可我声名时:  
  declare   @cur_sp   smallint                   --current   position   of   sample  
  declare   @cur_day   smalldatetime   --current   day  
  .....  
  set   @cur_day=DATEADD(day,-1,@D_Day)  
   
  明明声名的是短日期型啊Top

7 楼w_jlcc(距离)回复于 2005-12-22 21:38:06 得分 0

我的QQ是2228016在线等到10点,因为晚了要封楼:-(Top

8 楼wangtiecheng(不知不为过,不学就是错!)回复于 2005-12-22 21:48:45 得分 0

359687035Top

9 楼wangtiecheng(不知不为过,不学就是错!)回复于 2005-12-22 21:51:08 得分 0

当字段是日期、字符串时:  
   
  set   @dyni_SQL='insert   into   #tp_res'   +   '   (   '   +   @fname   +   ')   values   ('''   +     @pcur_day   +   ''')'  
   
  当字段是数值型时:  
  set   @dyni_SQL='insert   into   #tp_res'   +   '   (   '   +   @fname   +   ')   values   ('   +     cast(@pcur_day   as   varchar(50))   +   ')'Top

10 楼wangtiecheng(不知不为过,不学就是错!)回复于 2005-12-22 21:52:20 得分 0

当字段是字符串时:  
  set   @dyni_SQL='insert   into   #tp_res'   +   '   (   '   +   @fname   +   ')   values   ('''   +     @pcur_day   +   ''')'  
   
  当字段是日期时:  
  set   @dyni_SQL='insert   into   #tp_res'   +   '   (   '   +   @fname   +   ')   values   ('''   +     cast(@pcur_day   as   varchar(50))   +   ''')'  
   
   
  当字段是数值型时:  
  set   @dyni_SQL='insert   into   #tp_res'   +   '   (   '   +   @fname   +   ')   values   ('   +     cast(@pcur_day   as   varchar(50))   +   ')'  
       
  Top

11 楼jackiecheng001(想飞,可是没有翅膀)回复于 2005-12-23 15:33:35 得分 0

wangtiecheng(cappuccino)    
  谢谢了  
  我也学到了不少啊Top

相关问题

  • 怎样用sql语句更新数据库,而更新条件是临时表中的数据?急!
  • 临时表更新问题~~~~!谢谢~~~
  • sql临时表的问题
  • 更新表SQL语句
  • Sql Server中怎么利用临时表
  • 在SQL SERVER 里怎样建临时表?
  • 如何删除临时表(SQL Server)
  • sql server临时表的问题
  • 关于SQL临时表的疑问?
  • 关于sql server临时表的应用

关键词

  • 字段
  • 数据
  • 数值
  • dyni
  • pcur
  • fname
  • 表
  • 字符串
  • pfname
  • tp

得分解答快速导航

  • 帖主:w_jlcc
  • wangtiecheng

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo