Как удалить документы из Filetable?

Я пытаюсь удалить некоторые документы из таблицы файлов сервера sql.

Здесь у меня есть одна таблица, в которой я храню все данные и документы моего вложения в файловой таблице сервера sql с именем Attchemnts.

Таблица AttachmentDetails имеет следующую схему:

CREATE TABLE [dbo].[AttachmentDetails](
    [Id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [DocumentName] [nvarchar](max) NULL,
    [DocumentType] [nvarchar](max) NULL,
    [ModifiedDateTime] [datetime] NOT NULL,
    [CreatedDateTime] [datetime] NOT NULL,
    [CreatedBy] [nvarchar](254) NULL,
    [ModifiedBy] [nvarchar](254) NULL,
    [IsDeleted] [bit] NULL,
    )

Всякий раз, когда я загружаю какой-либо документ в таблицу файлов, я вставляю подробную информацию об этом документе в таблицу AttchemntsDetails в соответствии со схемой таблицы.

Здесь я попробовал следующее решение

CREATE PROCEDURE [dbo].[DeleteFiles] 
AS
BEGIN
DELETE Attachments
FROM AttachmentDetails a
WHERE 
    DocumentType = 'video/mp4'  AND  DATEDIFF(day, a.CreatedDateTime, GETDATE())<11
end

Эта процедура предполагает удаление только файлов Video/mp4, которые старше на 10 дней. Но она удаляет любой тип документа из таблицы файлов.


person Madhav    schedule 12.08.2019    source источник
comment
DELETE ... FROM ... WHERE ... Тип хранилища не имеет значения   -  person Panagiotis Kanavos    schedule 12.08.2019
comment
Опубликованный здесь запрос приведет к случайному удалению, поскольку нет гарантии того, что все эти TOP 1 запросы вернут, если нет предложения ORDER BY. Что ты пытаешься сделать? Гораздо проще написать правильный DELETE запрос, чем этот сложный цикл.   -  person Panagiotis Kanavos    schedule 12.08.2019
comment
Я написал цикл, потому что хочу проверить это условие для каждой записи в таблице.   -  person Madhav    schedule 12.08.2019
comment
Вот для чего предназначено предложение WHERE во всех запросах. WHERE DocumentType = 'video/mp4' AND CreatedDateTime < DATEADD(day,30,getdate()) проверяет все записи на оба условия и удаляет только те, которые соответствуют   -  person Panagiotis Kanavos    schedule 12.08.2019
comment
Кстати, опубликуйте схемы таблиц, образец данных и желаемый результат. Прямо сейчас люди должны угадать, что это за таблицы. Является ли ID первичным ключом в обеих таблицах? Что такое Table1?   -  person Panagiotis Kanavos    schedule 12.08.2019


Ответы (1)


SQL — это язык, основанный на наборах. Для каждого скрипта на основе курсора/цикла есть гораздо более простое и быстрое решение на основе набора. В любом случае способ написания этого запроса приведет к случайным удалениям, поскольку нет гарантии, что все эти запросы TOP 1 вернут без предложения ORDER BY.

Похоже, вы пытаетесь удалить все прикрепленные видео старше 30 дней. Также похоже, что дата хранится в отдельной таблице под названием table1. Вы можете написать оператор DELETE, строки которого поступают из JOIN, если вы используете предложение FROM, например:

DELETE Attachments
FROM Attachments inner join table1 a on a.ID=Attachments.ID
WHERE 
    DocumentType = 'video/mp4' AND
    CreatedDateTime < DATEADD(day,-30,getdate())

ИЗМЕНИТЬ

Исходный запрос содержал DATEADD(day,30,getdate()) вместо DATEADD(day,-30,getdate()).

Пример

Предполагая, что у нас есть эти две таблицы:

create table attachments (ID int primary key,DocumentType nvarchar(100))

insert into attachments (ID,DocumentType)
values
(1,'video/mp4'),
(2,'audio/mp3'),
(3,'application/octet-stream'),
(4,'video/mp4')

а также

create table table1 (ID int primary key, CreatedDateTime datetime)

insert into table1 (ID,CreatedDateTime)
values
(1,dateadd(day,-40,getdate())),
(2,dateadd(day,-40,getdate())),
(3,getdate()),
(4,getdate())

Выполнение запроса DELETE удалит только вложение с идентификатором = 1. Запрос

select *
from Attachments
```

Will return :

```
ID  DocumentType
2   audio/mp3
3   application/octet-stream
4   video/mp4
```
person Panagiotis Kanavos    schedule 12.08.2019
comment
Я попробовал запрос выше и удалил все документы из таблицы файлов. - person Madhav; 12.08.2019
comment
Это произошло бы, если бы все соответствовали критериям. Если все прикрепленные файлы являются видео старше 30 дней, они будут удалены. С другой стороны, если столбцы ID используются неправильно и, например, столбец table1.ID не уникален, возможно, для каждого вложения существует соответствующая запись table1. Вы не предоставили никакой информации о таблицах, только неверный запрос - person Panagiotis Kanavos; 12.08.2019
comment
На самом деле было всего 2-3 документа типа видео, остальное были изображения, текст и файлы doc. да, я согласен, что я не предоставил схему таблицы. - person Madhav; 12.08.2019
comment
Упс, должно быть -30, а не 30 - person Panagiotis Kanavos; 12.08.2019