SQL选择:更新(如果存在),插入(如果不存在)-与日期部分比较?

SQL选择:更新(如果存在),插入(如果不存在)-与日期部分比较?,sql,sql-server,sql-update,Sql,Sql Server,Sql Update,我需要用以下字段更新数据库中的记录 [ID] int (AutoIncr. PK) [ScorerID] int [Score] int [DateCreated] smalldatetime 如果今天的日期(只检查日期部分,不检查时间)和给定的记分员存在记录,我想更新这个家伙和这一天的分数值。如果这位得分手今天没有记录,我想创造一个新的记录 我正试图弄明白如何将其放入一个(这可能吗?)sql语句中。顺便说一下,我正在使用MSSQl数据库和ExecuteNonQuery()方法来发出查询 IF

我需要用以下字段更新数据库中的记录

[ID] int (AutoIncr. PK)
[ScorerID] int
[Score] int
[DateCreated] smalldatetime
如果今天的日期(只检查日期部分,不检查时间)和给定的记分员存在记录,我想更新这个家伙和这一天的分数值。如果这位得分手今天没有记录,我想创造一个新的记录

我正试图弄明白如何将其放入一个(这可能吗?)sql语句中。顺便说一下,我正在使用MSSQl数据库和
ExecuteNonQuery()
方法来发出查询

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
使用过程的返回值获取新的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);

其他人已经介绍了2005年(及之前)兼容的T-SQL/Approach。我只想补充一点,如果您有幸使用SQLServer2008,您可以利用新的Merge(有时称为Upsert)语句

我很难找到一篇博客或文章来进一步解释这一点,但我确实发现这一点。MSDN的官方条目是

(一)[

(2)[

对于需要同时更新或插入所有值的情况,我使用了此代码段,而不仅仅是一条记录

首先运行更新脚本

UPDATE Table1 SET OPIS = T1.OPIS FROM Table1 AS T INNER JOIN Table2 AS T1 ON T.col = T1.col;
您使用的是哪个版本的SQL Server? UPDATE Table1 SET OPIS = T1.OPIS FROM Table1 AS T INNER JOIN Table2 AS T1 ON T.col = T1.col; 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; INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
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