您不能在任何过程的参数中包含表达式,包括sp_executesql
(这意味着您不能在那里做诸如连接字符串之类的事情)。尝试以下方法,它还允许您以更简单的方式调试语句(我不相信您的查询是正确的,因为我不知道您为什么要添加'
after @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
您希望该查询针对的表的值和名称。