c# - 找不到记录时 SQL Server 显示结果
问题描述
当机器名称查找不在数据库中时,我试图让 SQL 列出未找到。我有查询工作,但我需要将它集成到我有其他查询的 C# 中。就目前而言,它比我想要的要复杂得多,我猜有一个更智能和简洁的原因让 SQL 达到相同的结果。
DECLARE @myHostCount as INT
DECLARE @myHostName1 as Varchar(50);
DECLARE @myHostName2 as Varchar(50) = 'Machine220054';
DECLARE @myHostCount1 as INT
DECLARE @myHostName3 as Varchar(50);
DECLARE @myHostName4 as Varchar(50) = 'Machine22054';
SET @myHostCount1 = (SELECT COUNT(*) FROM db_owner.host WHERE name LIKE '%Machine22054%')
SET @myHostName3 = (SELECT Name FROM db_owner.host WHERE name LIKE '%Machine22054%')
SET @myHostCount = (SELECT COUNT(*) FROM db_owner.host WHERE name LIKE '%Machine220054%')
SET @myHostName1 = (SELECT Name FROM db_owner.host WHERE name LIKE '%Machine220054%')
SELECT
CASE
WHEN @myHostCount = 1 THEN 'Found'
WHEN @myHostCount = 0 THEN 'Not Found'
END AS 'Result',
@myHostName2 AS 'HostName'
UNION
SELECT
CASE
WHEN @myHostCount1 = 1 THEN 'Found'
WHEN @myHostCount1 = 0 THEN 'Not Found'
END AS 'Result',
@myHostName4 AS 'HostName'
输出:
Result Machine Name
--------------------------
Found Machine220054
Not Found Machine22054
解决方案
第一:尝试尽可能多地删除 SQL 中的过程逻辑。第二:尽可能减少使用“Like”查询。它将阻碍索引并最终导致瓶颈,或者至少将其限制为以“%”结尾而不是以 1 开头。第三:您假设您的代码中只有零次或一次命中。如果(给定非唯一或基于类似的查询)有多个怎么办?
我会去做这样的事情:
declare @looking table (name varchar(50))
insert into @looking (name) values ('Machine220054'),('Machine22054')
select case when t.name is null then 'Not Found' else 'Found' end as [FoundOrNot], t.name as [FoundName],l.name as [SearchName]
from @looking as l
left outer join db_owner.host as t
on t.name like '%' + l.name + '%'
更新:针对随机表进行测试,由于预期有一个命中或没有命中而删除了“分组依据”。
推荐阅读
- mysql - 加入3个表,包括空值Mysql
- angular - 如何解决“日期”不是实例日期问题?
- javascript - 在点击事件上更改 `minicolors()` 的值
- javascript - 如何在 react-redux 上混合数组?
- c# - 如何修复 Entity Framework Core 错误“值不能为空。参数名称:frameworkName”?
- java - 修复 switch multiple case 语句
- python - 如何通过移动直线获得斜率?
- wordpress - 如何使用 Wordpress Gutenberg 为自定义帖子类型添加元框
- nested - BigQuery 更新多个嵌套列
- java - 保护 PDF 文件和 PDFBox 中的“saveIncremental”