繁体   English   中英

为什么SQL Server使用函数将0值而不是正确值插入表中

[英]Why is SQL server inserting 0 values into my table instead of the correct values using function

希望有人可以帮助我解决这个问题,因为我完全不知道为什么会这样。

我目前正在对英超联赛比赛结果进行一些分析,作为此分析的一部分,我创建了一个多语句表UDF。

此函数接受HomeTeam,AwayTeam和MatchDate参数,然后对在指定的比赛日之前在主队和客队之间历史上赢,输或输的每个比赛结果进行计数。

通过手动调用此函数可以正常工作,并返回诸如

 Home   Away    Draw
   0      8       4

我想将此信息添加到我的匹配表中的每个匹配结果中,因此创建了一个查询以将登台表中的匹配项移出,并使用OUTER APPLY和该函数插入这些值。(在此之前,我也OUTER APPLY另一个函数正常。),然后插入我的MatchData表中。

如果我只选择值,则查询有效,但是如果我在MatchData表中插入,则所有值都填充为0。

我已经尝试了无数测试,这些测试证实了如果我使用SELECT进入表,除非表是临时表,否则也会发生这种情况。

要添加的是,在任何时候都不会转换有问题的值,它们始终保持为整数,并且目标列也为int类型。

希望有人能给我一些下一步的想法。 代码如下。 对于任何写得不好的东西,我深表歉意,因为到目前为止,我一直在混淆代码,试图让它插入正确的值

提前致谢!

这是存储过程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [Load].[MoveToMatchData]
AS 
BEGIN
    INSERT INTO Football.MatchData.PremierLeague
        SELECT * 
        FROM
            (SELECT 
                 [League], [MatchID], [Season], 
                 [MatchDate], [HomeTeam], [AwayTeam],
                 [FTHomeGoals], [FTAwayGoals], [FTResult],
                 [HTHomeGoals], [HTAwayGoals], [HTResult],
                 [Referee], [HomeShots], [AwayShots],
                 [HomeShotsOnTarget], [AwayShotsOnTarget],
                 [HomeFouls], [AwayFouls], [HomeCorners], [AwayCorners],
                 [HomeYellows], [AwayYellows], [HomeReds], [AwayReds]
             FROM 
                 [Football].[Load].[Staging_MatchData] AS a
             WHERE 
                 League = 'E0') AS a

  OUTER APPLY

  (
  SELECT * FROM Football.Load.CreateRelativeTable_Prem
  (a.MatchDate, a.HomeTeam, a.AwayTeam, a.Season, A.League)
  ) as b

  OUTER APPLY 

这是UDF

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [Load].[GetH2HRecords]
     (@HomeTeam varchar(50), @AwayTeam varchar(50), @MatchDate date)
RETURNS @H2H TABLE
(
Home int,
Away int,
Draw int
)
AS 

BEGIN

DECLARE @FromDate date
SET @FromDate = DATEADD(yyyy,-10,@MatchDate)
INSERT INTO @H2H

SELECT
a.[Number of Matches] as HomeHTH, b.[Number of Matches] as AwayHTH, c.[Number of Matches] as DrawHTH
FROM
    (
    SELECT 
    COUNT(MatchID) as [Number of Matchesh]
    FROM MatchData.PremierLeague
    WHERE HomeTeam = @HomeTeam 
    AND AwayTeam = @AwayTeam
    AND MatchDate > @FromDate
    AND FTResult = 'H'
    ) as a

    OUTER APPLY

    (
    SELECT 
    COUNT(MatchID) as [Number of Matchesa]
    FROM MatchData.PremierLeague
    WHERE HomeTeam = @HomeTeam
    AND AwayTeam = @AwayTeam
    AND MatchDate > @FromDate
    AND FTResult = 'A'
    ) as b

    OUTER APPLY

    (
    SELECT 
    COUNT(MatchID) as [Number of Matchesd]
    FROM MatchData.PremierLeague
    WHERE HomeTeam = @HomeTeam
    AND AwayTeam = @AwayTeam
    AND MatchDate > @FromDate
    AND FTResult = 'D'
    ) as c

RETURN

END


  (
  SELECT * FROM Football.Load.GetH2HRecords
  (a.HomeTeam, a.AwayTeam, a.MatchDate)
  ) as c

  END

这仅是一个可能的答案,但是...为什么您的Function查询如此复杂? 这仅在一条SELECT语句中执行相同的操作:

CREATE FUNCTION [Load].[GetH2HRecords]
     (@HomeTeam varchar(50), @AwayTeam varchar(50), @MatchDate date)
RETURNS @H2H TABLE
(
Home int,
Away int,
Draw int
)
AS 

BEGIN

DECLARE @FromDate date
SET @FromDate = DATEADD(yyyy,-10,@MatchDate)
INSERT INTO @H2H
SELECT 
    SUM(
        CASE
            WHEN FTResult = 'H' 
                Then 1
            ELSE 0
        END 
        ) as HomeHTH,
    SUM(
        CASE
            WHEN FTResult = 'A' 
                Then 1
            ELSE 0
        END 
        ) as AwayHTH,
    SUM(
        CASE
            WHEN FTResult = 'D' 
                Then 1
            ELSE 0
        END 
        ) as DrawHTH
FROM MatchData.PremierLeague
WHERE HomeTeam = @HomeTeam 
AND AwayTeam = @AwayTeam
AND MatchDate > @FromDate

RETURN
END

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM