-2
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;  

我收到错误

'+' 附近的语法不正确。

4

2 回答 2

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;  

将动态查询分配给变量并使用该变量执行也是一种很好的做法

于 2012-07-12T11:29:09.113 回答
1

您不能在任何过程的参数中包含表达式,包括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您希望该查询针对的表的值和名称。

于 2012-07-12T12:48:35.047 回答