2017-01-10 5 views
0

попытке выбрать последнюю полную резервную копию файла из временной таблицы, используя приведенный ниже запрос:ВЫБРАТЬ Последние Full Backup File - T-SQL

CREATE TABLE #fileList (backupFile NVARCHAR(255)) 

SET @backupPath = '\\ServerName\SQLBACKUP\Full\' 
SET @cmd = 'DIR "' + @backupPath + '"' 

INSERT INTO #fileList 
EXEC master.sys.xp_cmdshell @cmd 

SELECT @lastFullBackup = MAX(backupFile) 
    FROM #fileList 
     WHERE backupFile LIKE '%Production_Backup%' 

Однако выбор 12/31/2016 резервного копирования, а последний. Я считаю, что причина в том, что, когда данные загружаются в временную таблицу, она загружает дату как MM/DD/YYYY вместо YYYY/MM/DD, а SQL смотрит только на месяц, а не на год.

Вот как данные выглядят в таблице TEMP:

12/31/2016 01:04 AM 24,418,292,736 Production_backup_2016_12_31_000000_4880248.bak 

ПРИМЕЧАНИЕ: Там только один столбец в таблице темп, поэтому я не могу преобразовать дату в формате ГГГГ/ММ/ДД.

Как получить последнюю резервную копию?

FYI-Это ссылка я ссылка: http://www.sqlideas.com/2009/07/auto-generate-sql-server-restore-script.html

+0

Является ли ваша дата сохраненной в качестве даты или хранится в виде строки? –

+0

Тип 'date' не имеет формата. Скорее всего, вы использовали 'varchar' вместо' date' при создании таблицы. Просто отбросьте его и перестройте с правильным типом. Хранение чисел или дат как строк является довольно уродливой ошибкой –

+1

Я бы не использовал этот скрипт, если бы был вами. SQL Server хранит историю архивации в MSDB, нет никаких оснований перечислять содержимое папки. Проверьте, например, [эта статья] (http://blog.sqlauthority.com/2010/11/10/sql-server-get-database-backup-history-for-a-single-database/), которая показывает, как использовать таблицы резервного копирования, backupmediafamily, чтобы получить список резервных копий и найти последние –

ответ

0

я должен был установить параметры DIR на это:

SET @cmd = 'DIR /O-D /B "' + @backupPath + '"' 

Делая это упорядочивает данные по дате и времени, и удаляет все ненужное форматирование и только вставки имя файла .bak, как это:

Production_backup_2017_01_09_200000_9387961.bak 
Production_backup_2017_01_08_200000_4133922.bak 
Production_backup_2017_01_07_200001_2542266.bak 

Оттуда изменить свой ВЫБЕРИТЕ сценарий к следующим образом:

SET @lastFullBackup = (SELECT TOP 1 backupFile 
         FROM #fileList 
         WHERE backupFile LIKE '%Production_Backup%') 
1

Это преобразует дату часть строки в дату и применить функцию MAX:

SELECT MAX(CAST(LEFT(backupfile,20) AS datetime)) from #filelist 
0

Max(backupFile) будет заказать backupFile в в алфавитном порядке по убыванию, а затем выбирает первую запись. Который никогда не будет заказан в датах. Попробуйте что-то вроде этого

select top 1 backupFile 
From #fileList 
WHERE backupFile LIKE '%Production_Backup%' 
Order by COnvert(date,date_col) 

хранить даты в Date типа данных, чтобы избежать превращения в Order by

По SQL-сервер по умолчанию отслеживает Full, Differential и резервного копирования журнала принятых в сервере. Для получения дополнительной информации проверить этот вопрос

https://dba.stackexchange.com/questions/89278/get-last-full-backup-and-transaction-log-backup-for-each-database

+0

. Как сохранить дату, если дата исходит из столбца Date Modified в файле explorer ... данные, которые вставлены, из каталога сети path – AznDevil92

+0

@ AznDevil92 - измените колонку на тип данных DATE. Это формат по умолчанию 'yyyy-mm-dd'. –

Смежные вопросы