2008-12-04 19 views
6

ben ediyorum, şu alanlardanSQL Seçin: Varsa güncelle, Eklenmediyse - Tarih bölümü karşılaştırması ile?

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

rekor bugünün tarihine (sadece tarih bölümü kontrol edilmelidir değil zamanı) için varsa ve belirli bir golcü ile bir veritabanına kayıt güncellemeniz gerekir Bu adam ve bu gün için skor değerini güncellemek istiyorum. Yazı hakeminin bugün için bir kaydı yoksa, yeni bir tane oluşturmak isterim.

Gri ​​saçlarım, bunu nasıl tek bir (bu mümkün mü?) Sql ifadesine nasıl yerleştireceğimi anlamaya çalışıyorum. Bu arada bir MSSQl veritabanı ve sorguyu vermek için ExecuteNonQuery() yöntemini kullanıyorum. Prosedürün

+0

Hangi SQL Server sürümünü kullanıyorsunuz? – RobS

cevap

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 
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 

Kullanım dönüş değeri yeni ScorerId kapmak için.

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); 
3

Diğer adamlar 2005 (ve önceki) uyumlu T-SQL/apprroaches'ı kapsamaktadır. Sadece SQL Server 2008 ile çalışacak kadar şanslıysanız, yeni Birleştirme'den (bazen Upsert olarak da adlandırılır) yararlanarak faydalanabileceğinizi eklemek istedim.

Daha fazla açıklayan bir blog girişini veya makaleyi bulmakta sıkıntı çektim, ancak bunu çoktan buldum (1) helpful entry. Resmi MSDN giriştir (2) here.

(1) [http://www.sqlservercurry.com/2008/05/sql-server-2008-merge-statement.html]
(2) [güncelleme veya bir kerede tüm değerleri eklenmesi istendiğinde durum için http://msdn.microsoft.com/en-us/library/bb510625.aspx]

1

, sadece bir kayıt için bu pasajı kullanılan

1 çalışma güncelleme komut

UPDATE Table1 
SET OPIS = T1.OPIS 
FROM 
    Table1 AS T 
INNER JOIN 
    Table2 AS T1 
    ON 
     T.col = T1.col; 

Sonra insert script

INSERT INTO Table1 
SELECT * FROM 
    (
     SELECT T1.* Table2 AS T1 
     LEFT JOIN Table1 AS T2 ON (T2.col = T1.col) 
     WHERE T2.col IS NULL 
    ) AS T; 

Birinin bunu yararlı bulduğunu umuyorum.

 
INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE c=c+1; 

Biri Güncelleme sürümü MERGE (Transact-SQL) kullanarak bu Solutions for INSERT OR UPDATE on SQL Server

eşyaya ilişkili olduğunu bulduk edebilirsiniz:

(bazı durumlarda) MySql bu eşdeğer böyle bir şeydir

DECLARE @USER_ID AS INT=76; 
DECLARE @TYPE AS NVARCHAR(MAX)='set.global'; 
DECLARE @FKEY AS NVARCHAR(MAX)='21'; 
DECLARE @DATA AS NVARCHAR(MAX)='test'; 

     begin tran 
      MERGE UserData 
      USING (SELECT @USER_ID, @TYPE, @FKEY, @DATA) AS Source([UserId], [Type], [FKey], [Data]) 
      ON (UserData.[UserId] = Source.[UserId] AND UserData.[Type] = Source.[Type] AND (UserData.[FKey] = Source.[FKey] OR (Source.[FKey] IS NULL AND UserData.[FKey] IS NULL))) 
      WHEN MATCHED 
      THEN 
       UPDATE SET [Data] = Source.[Data] 
      WHEN NOT MATCHED BY TARGET THEN 
       INSERT 
          ([UserId] 
          ,[Type] 
          ,[FKey] 
          ,[Data]) 
        VALUES 
          (Source.[UserId] 
          ,Source.[Type] 
          ,Source.[FKey] 
          ,Source.[Data]); 

     commit tran 
İlgili konular