c# - 如果找不到数据,SQL Server 查询连续返回 "No data"

标签 c# sql sql-server

我的代码能够检索与条形码匹配的书籍代码数据,但在没有数据匹配时不能。如果没有找到数据,我也希望它在单元格中打印“无数据”。我确实遵循了这个但没有工作SQL return row if no result found

我试过这个查询,但仍然没有“无数据”返回行

 WITH CTE AS(
   SELECT *
      ,ROW_NUMBER() OVER(PARTITION BY Barcode ORDER BY InvtID Asc) rid 
  FROM InventoryCustomer) 

 SELECT InvtID
       ,coalesce(InvtID, 'bookcode not found') 
 FROM cte 
 WHERE rid=1 
  and Barcode In ("<barcode_value>")

代码如下,

using (SqlConnection conn = new SqlConnection("Server="))
            using (SqlCommand cmd = new SqlCommand(null, conn))
            {
               StringBuilder sb = new StringBuilder("WITH cte AS(SELECT *,ROW_NUMBER() OVER(PARTITION BY Barcode ORDER BY InvtID Asc) rid FROM InventoryCustomer) SELECT InvtID AS BOOKCODE FROM cte WHERE rid=1 and Barcode In (");
               for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (i != 0) sb.Append(","); 

                    string name = "@P" + i; 

                    cmd.Parameters.AddWithValue(name, dt.Rows[i]["3"]); 
                    sb.Append(name); 
                } 
                sb.Append(") ORDER BY Barcode");

                cmd.CommandText = sb.ToString();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);

                dt.Columns["BOOKCODE"].SetOrdinal(0);
                dataGridView2.DataSource = dt;
            }

更新

我在 sql server 中尝试了一对一的条形码。正如你在这张照片中看到的 pic1

当只有 1 个参数时,查询能够打印 'bookcode not found' 但第二张图片 pic2

查询仅打印书码,不包括“找不到书码”。请帮我弄清楚如何解决这个问题

WITH cte AS
(SELECT *,ROW_NUMBER() OVER(PARTITION BY Barcode ORDER BY InvtID Asc) rid 
FROM [dbo].[InventoryCustomer] WHERE Barcode In ('123','9789830093826') ) 
SELECT InvtID, BOOKCODE = coalesce(InvtID, 'bookcode not found') 
FROM cte WHERE rid=1 UNION SELECT InvtID = '', BOOKCODE = 'bookcode not found' 
WHERE NOT EXISTS( SELECT 1 FROM CTE )

2 月 11 日

这些是我尝试过的所有查询,但如果在 sql 中找不到行,它们都不会显示“无数据”

1. 'SELECT isnull((SELECT InvtID 
FROM InventoryCustomer WHERE Barcode IN('123','9789830093819')),'No bookcode found') 
AS InvtID '

2. 'Select case when s.InvtID IS NOT NULL Then s.InvtID else 'no data' end as Bookcode
from (Select InvtID as InvtID FROM InventoryCustomer WHERE Barcode IN('123','9789830093819')) R
Left Join InventoryCustomer s ON s.InvtID = R.InvtID'

3. 'IF NOT EXISTS (Select InvtID From InventoryCustomer WHERE Barcode in ('123','9789830093819')) 
Begin SELECT 'Bookcode not found' as Bookcode end
ELSE
SELECT InvtID From InventoryCustomer WHERE Barcode in ('123','9789830093819')'

4. 'SELECT InvtID, CASE WHEN InvtID is null OR InvtID='' THEN 'no data'
ELSE InvtID
END AS Bookcode
FROM InventoryCustomer WHERE Barcode in ('123','9789830093819')'

5. 'WITH cte AS(SELECT case WHEN InvtID IS NULL OR InvtID='' THEN 'No Bookcode Found' 
ELSE InvtID END AS InvtID,Barcode,ROW_NUMBER() OVER(PARTITION BY Barcode ORDER BY InvtID Asc) 
rid FROM InventoryCustomer) 
SELECT InvtID AS BOOKCODE FROM cte WHERE rid=1 and Barcode In ('123','9789830093819')'

最佳答案

您可以尝试在 WHERE 子句(限制记录)中删除条形码检查,而是使用具有相同逻辑的 CASE 表达式。当遇到不匹配的记录时,可能会显示bookcode not found:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY Barcode ORDER BY InvtID Asc) rid
    FROM InventoryCustomer
)

SELECT
    InvtID,
    CASE WHEN Barcode IN (...) THEN InvtId ELSE 'bookcode not found' END AS status
FROM cte
WHERE rid = 1;

如果 InvtId 不是文本列,那么您可能必须按如下方式将其转换为文本以使 CASE 表达式起作用:

CASE WHEN Barcode IN (...)
    THEN CONVERT(varchar(10), InvtId) ELSE 'bookcode not found' END

关于c# - 如果找不到数据,SQL Server 查询连续返回 "No data",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54434277/

相关文章:

mysql - SQL 从每 2 个或更多不同的表中选择 1 列

sql - 甲骨文 PL/SQL : count(*) between 2 tables

mysql - 如何使用 SQL 按特定类别按比例对总天数进行分类或划分

sql - 从字符串中选择列

sql - 从年/月而不是日期字段中选择滚动日期范围

c# - 未触发中继器控件复选框事件

c# - 连接数据库时出错

c# - System.Drawing Out of Memory异常

c# - 一种避免浪费内存的方法

sql-server - 将 Excel 数据从 Azure Data Lake 加载到 Azure SQL 的理想方法