Слишком долго комментировать.
Но мне не нравятся все эти повторения запросов
Мне тоже, но в данном случае это самый чистый метод или большинствоИМХО для чтения.
Мне не нравится, как мне приходится дважды звонить на сервер, дважды вызывая один и тот же запрос.
Вы непо крайней мере, не совсем.EXISTS
возвращает значение BOOLEAN
, поэтому, если в вашем предикате есть INDEX
, оно должно быть довольно быстрым.Второй запрос, в котором вы возвращаете первую строку со всеми столбцами, будет немного медленнее.Кроме того, вам не нужно top 1 *
в EXISTS
, если вам просто не нравится это.Вы можете использовать SELECT 1
или что угодно , так как результат BOOLEAN
.
Другое дело, что вы используете TOP
без и ORDER BY
, что означает, что вам все равнострока возвращается, и все в порядке с этой строкой, отличающейся (потенциально) каждый раз, когда вы выполняете это. Подробнее об этом в этом блоге.
Если вы действительно хотите не использовать 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
наборов данных ... что-то вроде того, что вы сказали с табличной переменной.
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
...
Поскольку вы вставляете только одну строку, было быбудь довольно быстрымБольшие наборы данных, естественно, займут больше времени.