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