-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

を含むどのプロシージャのパラメータにも式を含める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ください。

+''''+afterが必要だと思われる場合は、クエリの実行対象となるテーブルの@TextVal値と名前をお知らせください。@TextVal

于 2012-07-12T12:48:35.047 に答える
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 に答える