【问题标题】:Insert Into, even if blank插入,即使是空白
【发布时间】:2021-06-17 10:33:37
【问题描述】:

我检查过去 18 小时内是否有文件进入。 在同一个表中,检查始终生成文件的位置。这个特定的文件并不总是进来。

我想做的是设置一个 IF/ELSE,所以如果不满足条件,仍然会生成该字段来告诉用户文件不存在,而不是没有记录。

DECLARE @BASE varchar(55) = 'BASE5_017_%'

INSERT INTO @TranTable(Inbound,BatchID,Filename,FileDateTime,TotalCount,IsValid)
select top 1 'BASE', BatchID,Filename,FileDateTime,TotalCount,IsValid from TranBatchFile (nolock)
where Filename like @BASE AND FileDateTime >= DATEADD(HH,@TimeD,@Now) order by 1 desc

这就是我所拥有的。我喜欢的是:

Insert into ....
If this check comes back with something
show the something
else
"nothing here champ, find out what went wrong"

保持 Inbound 字段不变,但其余部分为空白,也许 Filename 字段说找出问题所在

【问题讨论】:

  • 我很困惑。您必须询问操作系统是否有文件可用,而您的代码没有这样做。这些信息是否反映在表格中?如果是这样,您需要解释它是如何工作的。
  • IF 子句中使用EXISTS"nothing here champ, find out what went wrong"是什么逻辑?您希望那里发生什么?
  • 表格输出显示了通过事件调度程序生成的多个文件(不重要)。上面的代码从TranBatchFile 中提取文件的名称和信息。这个BASE 文件并不总是存在,所以表的输出需要提醒用户,而不是没有记录
  • 永远不要在生产代码中使用ORDER BY <num>。对于一次性查询,它可以节省一些输入,但它是维护的噩梦。在这种情况下,这是一个彻头彻尾的错误,因为您是按值'BASE' 进行排序的,这当然根本就没有排序。
  • 我不明白这有什么关系——事实上你现在有一个不确定顺序的SELECT TOP 1,这意味着你会得到任何与WHERE匹配的记录——引擎的选择。如果您知道不能或不应该有多个记录,您可以省略TOP 1 并稍后检查;如果可能有更多记录并且您确实想要特定的记录,请使用有意义的ORDER BY(如ORDER BY FileDateTime DESC)。

标签: sql sql-server ssms


【解决方案1】:

这就是你要找的吗?

insert into test
select id, col2 from test where id = 2
IF @@ROWCOUNT = 0  
insert into test values(2, 'B')

DEMO

【讨论】:

  • 忽略最后一条评论,这是正确的,我在其中一个声明中更改了错误的字段。这很好用
  • 我很乐意提供帮助。我还没有看到最后的评论:)
猜你喜欢
  • 1970-01-01
  • 2013-02-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多