大家看看,這個問題怎么解決?

CatchWind 2004-08-09 10:49:38
我有一個表,其中存放著用戶對各個表單的權限,其格式如下:
UserID,rFormName,rView
分別對應用戶名,表單名字,權限,檢索出來的數據為:
CatchWind frmCadre 1
CatchWind frmCadreDimiss 0
CatchWind frmDept 1
CatchWind frmDeptChange 1

現在我想把數據變為橫向的,如:
字段定義為以下的表名,值為相應的權限
字段名:frmCadre,frmCadreDimiss,frmDept,frmDeptChange
值: 1 0 1 1

我寫了如下一個存儲過程,
CREATE Proc SP_USERRIGHT(@UserID varchar(20))
AS

DECLARE @SQLA varchar(3000) --創建臨時表
DECLARE @SQLB varchar(1000) --更新權限數據
SET @SQLA=''
SET @SQLB=''
DECLARE @FormName varchar(50)
DECLARE @Rig bit

DECLARE User_Right CURSOR FAST_FORWARD
FOR SELECT rFormName,rView from UserRight where rUserId=@UserID
OPEN User_Right

FETCH NEXT FROM User_Right INTO @FormName,@Rig
WHILE(@@FETCH_STATUS=0)
BEGIN
SET @SQLA=@SQLA + @FormName + ' bit ,'
SET @SQLB=@SQLB + LTRIM(STR(@Rig)) + ','
FETCH NEXT FROM User_Right INTO @FormName,@Rig
END
CLOSE User_Right
DEALLOCATE User_Right

SET @SQLA='Create Table #Rights (' + LEFT(@SQLA,LEN(@SQLA)-1) + ')'
EXEC (@SQLA)

SET @SQLB='INSERT #Rights VALUES(' + LEFT(@SQLB,LEN(@SQLB)-1) + ')'
EXEC (@SQLB)
SELECT * FROM #Rights



本意是讓@SQLA生成臨時表,再用@SQLB插入其相應的權限數據,
但執行 exec sp_userright 'CatchWind' 時報如下錯誤:

伺服器: 訊息 208,層級 16,狀態 1,行 1
無效的物件名稱 '#Rights'。
伺服器: 訊息 208,層級 16,狀態 1,程序 SP_USERRIGHT,行 29
無效的物件名稱 '#Rights'。

請大家看看該怎么解決?
...全文
113 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuqiuzhi 2004-08-09
  • 打赏
  • 举报
回复
不好意思,2只对全局临时表适用
wuqiuzhi 2004-08-09
  • 打赏
  • 举报
回复
两种方法:
1:把语句都直接实现,不要使用exec(@Str)的方式
2:把语句都放在@Str中,使用exec(@Str)方式实现
比如你过程中的最后一句:

set @SQLB='SELECT * FROM #Rights'
EXEC (@SQLB)
CatchWind 2004-08-09
  • 打赏
  • 举报
回复
明白,原來建立表和添加數據還有查詢結果都要在一個Exec中完成.
zjcxc 元老 2004-08-09
  • 打赏
  • 举报
回复
create table UserRight(rUserID varchar(10),rFormName varchar(20),rView bit)
insert UserRight select 'CatchWind','frmCadre' ,1
union all select 'CatchWind','frmCadreDimiss',0
union all select 'CatchWind','frmDept' ,1
union all select 'CatchWind','frmDeptChange' ,1
go

CREATE Proc SP_USERRIGHT(@UserID varchar(20))
AS

DECLARE @SQLA varchar(3000) --創建臨時表
DECLARE @SQLB varchar(1000) --更新權限數據
SET @SQLA=''
SET @SQLB=''
DECLARE @FormName varchar(50)
DECLARE @Rig bit

DECLARE User_Right CURSOR FAST_FORWARD
FOR SELECT rFormName,rView from UserRight where rUserId=@UserID
OPEN User_Right

FETCH NEXT FROM User_Right INTO @FormName,@Rig
WHILE(@@FETCH_STATUS=0)
BEGIN
SET @SQLA=@SQLA + @FormName + ' bit ,'
SET @SQLB=@SQLB + LTRIM(STR(@Rig)) + ','
FETCH NEXT FROM User_Right INTO @FormName,@Rig
END
CLOSE User_Right
DEALLOCATE User_Right

SET @SQLA=LEFT(@SQLA,LEN(@SQLA)-1)
SET @SQLB=LEFT(@SQLB,LEN(@SQLB)-1)

exec('
Create Table #Rights (' + @SQLA + ')
INSERT #Rights VALUES(' + @SQLB + ')
SELECT * FROM #Rights
')
go

exec SP_USERRIGHT 'CatchWind'
go

drop table UserRight
drop proc SP_USERRIGHT

/*--测试结果

frmCadre frmCadreDimiss frmDept frmDeptChange
-------- -------------- ------- -------------
1 0 1 1

(所影响的行数为 1 行)
--*/

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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