存储过程中没有返回值

3

我有以下查询

ALTER PROCEDURE sp_myTest
    @emp_ids nvarchar(max)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT
        Count(*) 
    FROM
        emp_service t
    INNER JOIN 
        t_emp e ON t.emp_id = e.emp_id
    WHERE 
        (t.emp_id IN (Select * FROM dbo.Split(@emp_ids, ',')) OR @emp_ids = '' OR @emp_ids IS NULL)
        AND t.status IN ('A', 'R', 'S')
    GROUP BY 
        t.emp_id
END

在上述存储过程中,我有两个表:员工服务(emp_service)和员工表t_emp
我的目的是找出员工服务的状态。假设'A'表示活动状态,'R'表示已删除,'S'表示暂停。在这个查询中,我想找到与emp_id相对应的服务数量。
例如:我的emp_id是'15000',我有三项服务,它们的状态分别为'A'、'S'、'A'。在这种情况下,预期结果应返回'3'(我只使用select语句运行它,并返回了正确的结果)。
Declare @emp_ids nvarchar(max)

Set @emp_id = '15000'

Select Count(*) 
    From emp_service t
    INNER JOIN t_emp e
    ON t.emp_id = e.emp_id
    WHERE 
        (t.emp_id IN (Select * FROM dbo.Split(@emp_ids, ',')) OR @emp_ids = '' OR @emp_ids IS NULL)
        and t.status in ('A', 'R', 'S')
        GROUP BY t.emp_id

这个查询返回了正确的结果'3'。

但是,当我尝试执行存储过程时,它返回了'0'。我不确定为什么会出现不同的结果。希望能得到帮助。


这可能是由于存储过程中的值未设置正确,您可以通过在存储过程内编辑查询并尝试硬编码值来检查结果。 - BEN SEBASTIAN
我不确定,但我认为这是ALTER PROCEDURE sp_myTest ( @emp_ids nvarchar(max) )AS - Raffaello.D.Huke
1
@Drag,展示“exec”代码。 - Ivan Starostin
可能你在exec语句中的参数格式不正确。确保你使用一个带有逗号分隔值的NVARCHAR(MAX)参数来调用该过程。 - diiN__________
4
不要使用“sp_”前缀!这是保留的,可能会导致以后出现问题... - Shnugo
你如何调用这个过程?我猜你混淆了过程和函数。在SQL Server中,过程和函数的处理方式与其他语言(如C# / Java)有很大不同。 - SQL Police
1个回答

0

你现在做的就像是用刀子砍树,虽然可以,但不是正确的工具...

更好的方法是使用函数。存储过程是用来执行某些操作并且可能会有结果的。而函数则是用来返回一个特定类型的结果,你甚至不能在其中执行任何操作。

虽然有很多存储过程只是读取数据的例子,但这是一个需要改掉的坏习惯。

试试这样:

CREATE FUNCTION dbo.MyTest
(
    @emp_ids nvarchar(max)
)
RETURNS INT
AS
BEGIN
    RETURN
    (
        Select Count(*) 
        From emp_service t
        INNER JOIN t_emp e
        ON t.emp_id = e.emp_id
        WHERE 
            (t.emp_id IN (Select * FROM dbo.Split(@emp_ids, ',')) OR @emp_ids = '' OR @emp_ids IS NULL)
            and t.status in ('A', 'R', 'S')
            GROUP BY t.emp_id
    );
END

你可以这样调用

SELECT dbo.MyTest('SomeEmpId');

这并没有回答所提出的问题,即“为什么会得到不同的结果?” - corky_bantam
@corky_bantam 好的...如果你问一个专家(比如一个木匠),为什么树还站着,尽管你用刀工作了几个小时,我希望他会告诉你要用锯子...一个真正的答案在没有实际执行调用的情况下是不可能的。这个问题是由SQLGeorge提出的,但是原帖的作者还没有回答... - Shnugo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接