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局部变量,为啥会有有错呢?
...全文
132 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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


27,581

社区成员

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

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