exec执行问题

hhmyz 2006-08-15 05:06:11
ALTER procedure line_tran @linesum int,@comp_no int,@forth_num int,@tbl_name varchar(20),@yearper int
as
truncate table temp1
declare @objid int,@line_temp int,@sqlstr1 varchar(4000),i int,@j int
select @objid = id from sysobjects where id = object_id(@tbl_name)
set @sqlstr1='insert into tbltemp(project) select top '+cast(@linesum as varchar)+' name from syscolumns where id = @objid order by colid'
exec (@sqlstr1)
---------此时说@objid没有声明
set @i=1
set @sqlstr1='declare '
while @i<=@linesum
begin
if @i=1
set @sqlstr1=@sqlstr1+'@cur_prf'+cast(@i as varchar)+' varchar(30)'
else
set @sqlstr1=@sqlstr1+',@cur_prf'+cast(@i as varchar)+' varchar(30)'

set @i=@i+1
end
exec (@sqlstr1)此后说@cur_prf1等没有定义。
EXEC会有这些限制吗?在里面运行不能有变量,里面也不能定义变量?
记得以前不是这样的,我的系统是:win2003,SQL2000看版本时是:Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
应是比较新的补丁了。

...全文
232 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bonjourSQL 2006-08-16
  • 打赏
  • 举报
回复
用sp_executesql动态sql语句
whwzxl 2006-08-15
  • 打赏
  • 举报
回复
可以将整个语句串都放在exec中执行,就可以识别你定义的参数了
whwzxl 2006-08-15
  • 打赏
  • 举报
回复
exec里是可以用declare定义变量的
hellowork 2006-08-15
  • 打赏
  • 举报
回复
第一个错误:
把开始处的:
set @sqlstr1='insert into tbltemp(project) select top '+cast(@linesum as varchar)+' name from syscolumns where id = @objid order by colid'
改成:
set @sqlstr1='insert into tbltemp(project) select top ' + rtrim(@linesum) + ' name from syscolumns where id = ' +
rtrim(@objid) /*修改此处,变成字符型*/
+ ' order by colid'

第二个错误可能是由于第一个引起的.先改正第一个错误再试试.
fcuandy 2006-08-15
  • 打赏
  • 举报
回复
又是内外部变量问题.
declare @i int
set @i=1
exec('select * from tb where id=@i')
这当然错了. exec内外部编译进程不同,空间不同,在外部定义的@i在内部当然是未声明的了.

exec('select * from tb where id=' + @i)
或者用sp_executesql
i9988 2006-08-15
  • 打赏
  • 举报
回复
一次执行exec就是一个连接,不同连接定义的变量不能通用,只能用参数传递
一个exec里面是可以定义变量的
如:

set @sqlstr1='declare @i int set @i='+cast(@inputi as varchar)+' select * from test where id=@i'
exec (@sqlstr1)
WangZWang 2006-08-15
  • 打赏
  • 举报
回复
带有参数的用如下执行:

declare @sqlstr1 nvarchar(4000)
execute sp_executesql @sqlstr1,N'@objid int',@objid
子陌红尘 2006-08-15
  • 打赏
  • 举报
回复
那在EXEC里面可以定义变量吗?
---------------------------------------------------------------------------------------------
如果动态SQL语句内还有变量,需要采用exec sp_executesql方式执行动态SQL
vfssqs 2006-08-15
  • 打赏
  • 举报
回复
不行。
子陌红尘 2006-08-15
  • 打赏
  • 举报
回复
@cur_prf这个参数在哪里定义?

ALTER procedure line_tran @linesum int,@comp_no int,@forth_num int,@tbl_name varchar(20),@yearper int
as
begin
truncate table temp1
declare @objid int,@line_temp int,@sqlstr1 nvarchar(4000),i int,@j int

select @objid = id from sysobjects where id = object_id(@tbl_name)
set @sqlstr1=N'insert into tbltemp(project) select top '+cast(@linesum as varchar)+' name from syscolumns where id = @objid order by colid'
exec sp_executesql @sqlstr1,N'@objid int',@objid

set @i=1
set @sqlstr1='declare '

while @i<=@linesum
begin
if @i=1
set @sqlstr1=@sqlstr1+'@cur_prf'+cast(@i as varchar)+' varchar(30)'
else
set @sqlstr1=@sqlstr1+',@cur_prf'+cast(@i as varchar)+' varchar(30)'

set @i=@i+1
end

exec sp_executesql @sqlstr1,N'@cur_prf ...',@cur_prf
end
go
hhmyz 2006-08-15
  • 打赏
  • 举报
回复
那在EXEC里面可以定义变量吗?
i9988 2006-08-15
  • 打赏
  • 举报
回复
set @sqlstr1='insert into tbltemp(project) select top '+cast(@linesum as varchar)+' name from syscolumns where id = @objid order by colid'
-->
set @sqlstr1='insert into tbltemp(project) select top '+cast(@linesum as varchar)+' name from syscolumns where id = '+cast(@objid as varchar)+' order by colid'
playwarcraft 2006-08-15
  • 打赏
  • 举报
回复
exec裡面的參數他不認識的,
可以用sp_executesql來傳入參數
vfssqs 2006-08-15
  • 打赏
  • 举报
回复
exec ('select * from'+@table)
用EXEC我通常是把数据写到一个实表啊。然后从实表中取数据。

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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