SQL Server image(或現代 varbinary(max))可儲存任意二進位資料。透過隨附 textcopy.exe 命令列工具,無需撰寫程式即可完成大型二進位資料的匯入/匯出。
textcopy.exe 存在:C:\Program Files\Microsoft SQL Server\MSSQL\BinnC:\Program Files\Microsoft SQL Server\90\Tools\Binn(或更新版本對應路徑)CREATE TABLE DocStore (
DocID INT PRIMARY KEY,
DocData IMAGE -- 或 VARBINARY(MAX)
);
-- 必須先插入一列並給予非 NULL 二進位值(0x 代表空二進位)
INSERT INTO DocStore (DocID, DocData) VALUES (1, 0x);
INSERT INTO DocStore (DocID, DocData) VALUES (2, 0x);
CREATE PROCEDURE sp_TextCopy
@SrvName VARCHAR(30), @Login VARCHAR(30), @Pwd VARCHAR(30),
@DBName VARCHAR(30), @TblName VARCHAR(30), @ColName VARCHAR(30),
@FileName VARCHAR(260), @WhereClause VARCHAR(100), @Direction CHAR(1)
AS
BEGIN
DECLARE @Cmd VARCHAR(8000);
SELECT @Cmd = 'textcopy /S ' + @SrvName +
' /U ' + @Login +
' /P ' + @Pwd +
' /D ' + @DBName +
' /T ' + @TblName +
' /C ' + @ColName +
' /W "' + @WhereClause + '"' +
' /F ' + @FileName +
' /' + @Direction;
EXEC master..xp_cmdshell @Cmd;
END
-- 匯入圖片到 DocID=1
EXEC sp_TextCopy 'MyServer', 'sa', 'pwd', 'MyDB', 'DocStore', 'DocData',
'C:\Images\photo.jpg', 'WHERE DocID=1', 'I';
-- 匯入 Word 文件到 DocID=2
EXEC sp_TextCopy 'MyServer', 'sa', 'pwd', 'MyDB', 'DocStore', 'DocData',
'C:\Docs\spec.docx', 'WHERE DocID=2', 'I';
EXEC sp_TextCopy 'MyServer', 'sa', 'pwd', 'MyDB', 'DocStore', 'DocData',
'C:\Output\photo.jpg', 'WHERE DocID=1', 'O';
EXEC sp_TextCopy 'MyServer', 'sa', 'pwd', 'MyDB', 'DocStore', 'DocData',
'C:\Output\spec.docx', 'WHERE DocID=2', 'O';
VARBINARY(MAX) 取代 IMAGE(後者已棄用)。SqlCommand 參數化 @FileData VARBINARY(MAX) 直接讀寫,無需 xp_cmdshell(安全性更高)。xp_cmdshell 預設停用,生產環境嚴禁啟用;如必須用,限定特定 Proxy 帳號與最小權限。SELECT DocID, DATALENGTH(DocData) AS Bytes FROM DocStore;
-- 匯入後 Bytes 應等於原檔案大小
掌握 textcopy 快速原型驗證,生產系統請遷移至參數化應用層寫入或 FILESTREAM 架構。