CREATE procedure SBP_tqdj @gzid char(20),@djlxbs char(3) as /***************************************************************/ --过程主题:分店结算 errorID=1500 /***************************************************************/ --每一过程拥有一唯一区界号,过程内的异常编号在此基础上增加 declare @errcode integer set @errcode=1500 declare @return integer /*返回结果的初始化*/ set @return=0 declare @dbname char(20) set @dbname='' select @dbname=case fieldname when 'dbname' then left(fieldvalue,20) else @dbname end from tmp_dj_mast (nolock) where gzid=@gzid and fieldname in ('dbname') if @djlxbs=888 select distinct djbh into #t_djbh from tmp_dj_tdj888 where gzid=@gzid ---回写数据库提取标志 --update a set a.yikaifp='是' from [@dbname].dbo.cwk a,#t_djbh b where a.djbh=b.djbh begin tran tran_fdjs exec(' update a set a.yikaifp=''是'' from '+@dbname+'.dbo.cwk a,#t_djbh b where a.djbh=b.djbh ') drop table #t_djbh err_lab: if @return <100 begin set @return=@errcode +@return rollback tran tran_fdjs end else begin commit tran tran_fdjs end return_lab: return @return GO
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
服务器: 消息 3903,级别 16,状态 1,过程 SBP_tqdj,行 45
ROLLBACK TRANSACTION 请求没有对应的 BEGIN TRANSACTION。
@gzid char(20),@djlxbs char(3)
as
/***************************************************************/
--过程主题:分店结算 errorID=1500
/***************************************************************/
--每一过程拥有一唯一区界号,过程内的异常编号在此基础上增加
declare @errcode integer
set @errcode=1500 declare @return integer /*返回结果的初始化*/
set @return=0 declare @dbname char(20)
set @dbname='' select @dbname=case fieldname when 'dbname' then left(fieldvalue,20) else @dbname end
from tmp_dj_mast (nolock) where gzid=@gzid and fieldname in ('dbname') if @djlxbs=888 select distinct djbh into #t_djbh from tmp_dj_tdj888 where gzid=@gzid ---回写数据库提取标志
--update a set a.yikaifp='是' from [@dbname].dbo.cwk a,#t_djbh b where a.djbh=b.djbh
begin tran tran_fdjs
exec(' update a set a.yikaifp=''是'' from '+@dbname+'.dbo.cwk a,#t_djbh b where a.djbh=b.djbh ') drop table #t_djbh err_lab:
if @return <100
begin
set @return=@errcode +@return
rollback tran tran_fdjs
end
else
begin
commit tran tran_fdjs
end return_lab:
return @return
GO