我正在尝试使用MERGE编写MS SQL Server Upsert查询
它用于更新现有行,但在没有条目时不插入行 这是创建表的步骤:我正在尝试使用MERGE编写MS SQL Server Upsert查询,sql,sql-server,sql-server-2008,upsert,sql-merge,Sql,Sql Server,Sql Server 2008,Upsert,Sql Merge,它用于更新现有行,但在没有条目时不插入行 这是创建表的步骤: CREATE TABLE [dbo].[Inventory_Update_Hash_Code] ([Product_Id] [int] NOT NULL, [Feed_Id] [int] NOT NULL, [Hash_Code] [int] NOT NULL, [Last_Updated] [datetime2](0) NOT NULL GO ALTER TABLE [dbo].[Inven
CREATE TABLE [dbo].[Inventory_Update_Hash_Code] ([Product_Id] [int] NOT
NULL, [Feed_Id] [int] NOT NULL, [Hash_Code] [int] NOT NULL,
[Last_Updated] [datetime2](0) NOT NULL
GO
ALTER TABLE [dbo].[Inventory_Update_Hash_Code] ADD PRIMARY KEY
([Product_Id], [Feed_Id])
GO
以下是查询:
MERGE Product_Update_Hash_Code WITH (HOLDLOCK) AS tar
USING (SELECT Feed_Id, Product_Id FROM Product_Update_Hash_Code WHERE
Feed_Id = 261 AND Product_Id = 300) AS source
ON (tar.Feed_Id = source.Feed_Id AND tar.Product_Id = source.Product_Id)
WHEN MATCHED THEN
UPDATE SET tar.Hash_Code = 55, tar.Last_Updated = SYSUTCDATETIME()
WHEN NOT MATCHED
THEN INSERT (Feed_Id, Product_Id, Last_Updated, Hash_Code)
VALUES (261, 300, SYSUTCDATETIME(), 55);
看起来“UNMATCHED”子句没有被执行。我弄错了吗?--也许有帮助
MERGE Product_Update_Hash_Code WITH (HOLDLOCK) AS tar
USING (
SELECT Feed_Id
,Product_Id
FROM Product_Update_Hash_Code
WHERE Feed_Id = 261
AND Product_Id = 300
) AS source
ON (
tar.Feed_Id = source.Feed_Id
AND tar.Product_Id = source.Product_Id
)
WHEN MATCHED
THEN
UPDATE
SET tar.Hash_Code = 55
,tar.Last_Updated = SYSUTCDATETIME()
WHEN NOT MATCHED BY TARGET THEN
INSERT (
Feed_Id
,Product_Id
,Last_Updated
,Hash_Code
)
VALUES (
261
,300
,SYSUTCDATETIME()
,55
);
--也许有帮助
MERGE Product_Update_Hash_Code WITH (HOLDLOCK) AS tar
USING (
SELECT Feed_Id
,Product_Id
FROM Product_Update_Hash_Code
WHERE Feed_Id = 261
AND Product_Id = 300
) AS source
ON (
tar.Feed_Id = source.Feed_Id
AND tar.Product_Id = source.Product_Id
)
WHEN MATCHED
THEN
UPDATE
SET tar.Hash_Code = 55
,tar.Last_Updated = SYSUTCDATETIME()
WHEN NOT MATCHED BY TARGET THEN
INSERT (
Feed_Id
,Product_Id
,Last_Updated
,Hash_Code
)
VALUES (
261
,300
,SYSUTCDATETIME()
,55
);
您不应该使用表本身作为源-如果您使用该表中的行作为源,您怎么能期望它找到丢失的行 相反,您应该独立地从实际数据表或使用
VALUES
子句获取输入数据:
MERGE [Inventory_Update_Hash_Code] WITH (HOLDLOCK) AS tar
USING (VALUES (261,300,55,SYSUTCDATETIME())) AS
source (Feed_Id,Product_ID,Hash_Code,Last_Updated)
ON (tar.Feed_Id = source.Feed_Id AND tar.Product_Id = source.Product_Id)
WHEN MATCHED THEN
UPDATE SET tar.Hash_Code = source.Hash_Code, tar.Last_Updated = source.Last_Updated
WHEN NOT MATCHED
THEN INSERT (Feed_Id, Product_Id, Hash_Code, Last_Updated)
VALUES (Feed_Id,Product_ID,Hash_Code,Last_Updated);
(请注意,在您的问题中,
CREATE table
和MERGE
之间的表名不匹配。我已切换到CREATE table
名称,以便将运行代码所需的更改降至最低)您不应该使用该表,本身作为源—如果您使用该表中的行作为源,您如何期望它找到丢失的行
相反,您应该独立地从实际数据表或使用VALUES
子句获取输入数据:
MERGE [Inventory_Update_Hash_Code] WITH (HOLDLOCK) AS tar
USING (VALUES (261,300,55,SYSUTCDATETIME())) AS
source (Feed_Id,Product_ID,Hash_Code,Last_Updated)
ON (tar.Feed_Id = source.Feed_Id AND tar.Product_Id = source.Product_Id)
WHEN MATCHED THEN
UPDATE SET tar.Hash_Code = source.Hash_Code, tar.Last_Updated = source.Last_Updated
WHEN NOT MATCHED
THEN INSERT (Feed_Id, Product_Id, Hash_Code, Last_Updated)
VALUES (Feed_Id,Product_ID,Hash_Code,Last_Updated);
(请注意,在您的问题中,
CREATE table
和MERGE
之间存在表名不匹配的问题。我已切换到CREATE table
名称,以便尽量减少运行代码所需的更改)您使用的是MySQL,MS SQL Server吗?还是MSQL。。。?对不起,不要给未涉及的产品贴标签。我错误地添加了MySQL。这是Microsoft SQL 2008。目标表同时作为源很少是正确的-当您使用表本身作为行源时,您如何期望获得不匹配的结果?您使用的是MySQL、MS SQL Server吗?还是MSQL。。。?对不起,不要给未涉及的产品贴标签。我错误地添加了MySQL。这是Microsoft SQL 2008。目标表同时作为源很少是正确的-当您使用表本身作为行源时,如何期望得到不匹配的结果?谢谢您的回复!不幸的是,这也没用。谢谢你的回复!不幸的是,这也没用。谢谢!这似乎是正确的做法。谢谢你向我解释我做错了什么。谢谢!这似乎是正确的做法。谢谢你向我解释我做错了什么。