无法获得明确的和Case语句在SQL中工作

时间:2012-05-24 17:12:54

标签: sql-server-2008 tsql

当我执行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取决于他们有什么访问权限(这是我进入之前设置的方式)

1 个答案:

答案 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)