2009-06-02 63 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)