[英]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.