Показать результаты запроса, если результаты существуют без повторного выполнения того же запроса - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу иметь хранимую процедуру, которая будет принимать один 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...

Но мне не нравятся все эти повторения запросов, и мне не нравится, как у менясделать звонок на сервер дважды, вызвав один и тот же запрос дважды.Я мог бы сохранить результат в табличной переменной и просто проверить это, но это кажется хакерским.

1 Ответ

0 голосов
/ 28 ноября 2018

Слишком долго комментировать.

Но мне не нравятся все эти повторения запросов

Мне тоже, но в данном случае это самый чистый метод или большинствоИМХО для чтения.

Мне не нравится, как мне приходится дважды звонить на сервер, дважды вызывая один и тот же запрос.

Вы непо крайней мере, не совсем.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
...

Поскольку вы вставляете только одну строку, было быбудь довольно быстрымБольшие наборы данных, естественно, займут больше времени.

...