如果没有再次 运行 相同查询的结果存在,则显示查询结果
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
...
因为您只插入一行,所以会很快。更大的数据集自然会花费更长的时间。
我想要一个存储过程,它将一个 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
...
因为您只插入一行,所以会很快。更大的数据集自然会花费更长的时间。