假设您的源表如下所示:
CREATE TABLE audioFiles
(
AudioID INT IDENTITY NOT NULL PRIMARY KEY,
[Name] VARCHAR(50) NOT NULL,
[AudioData] VARBINARY(MAX) FILESTREAM NULL,
RowGuid UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL UNIQUE DEFAULT(NEWID())
)
然后你可以创建第二个表:
CREATE TABLE audioBlobs
(
AudioID INT IDENTITY NOT NULL PRIMARY KEY,
[Name] VARCHAR(50) NOT NULL,
[AudioData] VARBINARY(MAX) NULL,
RowGuid UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL UNIQUE DEFAULT(NEWID())
)
GO
(请注意,AudioData
第二个表中的列中缺少 FILESTREAM ......导致二进制数据与记录的其余部分一起存储在页面上,而不是在单独的 FILESTREAM 文件组中。)
然后您可以将数据从一个表插入到另一个表中:
SET IDENTITY_INSERT audioBlobs ON
INSERT INTO audioBlobs (AudioID, Name, AudioData, RowGuid)
SELECT AudioID, Name, AudioData, RowGuid FROM audioFiles
SET IDENTITY_INSERT audioBlobs OFF
完成后,您可以删除原始表,并将新表重命名为原始表的名称:
DROP TABLE audioFiles
GO
EXECUTE sp_rename N'dbo.audioBlobs', N'audioFiles', 'OBJECT'
GO
VARBINARY(MAX)
或者,您可以在原始表中的列旁边创建第二列FILESTREAM
,并使用旧列的数据更新新列的值。请注意,无论采用哪种方式,您的总磁盘空间使用量都会增加一倍以上——实际音频数据的空间增加一倍,将其从 FILESTREAM 文件组迁移到 PRIMARY 文件组(或主数据文件所在的任何位置),再加上您的事务日志中有很多空间。