如果没有再次 运行 相同查询的结果存在,则显示查询结果

Show results from query if results exist without running the same query again

我想要一个存储过程,它将一个 SerialNumber nvarchar 作为输入并检查多个数据库以查看该序列号是否存在,如果存在则 return 查询结果,否则移动到下一个数据库并执行相同的操作,直到检查完所有数据库。

当前伪代码:

IF(exists(select top 1 * from Server1.Database1.Table where num = @SerialNumberInput))
BEGIN
    select top 1 * from Server1.Database1.Table where num = @SerialNumberInput
END ELSE
    IF(exists(select top 1 * from Server2.Database2.Table where num = @SerialNumberInput))
BEGIN
    select top 1 * from Server2.Database2.Table where num = @SerialNumberInput
END ELSE
--Server3.Database3
--Server4.Database4
--etc...

但我不喜欢所有这些查询重复,也不喜欢我不得不通过两次调用相同的查询来两次调用服务器。我可以将结果保存到一个 table 变量中并检查它,但这感觉很糟糕。

评论时间太长。

But I don't like all this query repetition

我也不是,但对于这种情况,这是最干净的方法或最易读的恕我直言。

I don't like how I'm having to make a call to the server twice by calling the same query twice.

你不是,至少不完全是。 EXISTS returns 一个 BOOLEAN 值,所以只要你的谓词上有一个 INDEX,它应该很快。在第二个查询中,您返回包含所有列的第一行会稍微慢一些。此外,除非您喜欢,否则 EXISTS 中不需要 top 1 *。您可以使用 SELECT 1 任何东西 因为结果是 BOOLEAN.

另一件事是你使用 TOP 而没有 ORDER BY 这意味着你不关心返回的行,并且每次执行时该行(可能)不同这个。 More on that in this blog.

如果您真的不想使用 EXISTS,您可以使用 @@ROWCOUNT.

将其拆分
select top 1 * from Server1.Database1.Table where num = @SerialNumberInput
if @@ROWCOUNT = 1
   return
else
select top 1 * from Server2.Database2.Table where num = @SerialNumberInput
if @@ROWCOUNT = 1
   return
else
...

或者,如果架构相同并且您不想要 NULL 数据集...就像您对 table 变量所说的那样。

create table #Temp(...)

insert into #Temp
select top 1 * from Server1.Database1.Table where num = @SerialNumberInput
if @@ROWCOUNT = 1
    select * from #Temp
    return
else
insert into #Temp
select top 1 * from Server2.Database2.Table where num = @SerialNumberInput
if @@ROWCOUNT = 1
    select * from #Temp
    return
else
...

因为您只插入一行,所以会很快。更大的数据集自然会花费更长的时间。