2

以前は機能していたので、これは少し混乱します。1つの小さな変更を追加すると、Webアプリケーションでこのエラーメッセージが表示されます。(他のケースもありますが、簡単にするために他のケースを取り出しました)

以前に機能した元のコード:

ALTER PROCEDURE [dbo].[GetRoles]
(@reportid Decimal, @dom varchar(10))

AS
DECLARE @sql varchar(2000) 
SELECT @sql = 
Case @reportid

WHEN 1 THEN
 'select 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 (@sql)

私が行った唯一の変更は追加でした

and u.domain = @dom'

その後、最後にu.isAdmin = 1'なので、次のようになります。

where u.isAdmin = 1 and u.domain = @dom'
4

3 に答える 3

1

変数の値を動的SQLに実際に追加する必要があります。

'THE REST OF YOUR QUERY
where u.isAdmin = 1 and u.domain = ''' + @dom + ''''

@domこれは、動的SQLが実行しようとしている別のSQLステートメントであり、したがって元のステートメントのパラメーターを認識していないためです。

于 2012-08-10T19:53:43.177 に答える
1

@dom動的SQLを実行するときに、パラメーターとして追加する必要があります。

に置き換えEXEC (@sql)exec sp_executesql @sql, N'@dom varchar(10)', @dom、に変更DECLARE @sql varchar(2000)DECLARE @sql nvarchar(2000)ます。

于 2012-08-12T13:55:53.440 に答える
1

このクエリを作成するために動的SQLは必要ありません。

このようにしてください:

ALTER PROCEDURE [dbo].[GetRoles]
(
   @reportid Decimal,
   @dom varchar(10)
)
AS

 select 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 and u.domain = @dom and @reportid = 1
于 2012-08-12T18:50:28.060 に答える