1

当我执行 SP 时,我收到以下错误消息:

消息 102,级别 15,状态 1,第 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)

由于某种原因, distinct 也不会过滤掉重复的用户 ID。根据他们拥有的访问权限,一些用户 ID 被输入了 3 倍(这就是我进来之前的设置方式)

4

1 回答 1

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)
于 2012-05-24T17:17:42.483 回答