Похоже, у вас есть смесь требований к хранилищу данных и требований к рабочему процессу.SQL Server отлично подходит для хранения данных, но у вас есть несколько вариантов для управления элементом рабочего процесса.Вы можете использовать хранимую процедуру для управления своим рабочим процессом или службы интеграции SQL Server (SSIS).
Обозначенная проблема, по-видимому, требует только последнего ежедневного снимка (по одному на каждый день изменения данных), поэтому будет достаточно ежедневного просмотра последнего снимка.В качестве альтернативы, если вам действительно нужно записывать и иметь возможность отслеживать все внутридневные транзакции, то вы можете разделить таблицу на две части (транзакция и ежедневный снимок), но я считаю, что в этом нет необходимости.
Решение для хранимой процедуры
Чтобы сохранить все в SQL Server, вы должны использовать процедуру, которая создает, вставляет и копирует ваши данные соответственно, в зависимости отна том, что уже существует,
Следующий скрипт устанавливает таблицу с именем AccountDetails с одной учетной записью образца данных;
CREATE TABLE [dbo].AccountDetails(
[BusinessDate] [smalldatetime] NOT NULL,
[Account] [int] NOT NULL,
[Guid] [uniqueidentifier] NOT NULL,
[InitialAmount] [money] NULL,
[LetterDate] [smalldatetime] NULL,
[LetterType] [varchar](50) NULL,
[Status] [varchar](50) NULL,
[Reason] [varchar](50) NULL,
[FollowUpDate] [smalldatetime] NULL,
[LastModifiedBy] [varchar](50) NULL,
[LastModifiedDate] [datetime] NULL
) ON [PRIMARY]
INSERT INTO AccountDetails
VALUES ('2011-01-01', 123, NEWID(), 20, '2011-01-01', 'initial', 'reviewed', 'check issue', '2011-01-02', 'dwb',GETDATE())
Хранимая процедура AccountDetailsController позволяет вам либо
- Обновление существующей учетной записи, в которой есть запись на сегодня.Поля, переданные как пустые, примут значение предыдущих записей.
- Вставка новой записи на основе ранее введенных данных учетной записи.Это соответствует сценарию, когда учетная запись уже настроена, но требуется обновить некоторые детали.Поля, переданные как пустые, примут предыдущее значение записи
- Вставить новую запись, без ранее введенных данных учетной записи.Новая учетная запись, все поля вставляются в первый раз
.
CREATE PROCEDURE AccountDetailsController
@BusinessDate smalldatetime ,
@Account [int] ,
@Guid [uniqueidentifier] ,
@InitialAmount [money] ,
@LetterDate smalldatetime,
@LetterType varchar(50) ,
@Status varchar(50) ,
@Reason varchar(50) ,
@FollowUpDate smalldatetime,
@LastModifiedBy varchar(50)
AS
BEGIN
/*
-- test bed
-- remove when finished testing
DECLARE
@BusinessDate smalldatetime = '2011-01-01',
@Account [int] =123,
@Guid [uniqueidentifier] =null ,
@InitialAmount [money] =30 ,
@LetterDate smalldatetime = '2011-01-01',
@LetterType varchar(50) ='initial',
@Status varchar(50) = 'reviewed',
@Reason varchar(50) = 'check issue',
@FollowUpDate smalldatetime = null,
@LastModifiedBy varchar(50) = 'dwb'
*/
IF EXISTS (SELECT * FROM AccountDetails WHERE DateDiff(DAY,BusinessDate, @BusinessDate) = 0 AND @Account = [account])
BEGIN
--RECORD ALREADY EXISTS FOR TODAY, UPDATE
UPDATE AccountDetails
SET BusinessDate = ISNULL(@BusinessDate, BusinessDate),
[guid] = ISNULL(@Guid, [guid]),
InitialAmount = ISNULL(@InitialAmount, InitialAmount),
LetterDate = ISNULL(@LetterDate, LetterDate),
LetterType = ISNULL(@LetterType, LetterType) ,
[Status] = ISNULL(@Status ,[Status] ) ,
Reason = ISNULL(@Reason, reason) ,
FollowUpDate = ISNULL(@FollowUpDate, FollowUpDate),
LastModifiedBy = ISNULL(@LastModifiedBy, LastModifiedBy) ,
LastModifiedDate = GETDATE()
FROM AccountDetails ad
WHERE DateDiff(DAY,BusinessDate, @BusinessDate) = 0
AND @Account = [account]
END
ELSE IF EXISTS (SELECT * FROM AccountDetails WHERE @Account = [account])
BEGIN
--RECORD ALREADY EXISTS, BUT FOR ANOTHER DAY. USE THIS AS THE BASIS OF TODAYS RECORD
INSERT INTO AccountDetails
SELECT @BusinessDate,
@Account,
ISNULL (@Guid, ad.guid),
ISNULL(@InitialAmount, InitialAmount),
ISNULL(@LetterDate, LetterDate),
ISNULL(@LetterType, LetterType) ,
ISNULL(@Status ,[Status] ) ,
ISNULL(@Reason, reason) ,
ISNULL(@FollowUpDate, FollowUpDate),
ISNULL(@LastModifiedBy, LastModifiedBy) ,
GETDATE()
FROM AccountDetails ad
WHERE Account = @Account
AND BusinessDate =
(
SELECT MAX(BusinessDate)
FROM AccountDetails
WHERE @Account = [account]
)
END
ELSE
BEGIN
--NO PREVIOUS RECORD EXISTS
INSERT INTO AccountDetails
VALUES (@BusinessDate,
@Account,
@Guid,
@InitialAmount,
@LetterDate,
@LetterType,
@Status,
@reason ,
@FollowUpDate,
@LastModifiedBy ,
GETDATE())
END
END
Следующее должно обслуживать все сценарии:
--update a record that exists for today
exec AccountDetailsController '2011-01-01', 123, null, 30, '2011-01-01', 'initial', 'reviewed', 'check issue', null, 'dwb'
--create a new record based on the last date entered for account
exec AccountDetailsController '2011-01-02', 123, null, 50, null, 'considered', null, null, null, 'dwb'
--create an entirely new record, no previous account exists
exec AccountDetailsController '2011-01-02', 456, 'C9CA5430-6D0E-47A3-BC89-D95C53B888E4' , 10, '2011-01-03', 'opened', 'new account', 'unknown','2011-01-03','dwb'
Это приведет кВ следующих;
Решение SSIS
Если ваша бизнес-логика и рабочий процесс более сложны, чем пример, который вы предоставляете, вы можете рассмотреть SSISуправлять и контролировать данные.Это вывело бы решение из SQL и первоначально привело бы к накладным расходам на установку, но обеспечило бы более четкое представление о том, что происходит с данными, и со временем может быть более управляемым, особенно с импортированными файлами.