Sql server 检查行是否存在更新记录,否则在C++中插入数据库

Sql server 检查行是否存在更新记录,否则在C++中插入数据库,sql-server,Sql Server,我想向数据库中添加一些记录,但当用户 单击程序开头的按钮,检查是否存在行,更新记录,否则插入表中 我在谷歌上搜索了这个,但只找到了存储的SQL语句 程序不是C++代码或注释< /p> 注意:我使用Qt框架 有人能帮我吗?脚本1。检查记录是否已存在: SELECT COUNT(*) From <YourTable> WHERE ID = 12345; 脚本2。若脚本1返回值>0,则记录已存在。您需要执行以下更新: UPDATE <YourTable> SET Value

我想向数据库中添加一些记录,但当用户

单击程序开头的按钮,检查是否存在行,更新记录,否则插入表中

我在谷歌上搜索了这个,但只找到了存储的SQL语句 程序不是C++代码或注释< /p> 注意:我使用Qt框架


有人能帮我吗?

脚本1。检查记录是否已存在:

SELECT COUNT(*) From <YourTable>
WHERE ID = 12345;
脚本2。若脚本1返回值>0,则记录已存在。您需要执行以下更新:

UPDATE <YourTable> SET 
Value1 = 'ABC',
Value2 = 'XYZ',
Value3 = 123
WHERE ID = 12345;
脚本2。若脚本1返回值=0,则记录不存在。请插入:

INSERT INTO <YourTable> (ID,Value1,Value2,Value3) 
VALUES (12345,'ABC','XYZ',123);
这里是一个基本的合并,您可以使用

MERGE TargetTable AS TARGET
USING
   (SELECT PrimaryKeyColumn, Column2, Column3 FROM YourUserInput) AS SOURCE
ON
   TARGET.PrimaryKeyColumn= SOURCE.PrimaryKeyColumn
WHEN
   MATCHED THEN UPDATE
   SET TARGET.Column1 = SOURCE.Column1, TARGET.Column2 = SOURCE.Column2
WHEN
   NOT MATCHED BY TARGET THEN
   INSERT (PrimaryKeyColumn, Column2, Column3) 
   VALUES (SOURCE.PrimaryKeyColumn, SOURCE.Column2, SOURCE.Column3)
--OUTPUT $action --uncomment this line to return what happens to the record
;
如果你因为什么原因反对合并

IF (SELECT COUNT(*) FROM YourTable WHERE PrimaryKeyColumn = UserInputKey) = 0
 BEGIN
   INSERT INTO YourTable (PrimaryKeyColumn, Column2, Column3)
   VALUES (2,'some value','another value')
 END
ELSE
 BEGIN
   UPDATE YourTable
   SET Column2 = 'some value', Column3 = 'another value'
   WHERE PrimaryKeyColumn = UserInputKey
 END

无论如何,为什么要将数据逻辑保留在应用程序中?存储过程是处理这类事情的合适位置。也就是说,我不知道有哪种代码只能在存储过程中工作。您可能想看看MERGE,因为它听起来正是您所需要的。只要您不在sql server 2005上,就一定要看看MERGE。非常感谢您,但我如何知道脚本返回0或1?@HamiedRezaMarzbani使用MERGE意味着您不必检查返回值。这是SQL Server做您想做的事情的方式。@scsimon Merge是一个很好的工具,但是如果只有一行,它不会增加任何性能优势,并且会隐藏逻辑。疑难解答/调试/更改将更加困难。为什么疑难解答或调试会更加困难?1。进行合并时,您不知道更新或插入了多少行。2.当你找到一份更好的新工作时,你之后的那个人可能不像你那样精通合并语法,可能会犯错误。3.只有看到合并语法更复杂时,才能找到更好的工作。与简单的更新和插入不同,您必须在匹配时使用更新,在不匹配目标时使用插入。