【问题标题】:Top N records in SQL Server with parameter shows errorSQL Server 中带参数的前 N ​​条记录显示错误
【发布时间】:2020-02-16 01:16:08
【问题描述】:

我正在编写一个存储过程,根据输入参数传递返回 N 条记录:

ALTER PROCEDURE [dbo].[StaffQueue]
    @Staff_Dept VARCHAR(100),
    @numberOfStaffs INT
AS
BEGIN
    DECLARE @SQL VARCHAR(1000)

    SET @SQL = 'select top ('+ @numberOfStaffs +') Display_Name as 
   StaffName,e.Emp_code as StaffCode from Employee e'

    IF @Staff_Dept > ''
       SET @SQL = @SQL + ' where e.Designation IN ('''+@Staff_Dept+''')';

    EXEC(@SQL);
END

当我像这样执行这个存储过程时:

EXEC StaffQueue @Staff_Dept ='', @numberOfStaffs = 10 

显示错误:

Top('

附近的转换错误

谁能帮我解决这个错误?

【问题讨论】:

  • 先尝试打印@SQL并检查
  • @RedDevil.. 朋友,你能告诉我如何打印吗?
  • 注释 EXEC (@SQL) 并写 print @sql

标签: sql sql-server sql-server-2008 sql-server-2005


【解决方案1】:

在连接到动态 sql 字符串之前,您应该将 @numberOfStaffs 转换为 varchar。

SET @SQL= 'select top ('+ cast(@numberOfStaffs as varchar(max)) +') Display_Name as 
   StaffName,e.Emp_code as StaffCode from Employee e'

【讨论】:

    【解决方案2】:

    您需要将 @numberOfStaffs 的数据类型更改为 varchar 或在查询中将其转换

    SET @SQL= 'select top ('+ CONVERT(varchar(10), @numberOfStaffs) +') Display_Name as 
       StaffName,e.Emp_code as StaffCode from Employee e'
    
      IF @Staff_Dept>''
         SET @SQL = @SQL + ' where e.Designation IN ('''+@Staff_Dept+''')';
    

    【讨论】:

      【解决方案3】:

      您刚刚在 TOP 指令中使用括号导致 SQL 语法错误。

      Select Top(5) * From Mytable -- 这是错误的 从 Mytable 中选择 Top 5 * - 这很好

      【讨论】:

      • 括号不仅是允许的,而且它们实际上是由语法图规定的(检查docs.microsoft.com/en-us/sql/t-sql/queries/…):“[TOP(表达式)[PERCENT][WITH TIES]]”。它们是可选的,这让我感到惊讶。微软应该修复文档中的错误。
      猜你喜欢
      • 2023-04-06
      • 2017-05-04
      • 2011-03-22
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2010-11-14
      相关资源
      最近更新 更多