存储过程中没有值返回

时间:2016-03-21 06:46:25

标签: sql-server tsql stored-procedures

我在下面有这个查询

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

在上面的存储过程中,我有两个表:Employee Service(emp_service)和Employee表t_emp

我在这里要做的是找出员工服务的状态。我们来说' A'是活跃的,' R'被删除,并且' S'暂停在此查询中,我想查找与emp_id对应的服务数。

例如:我的emp_id是' 15000'我有三项服务,其状态是“A' A' S' A' 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'。我不确定为什么会出现不同的结果。帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

你要做的就像试图用刀砍树。虽然可能但错误的工具......

功能好多了。存储过程意味着某事,可以成为结果。函数意味着提供一个类型化的结果,你甚至不允许那里的东西。

虽然有很多例子,但SP只是为了阅读数据,这是一个不好的习惯。

试试这样:

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');