首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

sp_executesql 請教解决方案

2012-02-15 
sp_executesql 請教declare@user_idint,@sysrole_idint,@SqlStringnvarchar(4000),@TableNamevarchar(80),

sp_executesql 請教
declare  
                @user_id   int,    
                @sysrole_id   int,
                @SqlString   nvarchar(4000),
                @TableName   varchar(80),
                @ParmDefinition   nvarchar(4000),
                @role_no1   varchar(50),
                @TableName1   varchar(80)

    set   @TableName= 'dgerp.lsdata.DBO.fndrole '
    set   @SqlString=N 'select   @sysrole_id=role_id   from   @TableName1 '+
                                  N '   where   role_no=@role_no '
   
exec   sp_executesql   @SqlString   ,N '@TableName1   varchar(80),@sysrole_id   int   output,@role_no   nvarchar(50) ',
          @TableName1=@TableName,@role_no= 'SUPERVISOR ',@sysrole_id=@user_id   output
          select   @user_id

總是報錯:
Msg   137,   Level   15,   State   2,   Line   1
Must   declare   the   variable   '@TableName1 '.

可是@TableName1 '   已經做了聲明了
請教各位大俠

[解决办法]
LZ可以这样写

set @SqlString=N 'select @sysrole_id=role_id from ' + @TableName1 +
N ' where role_no= '+@role_no1+ ' '

exec sp_executesql @SqlString ,N '@sysrole_id int output ',@sysrole_id=@user_id output
select @user_id
[解决办法]
表名和列名,都不能通过参数传递进去,只能在先串接好SQL串:

declare
@user_id int,
@sysrole_id int,
@SqlString nvarchar(4000),
@TableName varchar(80),
@ParmDefinition nvarchar(4000),
--@role_no1 varchar(50),
@role_no varchar(50)
--@TableName1 varchar(80)

set @TableName= 'dgerp.lsdata.DBO.fndrole '
set @SqlString=N 'select @sysrole_id=role_id from '+@TableName+ ' where role_no=@role_no '

set @role_no= 'SUPERVISOR '

exec sp_executesql @SqlString ,N '@role_no nvarchar(50),@sysrole_id int output ',@role_no,@sysrole_id output
select @sysrole_id
--select @user_id

--我晕,一堆mistake
[解决办法]
declare
@user_id int,
@sysrole_id int,
@SqlString nvarchar(4000),
@TableName varchar(80),
@ParmDefinition nvarchar(4000),
@role_no1 varchar(50),
@TableName1 varchar(80)

set @TableName= 'dgerp.lsdata.DBO.fndrole '
set @SqlString=N 'select @sysrole_id=role_id from @TableName1 '+
N ' where role_no=@role_no '

exec sp_executesql @SqlString ,N '@TableName1 varchar(80),@sysrole_id int output,@role_no nvarchar(50) ',
@TableName1=@TableName,@role_no= 'SUPERVISOR ',@sysrole_id=@user_id output
select @user_id

-----------------------------------------
把这句:set @SqlString=N 'select @sysrole_id=role_id from @TableName1 '+


N ' where role_no=@role_no '
改成这样:
set @SqlString=N 'select @sysrole_id=role_id from '+@TableName1+N ' where role_no=@role_no '
因为你直接用上面的写法的话,sql会把“@TableName1”当成表变量,sp_executesql的参数中貌似不能传表变量的参数。凡是是表名的变量,你尽量在外面组装SQLSTRING的时候就加进去,不要作为sp_executesql的参数传。
[解决办法]
漏了一个:exec sp_executesql @SqlString ,N '@TableName1 varchar(80),@sysrole_id int output,@role_no nvarchar(50) ',
@TableName1=@TableName,@role_no= 'SUPERVISOR ',@sysrole_id=@user_id output
也得做相应的修改:
exec sp_executesql @SqlString ,N '@sysrole_id int output,@role_no nvarchar(50) ',
@role_no= 'SUPERVISOR ',@sysrole_id=@user_id output
-----------------------
汗~~~~~
最近老是丢三落四的

热点排行