如何在此查询中修复此SQL错误

Shi*_*iva 1 sql sql-server-2005

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
Run Code Online (Sandbox Code Playgroud)

以下是我尝试执行上面显示的查询时遇到的异常


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.
Run Code Online (Sandbox Code Playgroud)

如果有人能指出这些错误的原因我真的很感激

Eri*_*ric 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
Run Code Online (Sandbox Code Playgroud)

你现在正在做的是尝试将命令作为存储过程调用,但显然不是这样.sp_executesql是一个系统存储过程,它允许您执行有效的SQL语句.系统存储过程位于主数据库FYI上.


tek*_*ues 5

你也可以使用

exec(@q)
Run Code Online (Sandbox Code Playgroud)

这将执行文字字符串.

不同之处在于括号!