【问题标题】:Must declare scalar variable in sql server dynamic sql必须在 sql server 动态 sql 中声明标量变量
【发布时间】:2018-01-20 21:15:15
【问题描述】:

我在运行 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

【问题讨论】:

  • Bobby Tables 迫不及待想要获得@LeaveType。您可能希望根据表中的列对其进行验证,除非您需要更有趣的东西,例如表达式。如果它是列列表,那么您可以将其拆分并单独验证它们。

标签: sql sql-server tsql


【解决方案1】:

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

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

【讨论】:

  • 在尊重参数顺序的同时,您可以直接将值传递给参数,而无需将其设置为... @AdminId, @EmployeeId;
  • @Sami,确实可以通过序号位置指定参数,而不是使用sp_executesql(和任何存储过程)的名称,但恕我直言,命名语法更易于维护,尤其是在命名外部引用时不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多