2017-06-29 94 views
0

将0值插入到我的表中而不是正确的值希望有人可以帮助我,因为我完全不知道为什么会发生这种情况。为什么SQL服务器使用函数

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

该函数接受HomeTeam,AwayTeam和MatchDate参数,然后计算在指定的匹配日期之前在主队和客队之间赢得,抽签或失去的每个比赛结果。

此功能通过手动调用它工作正常,并返回这些值的

Home Away Draw 
    0  8  4 

我想这个信息添加到每场比赛的结果在我的匹配表,所以创建的查询从移动火柴staging table,使用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 
+0

是否有任何理由你有表中的数据库名称?你是否插入不同的(链接?)服务器? –

+0

查询中没有涉及链接的服务器,我发现它对我的表名完全有效,因为它阻止事物进入默认数据库,因为我经常处理不同的项目,这些项目位于不同的数据库中等。项目我计划创建多个数据库,其中包含我想分析的数据的不同部分,只是为了保持整洁。 – wrslphil

+1

您应该始终在INSERT INTO上使用显式列列表,并在SELECT查询上使用显式列列表。如果这不能解决问题,请尝试创建一个小问题的补充。 –

回答

0

这是唯一可能的答案,但是...为什么你的函数查询这么复杂?这只在一个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 
+0

谢谢Laughing Vergil,当我回家时我会试试这个。我按照原来的查询计算出每个计数的百分比,以便于阅读/简单化的方式进行设置。我决定剥离它,因为它不起作用,并决定如果我可以将计数计入表中,我将在表中添加一个计算列以显示百分比。我希望有一些明显的错误,所以我不必像现在那样重新编写查询,但也许这是唯一的解决方案。 – wrslphil

+0

您可以随时在查询中添加一个附加列“COUNT(*)As Total”,并添加一个AND子句 - AND FTResult IN('H','A','D') - 然后计算在显示层中飞行的百分比,或者从临时表中选择的百分比。 –