修改SQL存储过程使其同时返回校验结果与匹配的公司名称
存储过程修改方案
你可以直接通过查询赋值一次性完成重复校验和公司名取值,避免多次扫描表,修改后的完整代码如下:
CREATE PROCEDURE [CoDb].[CompanyAttribute_RunDataValidation] @AttributeId INT, @Value VARCHAR(255), @ValidationType SMALLINT, @Operation SMALLINT, @CompanyId INT AS BEGIN DECLARE @ValidationSuccess AS BIT = 1 DECLARE @CompanyName AS VARCHAR(255) = '' -- 仅唯一校验场景执行逻辑 IF @ValidationType = 1 BEGIN -- Create操作场景 IF @Operation = 1 BEGIN SELECT TOP 1 @CompanyName = C.CompanyName FROM [CoDb].[CompanyAttribute] CA INNER JOIN [CoDb].[Company] C on C.Id = CA.CompanyId WHERE CA.AttributeId = @AttributeId AND CA.Value = @Value AND CA.IsDeleted = 0 END -- Update操作场景 ELSE IF @Operation = 2 BEGIN SELECT TOP 1 @CompanyName = C.CompanyName FROM [CoDb].[CompanyAttribute] CA INNER JOIN [CoDb].[Company] C on C.Id = CA.CompanyId WHERE CA.AttributeId = @AttributeId AND CA.Value = @Value AND CA.CompanyId <> @CompanyId AND CA.IsDeleted = 0 END -- 如果查到了匹配的公司名,说明存在重复,校验不通过 IF @CompanyName <> '' BEGIN SET @ValidationSuccess = 0 END END -- 同时返回两个结果 SELECT @ValidationSuccess AS ValidationSuccess, @CompanyName AS DuplicateCompanyName END
核心修改说明
- 删掉了原来的
EXISTS判断逻辑,改成直接查询TOP 1的公司名赋值给@CompanyName变量,一次查询完成存在性判断和取值,性能更高 - 新增了判断:如果
@CompanyName不为空,说明存在重复记录,直接把校验结果设为不通过 - 最终返回结果集包含两个字段:
ValidationSuccess为布尔类型的校验结果,DuplicateCompanyName为匹配到的重复公司名称,如果没有重复则返回空字符串 - 如果存在多个公司使用相同编号的场景,你可以把
TOP 1改成字符串拼接逻辑,返回所有重复的公司名,按需调整即可
内容的提问来源于stack exchange,提问作者Eugene Sukh
相关产品推荐
相关产品推荐

