#sql-server #database-cursor
#sql-server #база данных-курсор
Вопрос:
Я застрял в одном месте в sql-запросе. У меня есть 20 баз данных, и имя таблицы и имя столбцов всех баз данных одинаковы, но данные разные. Я создаю sql-запрос, чтобы получить сумму платежа на определенную дату из всех баз данных вместе.
У меня много столбцов в таблице платежей. Мне нужно указать сумму (сумму) в отношении столбца paymentTypeID, потому что я могу получить сумму на основе paymentTypeID. Все идентификаторы paymenttypeid в базах данных разные, но иногда это одно и то же. Я создал курсор для этого.
Мой код:
create table #tmpDBs(DBName varchar(255), CurrentDayPaymentAmount float)
declare cDBs cursor for
select name from master.dbo.sysdatabases
declare @DB varchar(255)
open cDBs
fetch next from cDBs into @DB
while @@fetch_status = 0
begin
exec('
declare @DateCurrent datetime
set @DateCurrent = '{Current Date}'
insert into #tmpDBs
select DBName = ' @DB ',
CurrentDayPaymentAmount = (select sum(p.amount) from ' @DB '.dbo.Payment p where p.eDate between @DateCurrent and dateadd(day, 1, @DateCurrent) and (p.paymenttypeid in (14, 15, 16, 17, 21, 22, 24, 35, 37, 38, 50)))
')
fetch next from cDBs into @DB
end
close cDBs
deallocate cDBs
select * from #tmpDBs
drop table #tmpDBs
Я использовал предложение In для передачи всех баз данных paymenttypeid вместе.
Этот код предназначен для получения суммы платежа из 2 баз данных. paymenttypeid 14, 15, 16,17, 22, 24, 38 это для первой базы данных, а 21, 35, 37, 50 — для второй базы данных. Моя проблема в том, что когда я помещаю эти paymentTypeID в предложение In, он добавляет сумму соответствующего paymenttypeid другой базы данных.
Например, если фактическая сумма первой базы данных составляет 4589 $, но она добавляет дополнительную сумму, скажем, 5469 $, используя второй paymenttypeid базы данных. Если я передаю только один paymenttypeid базы данных, он показывает правильную сумму.
В чем проблема в моем запросе.
Ответ №1:
Я думаю, вы сами объяснили проблему: вам нужны только типы 1, 2 и 3 из DB1 и только типы 4, 5 и 6 из DB2, но ваш запрос этого не делает, он запрашивает типы 1, 2, 3, 4, 5 и 6 из DB1 и DB2.
Это означает, что вам нужно использовать другое предложение WHERE для каждой базы данных, в зависимости от того, какие типы вы хотите. Итак, как вы узнаете, какие типы вы хотите получить из каждой базы данных, и как вы можете выразить эту логику в своей хранимой процедуре?
В качестве совершенно другого решения создайте представление в каждой базе данных с правильным предложением WHERE, а затем просто запросите представление для вашего отчета.
Комментарии:
1. Спасибо за ответ. У меня есть все PaymentTypeID всех используемых баз данных. Я думаю, что это происходит из-за сопоставления одного paymenttypeid базы данных в другом paymenttypeid базы данных. Например, у меня есть 10 paymentid в одной базе данных и используется только 3 paymenttypeid. Если один из любых 3 или всех 3 paymenttypeid совпадает в другой базе данных, добавьте сумму этой базы данных и покажите неправильную сумму. И у меня есть программное обеспечение моей компании, в котором я не могу создавать представления или таблицы. В этом программном обеспечении я могу запускать только команду ВЫБОРА, создавать только временную таблицу и курсор. Это моя проблема. Как я могу это решить. Пожалуйста, помогите.