sql - 不一致的列和合并操作
问题描述
我有一个带有列的表:
CREATE TABLE Tip
(
ID int CONSTRAINT PK_Tip_ID PRIMARY KEY IDENTITY,
Title varchar(100) NOT NULL,
Description varchar(255) NOT NULL,
Status varchar(10) NOT NULL,
Created date DEFAULT GETDATE(),
Expiration date,
Published date NOT NULL,
Link varchar(255),
Category varchar(50) CONSTRAINT FK_Category FOREIGN KEY REFERENCES TipCategory(Name),
Photo int CONSTRAINT FK_Photo FOREIGN KEY REFERENCES TipPhoto(ID),
Highlighted bit CONSTRAINT DF_Highlighted DEFAULT 0
);
我想创建过程并使用 MERGE 操作在单个语句中对表执行 INSERT 和 UPDATE 操作,但我有一个问题。如果所有列(当然除了 ID)都不一致怎么办?我的意思是,如果我想从前端更改所有单列并将它们发送到此过程怎么办?如果我没有至少一个组成列,那么如何找到如下匹配项:
MERGE Production.UnitMeasure AS target
USING (SELECT @UnitMeasureCode, @Name) AS source (UnitMeasureCode, Name)
ON (target.UnitMeasureCode = source.UnitMeasureCode)
WHEN MATCHED THEN
UPDATE SET Name = source.Name
WHEN NOT MATCHED THEN
INSERT (UnitMeasureCode, Name)
VALUES (source.UnitMeasureCode, source.Name)
我没有任何常量列来决定是否应该插入或更新这些值。
解决方案
我决定插入或更新取决于 ID,如下所示:
CREATE PROCEDURE createEditTip
@ID int = NULL,
@Title varchar(100),
@Description varchar(255),
@Status varchar(10),
@Expiration date = NULL,
@Published date,
@Link varchar(255),
@Category varchar(50),
@PhotoID int,
@Highlighted bit
AS
BEGIN
MERGE Tip AS target
USING (SELECT @ID, @Title, @Description, @Status, @Expiration, @Published, @Link, @Category, @PhotoID, @Highlighted)
AS source (ID, Title, Description, Status, Expiration, Published, Link, Category, PhotoID, Highlighted)
ON (target.ID = source.ID)
WHEN MATCHED THEN
UPDATE SET Title = source.Title,
Description = source.Description,
Status = source.Status,
Expiration = source.Expiration,
Published = source.Published,
Link = source.Link,
Category = source.Category,
Photo = source.PhotoID,
Highlighted = source.Highlighted
WHEN NOT MATCHED THEN
INSERT (Title, Description, Status, Expiration, Published, Link, Category, Photo, Highlighted)
VALUES (source.Title, source.Description, source.Status, source.Expiration, source.Published, source.Link, source.Category, source.PhotoID, source.Highlighted);
IF NOT EXISTS (select 1 from TipCategory where Name = @Category)
BEGIN
insert into TipCategory
values (@Category);
END
END
我认为这是安静的好解决方案。
推荐阅读
- android - 在 Android Studio 4.0 中关闭项目不会打开 Android Studio 最近项目列表窗口
- javascript - 如何在状态内的空对象上执行 setState?
- android - RxJava2 concat 运算符不返回适当的序列
- google-sheets - 基于日期标准的动态匹配公式(G-sheets)
- wordpress - 限制评论数量 Wordpress
- python - 比较python数据框中2列的列表并计算相同的项目
- r - Shiny : 使编辑在可编辑数据表中的页面之间持续存在
- objective-c - 从日期字符串开始的一年中的某一天:2020 年 1 月 1 日的奇怪行为
- python - 为什么我的 Python 计时器类不起作用?
- gatsby - Netlify Deploy 从 babel-loader.js 失败