如何修复此查询上的此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。