我有一个要测试的查询。如果查询在具有现有主键的表中找到数据,则查询应更新数据。如果没有,则插入表中。

主键的类型为int,并且在属性中,我可以看到Identity设置为“ True”,这意味着如果插入,它将自动为主键设置新的ID。

MERGE INTO Test_table t
USING (SELECT 461232 ID,'Test1-data' Fascia FROM Test_table) s
ON (t.ID = s.ID)
WHEN MATCHED THEN
UPDATE SET t.Fascia = s.Fascia
WHEN NOT MATCHED THEN
INSERT (Fascia)
VALUES (s.Fascia);


这里的问题是此查询不起作用,并且它从不插入数据或更新。另外,查询被编译,我没有任何编译错误

另外,我想要此查询的原因是可以正常工作,因为然后我将使用Java准备的语句来查询数据库,所以我假设我可以做

SELECT ? ID,? Fascia FROM Test_table


这样我就可以使用java中的set方法传递值。

如果我的查询有问题,请告诉我。

最佳答案

您正在从目标表中选择源。

您需要删除FROM Test_table,或者在Test_table之前的merge中至少包含1行。

上个月的演示:http://rextester.com/XROJD28508

MERGE INTO Test_table t
USING (SELECT 461232 ID,'Test1-data' Fascia --FROM Test_table
      ) s
ON (t.ID = s.ID)
WHEN MATCHED THEN
UPDATE SET t.Fascia = s.Fascia
WHEN NOT MATCHED THEN
INSERT (Fascia)
VALUES (s.Fascia);

10-08 19:38