1

SP を実行すると、次のエラー メッセージが表示されます。

メッセージ 102、レベル 15、状態 1、行 1
「.」付近の構文が正しくありません。

ケースステートメントなしで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

25 文字に制限され@numていますが、設定している文字列はそれよりもはるかに長いため、切り捨てられます
(また@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 に答える