6

次のフィールドでデータベースのレコードを更新する必要があります

[ID] int (AutoIncr. PK)
[ScorerID] int
[Score] int
[DateCreated] smalldatetime

今日の日付(時刻ではなく日付部分のみをチェックする必要があります)と特定のスコアラーのレコードが存在する場合、この男とこの日のスコア値を更新したいと思います。スコアラーが今日のレコードを持っていない場合は、新しいレコードを作成したいと思います。

これを単一の(これは可能ですか?)SQLステートメントに入れる方法を理解しようとすると白髪になります。ちなみに、私はMSSQlデータベースとExecuteNonQuery()クエリを発行するメソッドを使用しています。

4

4 に答える 4

16
IF EXISTS (SELECT NULL FROM MyTable WHERE ScorerID = @Blah AND CONVERT(VARCHAR, DateCreated, 101) = CONVERT(VARCHAR, GETDATE(), 101))
    UPDATE MyTable SET blah blah blah
ELSE
    INSERT INTO MyTable blah blah blah
于 2008-12-04T12:12:45.283 に答える
3

他の人たちは、2005 年 (およびそれ以前) と互換性のある T-SQL/アプローチについて説明しています。幸運にも SQL Server 2008 を使用している場合は、新しい Merge (Upsert とも呼ばれる) ステートメントを利用できることを付け加えたいと思います。

それをさらに説明するブログエントリまたは記事を見つけるのに苦労しましたが、これはむしろ(1) 役立つエントリでした。公式の MSDN エントリは(2) こちらです。

(1) [ http://www.sqlservercurry.com/2008/05/sql-server-2008-merge-statement.html]
(2) [ http://msdn.microsoft.com/en-us/library/ bb510625.aspx]

于 2008-12-04T14:11:01.223 に答える
1
CREATE PROCEDURE InsertOrUpdateScorer(@ScorerID INT, @Score INT)
AS
BEGIN
  IF EXISTS (
    SELECT 1 
    FROM Scorer 
    WHERE ScorerID = @ScorerID AND DATEDIFF(dd, GETDATE(), DateCreated) = 0
  )
  BEGIN
    UPDATE
      Scorer
    SET 
      Score = @Score
    WHERE
      ScorerID = @ScorerID

    RETURN @ScorerID
  END
  ELSE
  BEGIN
    INSERT 
      Scorer 
      (ScorerID, Score, DateCreated)
    VALUES
      (@ScorerID, @Score, GETDATE())

    RETURN SCOPE_IDENTITY()
  END
END

プロシージャの戻り値を使用して、新しい ScorerId を取得します。

SqlCommand UpdateScorer = New SqlCommand("InsertOrUpdateScorer", DbConn);
UpdateScorer.CommandType = CommandType.StoredProcedure;

SqlParameter RetValue = UpdateScorer.Parameters.Add("RetValue", SqlDbType.Int);
RetValue.Direction = ParameterDirection.ReturnValue;

SqlParameter Score = UpdateScorer.Parameters.Add("@Score", SqlDbType.Int);
Score.Direction = ParameterDirection.Input;

SqlParameter ScorerId = UpdateScorer.Parameters.Add("@ScorerID", SqlDbType.Int);
ScorerId.Direction = ParameterDirection.Input;

Score.Value = 15;    // whatever
ScorerId.Value = 15; // whatever

UpdateScorer.ExecuteNonQuery();
Console.WriteLine(RetValue.Value);
于 2008-12-04T12:17:38.720 に答える