Passer des paramètres dans le T-SQL dynamique à l'aide de sp_executesql
Dans le T-SQL dynamique, transmettre des paramètres aux requêtes exécutées à l'aide de sp_executesql peut être un défi . Cet article aborde un problème courant rencontré lors de l'utilisation de SQL dynamique avec des clauses WHERE attendant des paramètres UNIQUEIDENTIFIER.
Considérons l'exemple suivant, où l'instruction sp_executesql ne contient pas la liaison de paramètre nécessaire :
CREATE PROCEDURE [dbo].[sp_Test1] /* 'b0da56dc-fc73-4c0e-85f7-541e3e8f249d' */ ( @p_CreatedBy UNIQUEIDENTIFIER ) AS DECLARE @sql NVARCHAR(4000) SET @sql =' DECLARE @p_CreatedBY UNIQUEIDENTIFIER SELECT DateTime, Subject, CreatedBy FROM ( SELECT DateTime, Subject, CreatedBy, ROW_NUMBER() OVER(ORDER BY DateTime ) AS Indexing FROM ComposeMail WHERE CreatedBy = @p_CreatedBy /* <--- the problem is in this condition */ ) AS NewDataTable ' EXEC sp_executesql @sql
Quand cette procédure est exécutée, la condition de la clause WHERE échouera car le paramètre @p_CreatedBy n'est pas lié au SQL dynamique requête.
Pour résoudre ce problème, les paramètres doivent être explicitement transmis à sp_executesql. Selon MSDN, la syntaxe correcte est :
EXECUTE sp_executesql @sql, N'@p UNIQUEIDENTIFIER', @p = @p_CreatedBY
Cela garantit que le paramètre @p_CreatedBy est affecté au paramètre @p dans l'instruction SQL dynamique, permettant à la clause WHERE d'évaluer correctement la condition.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!