我在下面有这个查询
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'。我不确定为什么会出现不同的结果。帮助将不胜感激。
答案 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');