EXEC()执行Transact-SQL批处理问题

williamxiao 2009-11-26 03:14:26
SQL批处理如下:

DECLARE @OAID varchar(5)--声明流程ID变量
--1.获得OAID
DECLARE @tbid varchar(5)--声明数据流表名中的ID
SET @tbid=20
DECLARE @condition nvarchar(100)--声明流程查询条件
SET @condition='%abc%'
DECLARE @sql nvarchar(1000)--声明sql查询语句
SET @sql='SELECT @OAID=OAID FROM OA_FLOW_'+@tbid+'_Main WHERE FileTile LIKE '''+@condition+''''
print '执行的SQL语句:'+@sql
EXEC(@sql)--执行查询
print '获得的OAID:'+@OAID

错误如下:

执行的SQL语句:SELECT @OAID=OAID FROM OA_FLOW_20_Main WHERE FileTile LIKE '%abc%'
服务器: 消息 137,级别 15,状态 1,行 1
必须声明变量 '@OAID'。

问,批处理中已经声明了@OAID局部变量,为啥会有有错呢?
...全文
195 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bancxc 2009-11-26
  • 打赏
  • 举报
回复
恩 应该用sp_executesql
williamxiao 2009-11-26
  • 打赏
  • 举报
回复
也可以写成如下方式(容易理解点):

DECLARE @OAID varchar(5)--声明流程ID变量
--1.获得OAID
DECLARE @tbid varchar(5)--声明数据流表名中的ID
SET @tbid=20
DECLARE @condition nvarchar(100)--声明流程查询条件
SET @condition='%标准文本合同审批单(王珏, 2009-11-18 14:11)%'
DECLARE @sql nvarchar(1000)--声明sql查询语句
SET @sql='SELECT @OAID=OAID FROM OA_FLOW_'+@tbid+'_Main WHERE FileTile LIKE @condition'
--执行查询
EXEC sp_executesql
@stmt=@sql,
@params=N'@OAID varchar(5) OUTPUT,@condition nvarchar(100)',
@OAID=@OAID OUTPUT,@condition=@condition;
print '获得的OAID:'+@OAID
williamxiao 2009-11-26
  • 打赏
  • 举报
回复
解决了,谢谢icelovey.
解决后的SQL批处理如下:

DECLARE @OAID varchar(5)--声明流程ID变量
--1.获得OAID
DECLARE @tbid varchar(5)--声明数据流表名中的ID
SET @tbid=20
DECLARE @condition nvarchar(100)--声明流程查询条件
SET @condition='%abc%'
DECLARE @sql nvarchar(1000)--声明sql查询语句
SET @sql='SELECT @OAID=OAID FROM OA_FLOW_'+@tbid+'_Main WHERE FileTile LIKE @condition'
--执行查询
EXEC sp_executesql
@sql,
N'@OAID varchar(5) OUTPUT,@condition nvarchar(100)',
@OAID OUTPUT,@condition;
print '获得的OAID:'+@OAID

结果如下:

获得的OAID:1518

参考的资料如下:
1.Exec和sp_executesql的用法区别:http://lqingtao.blog.163.com/blog/static/34192802008111711476947/
2.Transact-SQL 参考 sp_executesql:http://www.yesky.com/imagesnew/software/tsql/ts_sp_ea-ez_2h7w.htm
icelovey 2009-11-26
  • 打赏
  • 举报
回复
2.sq_executesql
a.提供了很强大的借口--避免了串联变量的问题还可以输出LOOK
DECLARE @i AS INT;
SET @i = 10248;

DECLARE @sql AS NVARCHAR(46);
SET @sql = 'SELECT * FROM dbo.Orders WHERE OrderID = @oid;';
-----请注意,上面的@oid就不要在转化成字符串联进去了直接上直接上直接上
EXEC sp_executesql
@stmt = @sql,--这个相当存储过程一个查询主体,就是AS后面的东西
@params = N'@oid AS INT',--这个相当于存储过程的传入参数声明,就是AS前面的东西
@oid = @i;--这里相当于你调用存储过程的时候后面那个参数列表
------这里如果你给@id赋值三个不同的值10348 10349 10897 它为此产生的执行计划只有一个哦~只有一个不是三个!!!节约成本

b.它可以通过传入的参数检查,用来防止SQL注入.
我的理解就是通过传入的参数的长度类型之类的进行判断吧.
icelovey 2009-11-26
  • 打赏
  • 举报
回复
要返回参数的话用这个sp_executesql好点吧
williamxiao 2009-11-26
  • 打赏
  • 举报
回复

SET @sql='SELECT '+@OAID+'=OAID FROM OA_FLOW_'+@tbid+'_Main WHERE FileTile LIKE '''+@condition+''''

这种方法不对,print '获得的OAID:'+@OAID没有结果,空白.
午夜还在张 2009-11-26
  • 打赏
  • 举报
回复
经典
liguoqiang4888 2009-11-26
  • 打赏
  • 举报
回复
DECLARE @OAID varchar(5)--声明流程ID变量
--1.获得OAID
DECLARE @tbid varchar(5)--声明数据流表名中的ID
SET @tbid=20
DECLARE @condition nvarchar(100)--声明流程查询条件
SET @condition='%abc%'
DECLARE @sql nvarchar(1000)--声明sql查询语句
SET @sql='SELECT '+@OAID+'=OAID FROM OA_FLOW_'+@tbid+'_Main WHERE FileTile LIKE '''+@condition+''''
print '执行的SQL语句:'+@sql
EXEC(@sql)--执行查询
print '获得的OAID:'+@OAID
--小F-- 2009-11-26
  • 打赏
  • 举报
回复
SET @sql='SELECT '+@OAID+'=OAID FROM OA_FLOW_'+@tbid+'_Main WHERE FileTile LIKE '''+@condition+'''' 
print '执行的SQL语句:'+@sql
EXEC(@sql)--执行查询
print '获得的OAID:'+@OAID
you_tube 2009-11-26
  • 打赏
  • 举报
回复
sp_executesql
华夏小卒 2009-11-26
  • 打赏
  • 举报
回复

SET @sql='SELECT '+@OAID+'=OAID FROM OA_FLOW_'+@tbid+'_Main WHERE FileTile LIKE '''+@condition+''''
print '执行的SQL语句:'+@sql
EXEC(@sql)--执行查询
print '获得的OAID:'+@OAID


随着通信电子技术的迅速发展,信息技术给家居行业产生了深远的影响,家居环境的智能化监控已经成为智能家居的一个重要的发展方向。人们逐渐对自己的生活提出一种更高的要求,他们需要一种智能化、可交互,并且融合现代创新科技的产品来改善他们的生活环境,使他们生活更加安全、舒适、便捷、智能。本文根据智能家居的发展背景和研究现状,并且从实用性和可行性角度出发,研究设计了一种基于STM32单片机的智能家居系统。该系统由一个多功能综合的技术系统组成,各个多功能子系统间具有协同配合能力。基于STM32单片机实现的功能子系统包括:智能温度检测,智能湿度检测,智能烟雾/火灾检测智能检测,无线传输,人机交互机构,风扇调节,报警模块。 整个系统分为前端51单片机采集板和后端STM32单片机接收板。 采集板使用DHT11温湿度传感器、MQ烟雾传感器完成室内家居环境的采集。然后通过nRFL24L01将采集到的数据发送给后端。接收板使用LCD1602完成数据显示、使用蜂鸣器模块报警,使用风扇驱动模块调节室内家居环境。本文完成了智能家居控制系统前端、后端软硬件的设计,使用Altium designer绘制了电路原理图,使用Keil C完成了51单片机和STM32单片机的编程与调试。 最后,对本文设计的基于STM32的智能家居控制系统进行部署调试。试验结果表明,该系统可成功应用在智能家居环境检测调节和火灾安全防护的领域,可提高家居生活智能化水平。

27,579

社区成员

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

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