2009-06-02 79 views
1
DECLARE @providerIdList varchar(400) 
DECLARE @q varchar(400) 

SELECT @q = '' 

SELECT @providerIdList = '(1, 5, 15)' 


SET @q = 'SELECT u.Id FROM [user] u 
    LEFT JOIN Provider p ON u.Provider_FK = p.Id 
    LEFT JOIN Providers2Users pu ON pu.user_FK = u.Id 
    LEFT JOIN Provider ap ON ap.Id = pu.provider_fk 
    WHERE p.Id IN ' + @providerIdList 




exec @q 

下面這個SQL的錯誤是,當我嘗試了上述我怎樣才能解決這個查詢


Msg 203, Level 16, State 2, Line 18 
The name 'SELECT u.Id FROM [user] u 
    LEFT JOIN Provider p ON u.Provider_FK = p.Id 
    LEFT JOIN Providers2Users pu ON pu.user_FK = u.Id 
    LEFT JOIN Provider ap ON ap.Id = pu.provider_fk 
    WHERE p.Id IN (1, 5, 15)' is not a valid identifier. 

我真的很感激,如果顯示的查詢來執行我收到異常有人可以指出我導致這些錯誤的原因

回答

8

您正在尋找sp_executesql。做到這一點,而不是:

DECLARE @providerIdList nvarchar(400) 
DECLARE @q nvarchar(400) 

SELECT @q = N'' 

SELECT @providerIdList = N'(1, 5, 15)' 


SET @q = N'SELECT u.Id FROM [user] u 
    LEFT JOIN Provider p ON u.Provider_FK = p.Id 
    LEFT JOIN Providers2Users pu ON pu.user_FK = u.Id 
    LEFT JOIN Provider ap ON ap.Id = pu.provider_fk 
    WHERE p.Id IN ' + @providerIdList 

exec sp_executesql @q 

你現在正在做的是試圖調用命令的存儲過程,它顯然不是。 sp_executesql是一個系統存儲過程,它允許您執行有效的SQL語句。系統存儲過程位於主數據庫FYI上。

+0

exec(@q)也可以。您只需圍繞在括號 – 2009-06-02 19:56:25

+0

中的@var,這將不起作用:消息214,級別16,狀態2,過程sp_executesql,行1 過程期望類型爲'ntext/nchar/nvarchar'的參數'@statement'。 – 2009-06-02 19:57:54

5

您還可以使用

exec(@q) 

這將執行文本字符串。

區別在括號內!

0

你試圖執行一個存儲過程@q,這是無效的,可以使用:

execute (@q) 
0

好吧確保您使用NVARCHAR不是VARCHAR。就在那時你可能會使用EXEC sp_executesql @q

0

申報@params NVARCHAR(4000)
DECLARE @sql NVARCHAR(4000)

SET @providerIdList = '(1,5,15)'

SET @sql =「SELECT u.Id FROM [user] u LEFT JOIN Provider p ON u.Provider_FK = p.Id LEFT JOIN Providers2Users pu ON pu.user_FK = u.Id LEFT JOIN Provider ap ON ap.Id = pu.provider_fk WHERE p.Id IN'+ @providerIdList '

SELECT @params = N'@ providerIdList VARCHAR OUTPUT'

exec sp_executesql @sql,@ params,@ providerIdList = @ providerIdList

0

或者給出你的代碼顯示,我根本不會使用動態SQL。如有可能,應避免動態SQl。

SELECT u.Id FROM [user] u  
LEFT JOIN Provider p ON u.Provider_FK = p.Id  
LEFT JOIN Providers2Users pu ON pu.user_FK = u.Id  
LEFT JOIN Provider ap ON ap.Id = pu.provider_fk  
WHERE p.Id IN (1, 5, 15) 
相關問題