Sql server 如何从Filetable中删除文档?

Sql server 如何从Filetable中删除文档?,sql-server,stored-procedures,filetable,Sql Server,Stored Procedures,Filetable,我正在尝试从sql server的文件表中删除一些文档 在这里,我有一个表,其中我将所有附件的详细信息和文档存储在sql server名为Attchemnts的文件表中 AttachmentDetails表具有以下架构 CREATE TABLE [dbo].[AttachmentDetails]( [Id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, [DocumentName] [nvarchar](max) NULL, [Doc

我正在尝试从sql server的文件表中删除一些文档

在这里,我有一个表,其中我将所有附件的详细信息和文档存储在sql server名为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

此过程假定只删除10天以前的视频/mp4文件,但它会从文件表中删除任何类型的文档

SQL是一种基于集合的语言。对于每个基于游标/循环的脚本,都有一个更简单、更快的基于集合的解决方案。在任何情况下,此查询的编写方式都会导致随机删除,因为无法保证在没有ORDERBY子句的情况下,所有排名前1的查询都会返回什么

看起来您正在尝试删除所有超过30天的视频附件。看起来日期还存储在一个名为table1的单独表中。如果使用from子句,可以编写一个DELETE语句,其行来自联接,例如:

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

执行删除查询将仅删除ID为1的附件。询问

select *
from Attachments
```

Will return :

```
ID  DocumentType
2   audio/mp3
3   application/octet-stream
4   video/mp4
```

删去从…起哪里存储类型不重要此处发布的查询将导致随机删除,因为无法保证在没有ORDER BY子句的情况下,所有排名前1的查询将返回什么。你想干什么?编写一个正确的删除查询要比编写这个复杂的循环容易得多。我编写了循环,因为在那里我需要检查表中每个记录的条件。这就是所有查询中WHERE子句的作用。其中DocumentType='video/mp4'和CreatedDateTimecreate 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())
select *
from Attachments
```

Will return :

```
ID  DocumentType
2   audio/mp3
3   application/octet-stream
4   video/mp4
```