存储过程不使用LIKE和%传递为参数

时间:2017-07-24 20:18:28

标签: sql-server stored-procedures

我正在尝试重新创建用于测试特定应用程序方案的存储过程,但我没有足够的权限来查看原始存储过程。我可以看到应用程序运行如下查询:

exec dbo.SP_GET_WORKSTATIONS @WORKSTATION_FID=N'%',@VALID_IND=N'%',@WORKSTATION_DOMAIN=N'%',@WORKSTATION_PID=N'%'

根据原始存储过程的输入数据类型结果,返回结果我构建了一个这样的存储过程:

CREATE PROCEDURE [dbo].[SP_GET_WORKSTATIONS]
@WORKSTATION_FID varchar(32),
@VALID_IND char(1),
@WORKSTATION_DOMAIN char(20),
@WORKSTATION_PID varchar(10)
AS
SELECT 
    WORKSTATION_FID as Code,
    VALID_IND as ValidInd,
    WORKSTATION_DOMAIN As Name,
    WORKSTATION_PID as PId 
FROM
    [dbo].[L_WORKSTATIONS] 
WHERE
    WORKSTATION_FID LIKE @WORKSTATION_FID AND
    VALID_IND LIKE @VALID_IND AND
    WORKSTATION_DOMAIN LIKE @WORKSTATION_DOMAIN AND
    WORKSTATION_PID LIKE @WORKSTATION_PID;
GO

然而,如果我运行

,这不会返回任何数据
SELECT 
    WORKSTATION_FID as Code,
    VALID_IND as ValidInd,
    WORKSTATION_DOMAIN As Name,
    WORKSTATION_PID as PId 
FROM
    [dbo].[L_WORKSTATIONS] 
WHERE
    WORKSTATION_FID LIKE '%' AND
    VALID_IND LIKE '%' AND
    WORKSTATION_DOMAIN LIKE '%' AND
    WORKSTATION_PID LIKE '%'

我得到了结果。如果我将存储过程中的LIKE更改为=并指定精确参数,则存储过程将起作用。

2 个答案:

答案 0 :(得分:4)

您的@WORKSTATION_DOMAIN参数应为varchar而不是char

尾随空格在类似模式中很重要,%后跟19个空格(填充到20个字符)将尝试匹配以19个空格结尾的内容。

在等式比较中忽略尾随空格。

答案 1 :(得分:0)

请注意,可能需要传入不同的参数,例如%,并且取决于您的proc可能无效的数据类型。原始文件很可能是使用动态SQL创建的,因此它可以处理值列表和不同的数据类型。