2014-09-30 71 views
-1

我有这个函数,我想返回表@List。 我该怎么做?任何人都可以帮助我。 谢谢在SQL Server中使用标量值函数返回表

ALTER FUNCTION [dbo].[GetTotalFaltasPorMes] 
(
    -- PARÂMETROS 
    @UIFuncionario as char(36), 
    @Data as DateTime 
) 
RETURNS TABLE 
AS 
BEGIN 
    -- VARIÁVEIS 
    DECLARE @TotalFaltas as float 
    DECLARE @List TABLE(Jan VARCHAR(100), Fev VARCHAR(100), Mar VARCHAR(100), Abr VARCHAR(100), 
         Mai VARCHAR(100), Jun VARCHAR(100), Jul VARCHAR(100), Ago VARCHAR(100), 
         Stb VARCHAR(100), Otb VARCHAR(100), Nov VARCHAR(100), Dez VARCHAR(100) 
         ); 

    -- QUERY SQL 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='1' 
    AND TpSegmento IN (6,7) 

    SET @TotalFaltas=0 

    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='2' 
    AND TpSegmento IN (6,7) 

    INSERT INTO @List (Fev) VALUES (@TotalFaltas) 

    SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='3' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Mar) VALUES (@TotalFaltas) 

    SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='4' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Abr) VALUES (@TotalFaltas) 

    SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='5' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Mai) VALUES (@TotalFaltas) 

    SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='6' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Jun) VALUES (@TotalFaltas) 

    SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='7' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Jul) VALUES (@TotalFaltas) 

    SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='8' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Ago) VALUES (@TotalFaltas) 

    SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='9' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Stb) VALUES (@TotalFaltas) 

     SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='10' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Otb) VALUES (@TotalFaltas) 

     SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='11' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Nov) VALUES (@TotalFaltas) 

    SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='12' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Dez) VALUES (@TotalFaltas) 

    -- RETORNO 
    RETURN @List 

END 
+0

你的问题是什么(错误)? – RezaRahmati 2014-09-30 13:46:56

+1

只是你知道的。你的代码很糟糕。无论您将哪个值作为参数@Data传递,您都会得到相同的结果。而且你还错过了第一个月的插入。您不应该返回表格,因为您返回的唯一信息是1值。 – 2014-09-30 14:06:45

+0

具有多个查询的表值函数称为多语句表值函数,并且性能确实很糟糕。只是将一堆查询放在一起,并将结果粘贴到临时表中并返回,这是超级麻烦代码的一个秘诀。你可以通过它的外观将整个事件重写成单个select语句,而不是像这样的选择语句。 – 2014-09-30 14:42:03

回答

0

试试这个:

ALTER FUNCTION [dbo].[GetTotalFaltasPorMes] 
(
    -- PARÂMETROS 
    @UIFuncionario as char(36), 
    @Data as DateTime 
) 
RETURNS @List TABLE(Jan VARCHAR(100), Fev VARCHAR(100), Mar VARCHAR(100), Abr VARCHAR(100), 
         Mai VARCHAR(100), Jun VARCHAR(100), Jul VARCHAR(100), Ago VARCHAR(100), 
         Stb VARCHAR(100), Otb VARCHAR(100), Nov VARCHAR(100), Dez VARCHAR(100) 
         ) 
AS 
BEGIN 

-- QUERY SQL 
INSERT INTO @List(Jan) 
SELECT SUM(Duracao) FROM CthAcmDiaLG 
WHERE [email protected] 
AND MONTH(@Data)=1 
AND TpSegmento IN (6,7) 

INSERT INTO @List (Fev) 
SELECT SUM(Duracao) FROM CthAcmDiaLG 
WHERE [email protected] 
AND MONTH(@Data)=2 
AND TpSegmento IN (6,7) 

--... rest of your bad code 
-- RETORNO 
RETURN 

END 
+0

'BEGIN'附近语法不正确。 – user3178157 2014-09-30 13:54:30

0

,如果我是正确的,我认为你必须做一个选择语句返回的值。你不能只添加一个代码Return @List。尝试添加一个select语句,如果你想要一个内嵌表值函数,那么你需要修改这个下面的模板,你应该得到的数据在@list

0

表值函数

ALTER FUNCTION [dbo].[GetTotalFaltasPorMes] 
(
    -- PARÂMETROS 
    @UIFuncionario as char(36), 
    @Data as DateTime 
) 
RETURNS @List TABLE 
(Jan VARCHAR(100), Fev VARCHAR(100), Mar VARCHAR(100), Abr VARCHAR(100), 
         Mai VARCHAR(100), Jun VARCHAR(100), Jul VARCHAR(100), Ago VARCHAR(100), 
         Stb VARCHAR(100), Otb VARCHAR(100), Nov VARCHAR(100), Dez VARCHAR(100) 
         ) 
AS 
BEGIN 
    -- VARIÁVEIS 
    DECLARE @TotalFaltas as float 

    -- QUERY SQL 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='1' 
    AND TpSegmento IN (6,7) 

    SET @TotalFaltas=0 

    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='2' 
    AND TpSegmento IN (6,7) 

    INSERT INTO @List (Fev) VALUES (@TotalFaltas) 

    SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='3' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Mar) VALUES (@TotalFaltas) 

    SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='4' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Abr) VALUES (@TotalFaltas) 

    SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='5' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Mai) VALUES (@TotalFaltas) 

    SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='6' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Jun) VALUES (@TotalFaltas) 

    SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='7' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Jul) VALUES (@TotalFaltas) 

    SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='8' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Ago) VALUES (@TotalFaltas) 

    SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='9' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Stb) VALUES (@TotalFaltas) 

     SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='10' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Otb) VALUES (@TotalFaltas) 

     SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='11' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Nov) VALUES (@TotalFaltas) 

    SET @TotalFaltas=0 
    SELECT @TotalFaltas=SUM(Duracao) FROM CthAcmDiaLG 
    WHERE [email protected] 
    AND MONTH(@Data)='12' 
    AND TpSegmento IN (6,7) 
    INSERT INTO @List (Dez) VALUES (@TotalFaltas) 

    -- RETORNO 
    RETURN; 

END 

ALTER FUNCTION [dbo].[GetTotalFaltasPorMes] 
(
    -- PARÂMETROS 
    @UIFuncionario as char(36), 
    @Data as DateTime 
) 
RETURN (
--your query goes here 
); 
相关问题