如何修复此查询上的此SQL错误

如何修复此查询上的此SQL错误,sql,sql-server-2005,Sql,Sql Server 2005,这里是当我尝试执行上面显示的查询时得到的异常 如果有人能告诉我这些错误的原因,我将不胜感激。改为这样做: 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 Prov

这里是当我尝试执行上面显示的查询时得到的异常



如果有人能告诉我这些错误的原因,我将不胜感激。改为这样做:

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.
您现在所做的是尝试将该命令作为存储过程调用,但显然不是这样。sp_executesql是一个系统存储过程,允许您执行有效的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.
您现在所做的是尝试将该命令作为存储过程调用,但显然不是这样。sp_executesql是一个系统存储过程,允许您执行有效的SQL语句。系统存储过程位于主数据库中,仅供参考。

您也可以使用

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
这将执行文本字符串

区别就在括号里

您也可以使用

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
这将执行文本字符串


区别就在括号里

您试图执行一个无效的存储过程@q,请使用:

exec(@q)

您试图执行的存储过程@q无效,请使用:

exec(@q)

好的,确保使用NVARCHAR而不是VARCHAR。就在这时,您可以使用
EXEC sp\u executesql@q

确定您使用的是NVARCHAR而不是VARCHAR。此时,您可以使用
EXEC sp_executesql@q

声明@params NVARCHAR(4000)
声明@sql NVARCHAR(4000)

设置@providerIdList='(1,5,15)'

设置@sql='从[user]u左加入提供者p中选择u.Id(在u.Provider上)\u FK=p.Id左加入提供者s2users pu(在pu.user上)\u FK=u.Id左加入提供者ap(在ap.Id=pu.Provider上)\u FK,其中p.Id位于'+@providerIdList'

选择@params=N'@providerIdList VARCHAR OUTPUT'

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

声明@params NVARCHAR(4000)
声明@sql NVARCHAR(4000)

设置@providerIdList='(1,5,15)'

设置@sql='从[user]u左加入提供者p中选择u.Id(在u.Provider上)\u FK=p.Id左加入提供者s2users pu(在pu.user上)\u FK=u.Id左加入提供者ap(在ap.Id=pu.Provider上)\u FK,其中p.Id位于'+@providerIdList'

选择@params=N'@providerIdList VARCHAR OUTPUT'


exec sp_executesql@sql、@params、@providerIdList=@providerIdList

或者给定您显示为代码的内容,我根本不会使用动态sql。如果可能,应避免使用动态SQl

execute (@q)

或者考虑到您显示为代码的内容,我根本不会使用动态SQL。如果可能,应避免使用动态SQl

execute (@q)

exec(@q)也可以工作。您只需将@var括在括号中即可。这将不起作用:Msg 214,级别16,状态2,过程sp_executesql,第1行过程需要类型为“ntext/nchar/nvarchar”的参数“@statement”。@KM:已将其修复为nvarchar。我一直忘记了sp_executesql的这种依赖性。不过,作为一项规则,无论如何,您应该使用nvarchar。不要假设ASCII能够覆盖所有可能的字符!exec(@q)也可以工作。您只需将@var括在括号中即可。这将不起作用:Msg 214,级别16,状态2,过程sp_executesql,第1行过程需要类型为“ntext/nchar/nvarchar”的参数“@statement”。@KM:已将其修复为nvarchar。我一直忘记了sp_executesql的这种依赖性。不过,作为一项规则,无论如何,您应该使用nvarchar。不要假设ASCII能够覆盖所有可能的字符!出于可读性的原因,我不喜欢这种方法。这使它变得很困难,特别是当您有一个存储过程调用一堆SQL和其他存储过程时。至少对我来说,使用sp_executesql可以使这些内容保持足够的独立性。但是,这只是我的偏好。Eric,我同意,但对我来说更容易记住,有时我会忘记sp_executesql。出于可读性原因,我不喜欢这种方法。这使它变得很困难,特别是当您有一个存储过程调用一堆SQL和其他存储过程时。至少对我来说,使用sp_executesql可以使这些内容保持足够的独立性。但是,这只是我的偏好。Eric,我同意,但对我来说,更容易记住,有时我会忘记sp_executesql。