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

w_jlcc 2005-12-22 07:16:47
今天下午碰到个问题:
当用exec sp_executesql向内联表@tablename或临时表#插入数据时,总是报错,调试不过去。请哪位大侠慷慨赐教
...全文
284 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackiecheng001 2005-12-23
  • 打赏
  • 举报
回复
wangtiecheng(cappuccino)
谢谢了
我也学到了不少啊
OracleRoob 2005-12-22
  • 打赏
  • 举报
回复
当字段是字符串时:
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)) + ')'

OracleRoob 2005-12-22
  • 打赏
  • 举报
回复
当字段是日期、字符串时:

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)) + ')'
OracleRoob 2005-12-22
  • 打赏
  • 举报
回复
359687035
w_jlcc 2005-12-22
  • 打赏
  • 举报
回复
我的QQ是2228016在线等到10点,因为晚了要封楼:-(
w_jlcc 2005-12-22
  • 打赏
  • 举报
回复
可我声名时:
declare @cur_sp smallint --current position of sample
declare @cur_day smalldatetime --current day
.....
set @cur_day=DATEADD(day,-1,@D_Day)

明明声名的是短日期型啊
w_jlcc 2005-12-22
  • 打赏
  • 举报
回复
wangtiecheng(cappuccino),兄弟,我按照你的改了一下,当结果总是提示:
服务器: 消息 295,级别 16,状态 3,过程 up_Svm1Train,行 81
从字符串转换为 smalldatetime 数据类型时发生语法错误。
我就是因为今天上午用exec()这种方式出现这个错误才改用exec sp_executesql 的,55555555

要不,兄弟,把你的QQ号告诉我吧,我要崩溃了,29日必须给导师看啊:-(
新鲜鱼排 2005-12-22
  • 打赏
  • 举报
回复
set @dyni_SQL='insert into #tp_res' +
' ('+ @pfname+') values ('''+ @pcur_day+''')'
exec (@dyni_SQL)
因为@pfname和@pcur_day不是作为输出,所以直接使用就可以了。
OracleRoob 2005-12-22
  • 打赏
  • 举报
回复
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)) + ')'

w_jlcc 2005-12-22
  • 打赏
  • 举报
回复
终于逮到个高手肯指点的,下面是我的一个存储过程内的一段代码,帮我看看
临时表时:
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的参数部分把表定义加上也不好使


请指定一、二,深度谢谢
OracleRoob 2005-12-22
  • 打赏
  • 举报
回复
请参考---动态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


27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧