大家快来看一下我这个sql存储过程错在哪里??

来源:百度知道 编辑:UC知道 时间:2024/05/25 17:33:18
drop procedure xgsj

CREATE PROCEDURE xgsj (@table char(15),@phone varchar(15))
as
declare @sql nvarchar(1024)
set @sql='declare my_cursor cursor scroll scroll_locks for select calleecode from '
set @sql=@sql+@table
set @sql=@sql+' order by starttime'
exec(@sql)
open my_cursor
declare @sql2 nvarchar(1024)
declare @calleecode varchar(20)
fetch absolute 2000 from my_cursor into @calleecode
set @sql2='update '+@table+' set calleecode=''+@phone+'' where calleecode=@calleecode'
exec(@sql2)
select @calleecode as '原数据'
close my_cursor
deallocate my_cursor

exec xgsj callout20070401,123456789

编译的时候没有错,但执行exec xgsj callout20070401,123456789的时候,报如下错误
服务器: 消息 137,级别 15,状态 2,行 1
必须声明变量 '@calleecode'。

(所影响的行数为 1 行)
编译的时候是完全正确,但执行的时候就不对了!!

set @sql2='update '+@table+' set calleecode=''+@phone+'' where calleecode=@calleecode'
exec(@sql2)
这句里面的exec 执行语句中用到了@phone,@calleecode变量,但是是在语句里, 应该改成这样
set @sql2='update '+@table+' set calleecode='+quotename(@phone,'''')+' where calleecode='+quotename(@calleecode,'''')
用exec 执行的语句和执行exec 语句所在的语句是在两个域的, 所以变量不能共享,同时象指针, 局部临时表也有这种情况, 看一下help, 搞清楚可见域

exec xgsj 'callout20070401','123456789'

完全正确

没分呀,虽然很简单,但我很懒
给你提示,用这个可以解决,SP_EXECUTESQL
F1帮助里有简单的例子.
楼上那个朋友说的是字符拼接法,也可以不过扩展性不强,
比如实现动态出参,进去的参数出来后要改变.