Запрос, процедура или логика, которые я мог бы использовать, чтобы получать только новые записи из таблицы. - PullRequest
0 голосов
/ 04 апреля 2019

Я новичок в SQL и пытаюсь найти решение для этого.

У меня есть база данных с несколькими таблицами на ней, а затем я использую sqlcmd для экспорта всех записей для каждой таблицы в файл csv(1 файл CSV для каждой таблицы)

После этого все, что я делаю с файлом Excel, помещает его в контейнер BLOB-объектов на Azure.

Как я могу это сделать, чтобы при наличииэто новая запись или обновление таблицы, после чего она создаст файл Excel, а затем просто введет в нее новые записи?без старых записей.

Я использую только SQL Server Express и не могу использовать стандарт SQL Server.

Приведенный ниже код экспортирует все записи в таблице.

sqlcmd -s"имя_сервера" -d "имя базы данных" -u имя пользователя -P пароль -Q "выбрать * из dbo.tbl_check" -o "C: \ Test \ dbo_tbl_check.csv" -W -w 1024 -s ","

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

picture1

, тогда он отобразил бы весь результат в CSV-файле.

picture2

, и затем база данных обновляется снова 6 марта

picture3

я надеялсячто файл Excel, который он будет воссоздавать, будет просто иметь эту запись.

picture4

1 Ответ

0 голосов
/ 05 апреля 2019

Создайте таблицу для запоминания последнего экспортированного идентификатора:

Create Table IncrementalExportMem
(
TableName NVARCHAR(200) NOT NULL,
LastId INT NOT NULL CONSTRAINT DF_IncrementalExportMem_LastId DEFAULT(0),
CONSTRAINT PK_IncrementalExportMem PRIMARY KEY CLUSTERED (TableName)
)

Создайте процедуру для таблицы экспорта:

CREATE Procedure spIncrementalExport
@TableName NVARCHAR(200),
@IdField NVARCHAR(200),
@SelectColumns NVARCHAR(max)='*'
AS
BEGIN
DECLARE @SQL NVARCHAR(MAX)
DECLARE @LastID INT
DECLARE @NextLastId INT

    SELECT @LastID FROM IncrementalExportMem WHERE Tablename=@TableName

IF @LastID IS NULL
BEGIN
    INSERT INTO IncrementalExportMem(tableName) VALUES(@TableName)
    SET @LastID=0
END

SET @SQL='SELECT @NextLastId=MAX('+ @IdField +') FROM '+@TableName
exec sp_executesql @SQL,N'@NextLastId INT OUTPUT',@NextLastId OUTPUT

SET @NextLastId= ISNULL(@NextLastId,0)


SET @SQL=CONCAT('SELECT ',@SelectColumns,' FROM ',@TableName,' WHERE ',@IdField,'>',@LastID,' AND ',@IdField,'<=',@NextLastId)
exec sp_executesql @SQL

UPDATE IncrementalExportMem SET LastId=@NextLastId WHERE Tablename=@TableName

END

в вашей команде сценария использования:

sqlcmd -s "servername" -d "databasename" -u username -P password -Q "exec spIncrementalExport 'your_table','id_in_table'" -o "C:\Test\dbo_tbl_check.csv" -W -w 1024 -s","
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...