当我执行SP时,收到此错误消息:
Msg 102,Level 15,State 1,Line 1
附近的语法不正确
'。'。
我在没有case语句的情况下测试了SQL并且它可以工作,它返回的是管理员。
ALTER PROCEDURE [dbo].[GetRoles]
AS
DECLARE @num varchar(25),
@reportid Decimal,
@dom varchar(10)
set @reportid = 1
set @dom = 'use5'
SELECT @num =
Case @reportid
WHEN 1 THEN
'select distinct u.id as userId, u.domain, u.isAdmin, u.email, u.canReport, a.[site],
a.bldgNum, a.dataCenterNum, l.shortName, l.[description], a.canApprove, a.canComplete
from locAdmin a inner join location l on (a.site=l.site and a.bldgNum = l.bldgNum
and a.dataCenterNum = l.dataCenterNum) right outer join [user] u on u.id=a.userId
and u.domain=a.domain where u.isAdmin = 1'
End
EXEC (@num)
同样不同也不会因某种原因过滤掉重复的用户ID。一些用户输入3x取决于他们有什么访问权限(这是我进入之前设置的方式)
答案 0 :(得分:3)
您将@num
限制为25个字符 - 但您设置的字符串比此长得多 - 它会被截断
(另外: @num
这是一个非常奇怪且可能具有误导性的名称 - 它表示一些数字 - 这实际上更像是一个SQL语句或其他东西 - 在命名变量时使用最少惊喜的原则! )
尝试这样的事情:
DECLARE @stmt NVARCHAR(2000)
.....
SELECT @stmt =
CASE @reportid
WHEN 1 THEN
N'select distinct u.id as userId, u.domain, u.isAdmin, u.email, u.canReport, a.[site],
a.bldgNum, a.dataCenterNum, l.shortName, l.[description], a.canApprove, a.canComplete
from locAdmin a inner join location l on (a.site=l.site and a.bldgNum = l.bldgNum
and a.dataCenterNum = l.dataCenterNum) right outer join [user] u on u.id=a.userId
and u.domain=a.domain where u.isAdmin = 1'
EXEC (@stmt)