2017-06-29 12 views
0

誰かが私がアイデアから完全に脱出してくれることを願っています。なぜSQLサーバーが正しい値の代わりにテーブルに0の値を挿入するのですか?

私は現在、プレミアリーグの試合結果に関する分析を行っており、その一環として、マルチステートメントテーブルUDFを作成しました。

この関数はHomeTeam、AwayTeamとMatchDateパラメータを受け入れ、その後、前に指定されたアップマッチの日に、勝っ描かれたり、家庭でアウェイチームの間で歴史的に失われた各試合の結果のカウントを行います。

この機能は、手動でそれを呼び出すことにより、正常に動作し、私は私のマッチテーブル内のすべての試合結果にこの情報を追加したい

Home Away Draw 
    0  8  4 

ような値を返し、そうで試合を移動するためのクエリを作成これらの値を挿入する関数でOUTER APPLYを使用します(これより前に別の関数を適用しても問題ありません)。次にMatchDataテーブルに挿入します。

値を選択するだけでクエリが機能しますが、MatchDataテーブルにINSERT INTOを設定すると、値はすべて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

はこれが唯一の潜在的な答えですが、...なぜあなたの機能クエリは非常に複雑ですか?これは1つの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

Vergilを笑ってくれてありがとう、家に帰るときにこれを試してみるよ。元のクエリが各カウントごとにパーセンテージを計算したので、読みやすさ/シンプルさを容易にする方法で設定しました。私はそれが動作しないためにそれを取り除くことに決めました、そして、私がテーブルにカウントを得ることができるならば、パーセントを示す計算された列をテーブルに追加します。私は間違っていたことが分かっていたので、クエリを書き直す必要はありませんでしたが、これは唯一の解決策かもしれません。 – wrslphil

+0

あなたはいつでも追加の列 'COUNT(*)As Total'を追加することができます。そして、AND節 - ' AND FTResult IN( 'H'、 'A'、 'D') 'をクエリに追加し、表示レイヤーのオンザフライでのパーセンテージ、またはテンポラリテーブルから選択したときのパーセンテージ。 –

関連する問題