2012-08-10 126 views
2

這有點令人困惑,因爲它之前工作過,我添加了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' 

回答

1

當您執行動態SQL時,您需要添加@dom作爲參數。

EXEC (@sql)替換爲exec sp_executesql @sql, N'@dom varchar(10)', @dom並將DECLARE @sql varchar(2000)更改爲DECLARE @sql nvarchar(2000)

+0

謝謝,這工作!只是想知道,但爲什麼執行命令需要改變,並需要nvarchar? – nhat 2012-08-13 15:47:41

+0

變量@dom不在您的動態SQL中。 sp_executesql的第二個參數定義參數,以下參數是值。 sp_executesql的參數是nvarchar,因此您必須更改該參數。看看[這裏](http://www.sommarskog.se/dynamic_sql.html)瞭解更多有關動態SQL的信息。 – 2012-08-13 16:27:16

+0

@nhat當然,使用sp_executesql參數而不是連接你的SQL字符串最重要的是它可以保護你免受[SQL注入攻擊](http://xkcd.com/327/)的攻擊。 – 2012-08-13 16:44:34

1

您需要實際添加v良莠不齊你的動態SQL:

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

這是因爲你的動態SQL的是,你要執行,因此不知道在你原來的語句中的參數@dom另一個SQL語句。

+0

嗨,我想,但我得到一個錯誤信息「無效的列名稱YHE'。」 Yhe是域名。 – nhat 2012-08-13 15:38:00

+0

嘗試使用其中的額外引號標記進行編輯。 – XN16 2012-08-13 15:45:08

+0

好酷,那個聲明也可以,謝謝! – nhat 2012-08-13 17:38:49

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 
+0

我確實有其他的情況,我只是爲了簡單而拿出其他的情況。 – nhat 2012-08-13 15:07:07

+0

@nhat - 如果你沒有動態sql可以做到這一點,那麼這樣做。動態sql的速度要慢幾個數量級。 – Hogan 2012-08-13 19:42:08