假設你的源表看起來像這樣:
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
(請注意,FILESTREAM是從第二個表中的列AudioData
失蹤.. 。導致二進制數據與頁面的其餘部分存儲在一起,而不是單獨的FILESTREAM文件組中。)
然後你可以直接插入ERT從一個表到另一個數據:
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文件組(或主要數據文件所在的位置),再加上您的事務日誌中有很多空間。
NEWID()不適合索引。更好地使用NEWSEQUENTIALID()來代替。 –