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

w_jlcc 2005-12-22 07:16:47
今天下午碰到个问题:
当用exec sp_executesql向内联表@tablename或临时表#插入数据时,总是报错,调试不过去。请哪位大侠慷慨赐教
...全文
298 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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


目录 致谢 引言 第1章 T-SQL查询和编程基础  1.1 理论背景  1.2 SQL SERVER体系结构  1.3 创建和定义数据完整性  1.4 总结 第2章 单查询  2.1 SELECT语句的元素  2.2 谓词和运算符  2.3 CASE达式  2.4 NULL值  2.5 同时操作(ALL-AT-ONCE OPERATION)  2.6 处理字符数据  2.7 处理日期和时间数据  2.8 查询元数据  2.9 总结  2.10 练习  2.11 解决方案 第3章 联接查询  3.1 交叉联接  3.2 内联接  3.3 特殊的联接实例  3.4 外联接  3.5 总结  3.6 练习  3.7 解决方案 第4章 子查询  4.1 独立子查询  4.2 相关子查询  4.3 高级子查询  4.4 总结  4.5 练习  4.6 解决方案 第5章 达式  5.1 派生  5.2 公用达式(CTE)  5.3 视图  5.4 内联值函数  5.5 APPLY运算符  5.6 总结  5.7 练习  5.8 解决方案 第6章 集合运算  6.1 UNION(并集)集合运算  6.2 INTERSECT(交集)集合运算  6.3 EXCEPT(差集)集合运算  6.4 集合运算的优先级  6.5 避开不支持的逻辑查询处理  6.6 总结  6.7 练习  6.8 解决方案 第7章 透视、逆透视及分组集    7.1 透视转换  7.2 逆透视转换  7.3 分组集  7.4 总结  7.5 练习  7.6 解决方案 第8章 数据修改  8.1 插入数据  8.2 删除数据  8.3 更新数据  8.4 合并数据  8.5 通过达式修改数据  8.6 带有TOP选项的数据更新  8.7 OUTPUT子句  8.8 总结  8.9 练习  8.10 解决方案 第9章 事务和并发  9.1 事务  9.2 锁定和阻塞  9.3 隔离级别  9.4 死锁  9.5 总结  9.6 练习 第10章 可编程对象  10.1 变量  10.2 批处理  10.3 流程控制元素  10.4 游标  10.5 临时  10.6 动态SQL  10.7 例程  10.8 错误处理  10.9 总结
注:分二卷,点击上传者查看第二卷地址。亲,本人纯手工添加了书签哦!!方便阅读  《Microsoft SQL Server 2008技术内幕:T-SQL语言基础》是Microsoft SQL Server 2008系列的一本。书全面深入地介绍了T-SQL的基本元素,以及SQL Server 2008新增加的一些特性。主要包括SQL的基础理论、逻辑查询处理、SELECT查询、连接和子查询、达式、过滤和分组、透视转换、修改数据、事务和一致性的处理、可编程对象等内容。   书并非系统地罗列T-SQL的各种语法元素,而是结合实践的各种问题,教读者如何用SQL作为语言工具来思考问题,揭示基于集合查询的强大威力。本书内容丰富、文字简洁明快,列举的实例具有一定的难度,而且实用性较强,可以把它们作为解决实际问题的标准模板。阅读本书,可以充分地理解T-SQL语言和获得良好的编程实践,学会如何编写更加有效而强大的查询。书大部分章节后面都提供了练习题目,可以帮助读者更好地掌握所学的内容。   《Microsoft SQL Server 2008技术内幕:T-SQL语言基础》适合须要学习T-SQL的各级程序员和数据库专业人员,是他们快速掌握T-SQL的必备参考图书。 致谢 引言 第1章 T-SQL查询和编程基础 1.1 理论背景 1.2 SQL SERVER体系结构 1.3 创建和定义数据完整性 1.4 总结 第2章 单查询 2.1 SELECT语句的元素 2.2 谓词和运算符 2.3 CASE达式 2.4 NULL值 2.5 同时操作(ALL-AT-ONCE OPERATION) 2.6 处理字符数据 2.7 处理日期和时间数据 2.8 查询元数据 2.9 总结 2.10 练习 2.11 解决方案 第3章 联接查询 3.1 交叉联接 3.2 内联接 3.3 特殊的联接实例 3.4 外联接 3.5 总结 3.6 练习 3.7 解决方案 第4章 子查询 4.1 独立子查询 4.2 相关子查询 4.3 高级子查询 4.4 总结 4.5 练习 4.6 解决方案 第5章 达式 5.1 派生 5.2 公用达式(CTE) 5.3 视图 5.4 内联值函数 5.5 APPLY运算符 5.6 总结 5.7 练习 5.8 解决方案 第6章 集合运算 6.1 UNION(并集)集合运算 6.2 INTERSECT(交集)集合运算 6.3 EXCEPT(差集)集合运算 6.4 集合运算的优先级 6.5 避开不支持的逻辑查询处理 6.6 总结 6.7 练习 6.8 解决方案 第7章 透视、逆透视及分组集 7.1 透视转换 7.2 逆透视转换 7.3 分组集 7.4 总结 7.5 练习 7.6 解决方案 第8章 数据修改 8.1 插入数据 8.2 删除数据 8.3 更新数据 8.4 合并数据 8.5 通过达式修改数据 8.6 带有TOP选项的数据更新 8.7 OUTPUT子句 8.8 总结 8.9 练习 8.10 解决方案 第9章 事务和并发 9.1 事务 9.2 锁定和阻塞 9.3 隔离级别 9.4 死锁 9.5 总结 9.6 练习 第10章 可编程对象 10.1 变量 10.2 批处理 10.3 流程控制元素 10.4 游标 10.5 临时 10.6 动态SQL 10.7 例程 10.8 错误处理 10.9 总结 附录A SQL SERVER使用入门 索引

27,582

社区成员

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

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