必须在sql server动态sql中声明标量变量

必须在sql server动态sql中声明标量变量,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在运行sql server存储过程时遇到问题。我使用动态sql。 我得到错误“必须声明标量变量”@EmployeeId” SQL查询 ALTER PROCEDURE [dbo].[GetLeaveDays] -- Add the parameters for the stored procedure here @LeaveType varchar(5000), @AdminId int, @EmployeeId int AS BEGIN SET NOCOUNT ON; DECLAR

我在运行sql server存储过程时遇到问题。我使用动态sql。 我得到错误“必须声明标量变量”@EmployeeId”

SQL查询

ALTER PROCEDURE [dbo].[GetLeaveDays] -- Add the parameters for the stored 
procedure here
@LeaveType varchar(5000), 
@AdminId int,
@EmployeeId int

AS 
BEGIN

SET NOCOUNT ON;

DECLARE 
@queryString nvarchar(MAX);

SET @queryString = 'SELECT ' + @LeaveType + ' FROM CompulsoryLeave WHERE 
AdminId = @AdminId AND Id=(SELECT LeaveStructureId FROM Employee WHERE 
Id=@EmployeeId)';

EXECUTE sp_executesql @queryString,
    N'@AdminId int',
    N'@EmployeeId int',
     @AdminId = @AdminId,
     @EmployeeId=@EmployeeId

END

第二个sp_executesql参数应为包含所有参数定义的单个字符串。请尝试:

EXECUTE sp_executesql @queryString,
    N'@AdminId int, @EmployeeId int',
     @AdminId = @AdminId,
     @EmployeeId = @EmployeeId;

第二个sp_executesql参数应为包含所有参数定义的单个字符串。请尝试:

EXECUTE sp_executesql @queryString,
    N'@AdminId int, @EmployeeId int',
     @AdminId = @AdminId,
     @EmployeeId = @EmployeeId;

虽然您尊重参数的顺序,但可以直接传递值,而不将其设置为参数
..@AdminId,@EmployeeId;
@Sami,确实可以按顺序位置指定参数,而不是使用
sp_executesql
(以及任何存储过程)指定参数但是,尽管命名语法更易于维护,特别是当外部引用的命名方式不同时。虽然您尊重参数的顺序,但您可以直接传递值,而不将其设置为参数
。@AdminId,@EmployeeId;
@Sami,但确实可以按顺序位置而不是名称指定参数th
sp_executesql
(以及任何存储过程)但是,命名语法更易于维护,特别是当外部引用的命名不同时。迫不及待地想获得
@LeaveType
。除非需要更有趣的东西,例如表达式,否则您可能希望根据表中的列对其进行验证。如果它是一个列列表,则可以拆分它并验证它em单独。迫不及待地想获得
@LeaveType
。除非需要更有趣的内容,例如表达式,否则您可能希望根据表中的列对其进行验证。如果它是一个列列表,则您可以拆分它并单独进行验证。