执行sp_executesql时出错

时间:2012-07-12 10:54:29

标签: sql-server stored-procedures execute

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;  

我收到错误

  

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

2 个答案:

答案 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的值以及您希望查询运行的表的名称。