Sql 如果存在结果而不再次运行同一查询,则显示查询结果

Sql 如果存在结果而不再次运行同一查询,则显示查询结果,sql,sql-server,ssms,sql-server-2014,Sql,Sql Server,Ssms,Sql Server 2014,我希望有一个存储过程,它将一个SerialNumber nvarchar作为输入,并检查多个数据库,查看该序列号是否存在,如果确实存在,然后返回查询结果,否则移动到下一个数据库并执行相同的操作,直到检查完所有数据库 当前伪代码: IF(exists(select top 1 * from Server1.Database1.Table where num = @SerialNumberInput)) BEGIN select top 1 * from Server1.Database1.

我希望有一个存储过程,它将一个SerialNumber nvarchar作为输入,并检查多个数据库,查看该序列号是否存在,如果确实存在,然后返回查询结果,否则移动到下一个数据库并执行相同的操作,直到检查完所有数据库

当前伪代码:

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...
但是我不喜欢所有这些重复的查询,我也不喜欢通过两次调用同一个查询来两次调用服务器。我可以将结果保存到一个表变量中,然后检查一下,但这感觉有点不对劲。

太长了,无法评论

但我不喜欢这些重复的问题

我也是,但对于这种情况,它是最干净的方法或最可读的IMHO

我不喜欢每次都要打两次电话给服务器 调用同一查询两次

你不是,至少不完全是。EXISTS返回一个布尔值,所以只要谓词上有一个索引,它就会非常快。在第二个查询中,返回包含所有列的第一行会稍微慢一些。此外,除非你喜欢,否则你不需要在EXISTS中使用top 1*。由于结果是布尔值,因此可以使用SELECT 1或任何选项

另一件事是,您正在使用TOP with and ORDER,这意味着您不关心返回的是哪一行,并且在每次执行该命令时,该行可能会有所不同

如果确实不想使用EXISTS,可以使用@ROWCOUNT将其分解

或者,如果模式相同,并且您不需要空数据集。。。就像你对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
...

因为您只插入一行,所以它会非常快。较大的数据集自然需要更长的时间。

Database1、Database2是实际名称吗?结果是否过期并需要重新查询?在您的示例中,Server1是数据库名称。这是真的吗?还是你在试图引用链接服务器中的表?我不会认为@table路由是一种黑客行为。。插入并选择top1。。如果rowcount是1,那么select from the table varTable变量必须反映源表,但是如果您的表具有不同的结构,那么,正如我所看到的,您需要查询两次-以获得行数和实际行数。+1感谢您的见解。对于您的查询示例:在返回一个带有行的数据集之前,它不会每次都返回一个空数据集吗?是的,可能不需要这样做。我以为你只是想短路,这样其他的查询就不会运行了。如果模式相同,那么您可以选择into temp,因此,当它返回时,您只有一行。
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
...