這有點令人困惑,因爲它之前工作過,我添加了1個小小的變化,並在我的Web應用程序中收到此錯誤消息。 (我有其他情況下,我只是拿出其他情況下爲簡單起見)必須聲明標量變量「@dom」
原始代碼的工作之前,我做的唯一的變化是加入
and u.domain = @dom'
後,其中
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)
u.isAdmin = 1',所以它看起來像這樣
where u.isAdmin = 1 and u.domain = @dom'
謝謝,這工作!只是想知道,但爲什麼執行命令需要改變,並需要nvarchar? – nhat 2012-08-13 15:47:41
變量@dom不在您的動態SQL中。 sp_executesql的第二個參數定義參數,以下參數是值。 sp_executesql的參數是nvarchar,因此您必須更改該參數。看看[這裏](http://www.sommarskog.se/dynamic_sql.html)瞭解更多有關動態SQL的信息。 – 2012-08-13 16:27:16
@nhat當然,使用sp_executesql參數而不是連接你的SQL字符串最重要的是它可以保護你免受[SQL注入攻擊](http://xkcd.com/327/)的攻擊。 – 2012-08-13 16:44:34