exec sp_executesql N'SELECT (STUFF (( SELECT '',''+ NAME from Project WHERE ProjectTypeID=1 and OutputHierarchyID IN (SELECT DISTINCT HierarchyID from HierarchyNode'+ @TextVal +''''
+ N')FOR XML PATH('''')), 1, 1, ''''))AS INDUSTRIES',
N'@Industries NVARCHAR(100) output', @Industries output;
我收到错误
'+'附近的语法不正确。
答案 0 :(得分:1)
你有额外的单引号。试试这个
exec sp_executesql N'SELECT (STUFF (( SELECT '',''+ NAME from Project WHERE ProjectTypeID=1 and OutputHierarchyID IN (SELECT DISTINCT HierarchyID from HierarchyNode'+ @TextVal +''
+ N')FOR XML PATH('''')), 1, 1, ''''))AS INDUSTRIES',
N'@Industries NVARCHAR(100) output', @Industries output;
将动态查询分配到变量并使用该变量执行
也是很好的实践答案 1 :(得分:1)
你不能在任何过程的参数中有一个表达式,包括sp_executesql
(这意味着你不能像连接字符串那样做)。尝试以下操作,这也允许您以更简单的方式调试语句(我不相信您的查询是正确的,因为我不知道您为什么要在'
之后添加@TextVal
,我假设是一些表后缀):
DECLARE @sql NVARCHAR(MAX), @Industries NVARCHAR(100);
SET @sql = N'SELECT @Industries = STUFF((SELECT '','' + NAME
from Project WHERE ProjectTypeID = 1
and OutputHierarchyID IN
(
SELECT DISTINCT HierarchyID from HierarchyNode' + @TextVal + '
) FOR XML PATH('''')), 1, 1, '''');';
PRINT @sql;
--EXEC sp_executesql @sql, N'@Industries NVARCHAR(100) output', @Industries output;
虽然我认为这个版本会更有效率:
DECLARE @sql NVARCHAR(MAX), @Industries NVARCHAR(100);
SET @sql = N'SELECT @Industries = STUFF((SELECT '','' + NAME
from Project AS p WHERE ProjectTypeID = 1
AND EXISTS
(
SELECT 1 from HierarchyNode' + @TextVal + '
WHERE HierarchyID = p.OutputHierarchyID
) FOR XML PATH('''')), 1, 1, '''');';
PRINT @sql;
--EXEC sp_executesql @sql, N'@Industries NVARCHAR(100) output', @Industries output;
您可以检查该语句并确保它是正确的,而不是盲目地将其丢弃到SQL Server并尝试找出错误消息可能意味着什么。如果将输出复制并粘贴到顶部窗格中,则错误消息将指向您实际可以看到的行号,并且可以更轻松地对语法进行故障排除。如果您认为它产生了正确的输出,请对PRINT
发表评论并取消注释EXEC
。
如果您认为+''''+
之后的@TextVal
是必要的,请告诉我们@TextVal
的值以及您希望查询运行的表的名称。