SQL存储过程查询:返回有效账号及不存在账号的提示信息
实现方案
你原有查询从Accounts表过滤匹配账号的逻辑,只会返回存在的账号记录,无法覆盖不存在账号的提示返回需求。核心调整思路是以传入的表值参数(TVP)作为左表,和Accounts表做左外连接,保留所有传入的账号条目,再根据连接匹配状态返回对应内容即可。
基础版实现代码如下:
DECLARE @TVP_AccountNumbers dbo.TVP_AccountNumbers READONLY BEGIN SELECT a.AccountId, -- 匹配到账号返回真实值,未匹配返回提示文本 CASE WHEN a.AccountNumber IS NULL THEN CONCAT('Account number ', t.AccountNumber, ' does not exist') ELSE t.AccountNumber END AS AccountNumber, a.FirstName, a.LastName FROM @TVP_AccountNumbers t LEFT JOIN Accounts a ON t.AccountNumber = a.AccountNumber END
重复值处理(可选)
如果传入的TVP中可能存在重复账号,建议先对TVP的账号做去重,避免返回重复结果,写法如下:
DECLARE @TVP_AccountNumbers dbo.TVP_AccountNumbers READONLY BEGIN ;WITH UniqueInputAccounts AS ( SELECT DISTINCT AccountNumber FROM @TVP_AccountNumbers ) SELECT a.AccountId, CASE WHEN a.AccountNumber IS NULL THEN CONCAT('Account number ', u.AccountNumber, ' does not exist') ELSE u.AccountNumber END AS AccountNumber, a.FirstName, a.LastName FROM UniqueInputAccounts u LEFT JOIN Accounts a ON u.AccountNumber = a.AccountNumber END
如果你使用的是SQL Server 2012以下的旧版本,不支持
CONCAT函数,可以将提示文本部分替换为字符串拼接写法:'Account number ' + t.AccountNumber + ' does not exist'
该写法返回的结果完全匹配你的预期:
- 账号存在时:返回对应记录的
AccountId、真实账号值、FirstName、LastName - 账号不存在时:
AccountId、FirstName、LastName自动返回NULL,AccountNumber字段返回格式为Account number XXXX does not exist的提示文本 - 所有传入账号的结果会合并返回,不会丢失不存在账号的条目
内容的提问来源于stack exchange,提问作者CodeMan03
相关产品推荐
相关产品推荐

