【问题标题】:Searching employees by name shows all rows (T-SQL)按姓名搜索员工显示所有行 (T-SQL)
【发布时间】:2013-04-14 22:15:50
【问题描述】:

我有一个带有参数@name nvarchar(50) 的存储过程。 现在存储过程本身看起来像这样:

CREATE PROCEDURE [dbo].[dcspFilterEmpList]
    @empName nvarchar   
AS
    SELECT 
        employee_id AS 'ID',
        name_1+' '+surname AS 'NAME'    
    FROM 
        Employees
    WHERE   
        'NAME' LIKE '%'+@empName+'%'

我输入了表中存在的名称的任何部分,但结果是我得到了整个表。有时我会得到奇怪的结果,例如两行,其中一行符合条件,另一行不符合。

【问题讨论】:

  • 发布整个存储过程以及您调用它的方式。如果@name 是空白的,那就可以解释为什么你会得到每条记录。
  • 请注意:此示例中的错误很明显。第一次发布所有代码。您遗漏的任何内容都会使人们感到困惑。

标签: sql-server tsql stored-procedures parameters


【解决方案1】:

试试这个 -

CREATE PROCEDURE [dbo].[dcspFilterEmpList]

    @empName NVARCHAR(500)   

AS BEGIN

    SELECT 
          ID = e.employee_id
        , NAME = e.name_1 + ' ' + e.surname    
    FROM dbo.Employees e
    WHERE e.name_1 + ' ' + e.surname LIKE '%'+ @empName + '%'

END

更新:

CREATE PROCEDURE [dbo].[dcspFilterEmpList]

    @empName NVARCHAR(500)   

AS BEGIN

    SELECT 
          e2.ID
        , e2.NAME
    FROM (
        SELECT 
              ID = e.employee_id
            , NAME = e.name_1 + ' ' + e.surname -- + ' ' + e.first_name + ....  
        FROM dbo.Employees e
    ) e2
    WHERE e2.NAME LIKE '%'+ @empName + '%'

END

【讨论】:

  • 弗拉基米尔,没有任何秘密,只有一个注释 - 您在 WHERE 过滤器中比较了两个文字。在您的查询中,您需要将字段的值与文字进行比较。
  • 请查看更新后的示例。我想在这种情况下,不需要方括号。这取决于变量中存储的数据类型。如果 @empName 仅包含姓名或姓氏,Damith 示例非常可行。在我的示例中,这并不重要,因为字符串同时包含姓名和姓氏。
【解决方案2】:
SELECT
    emp_id AS ID, 
    emp_name+' '+ emp_surname AS NAME
FROM 
    Employees 
WHERE 
    emp_name LIKE '%' + @name+ '%' OR  emp_surname LIKE '%' + @name+ '%' 

【讨论】:

    猜你喜欢
    • 2018-09-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多