首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 以 image 型別儲存圖片、文件等二進位資料:textcopy 工具完整教學

     編輯:關於SqlServer

SQL Server image(或現代 varbinary(max))可儲存任意二進位資料。透過隨附 textcopy.exe 命令列工具,無需撰寫程式即可完成大型二進位資料的匯入/匯出。

前置準備

  1. 確認 textcopy.exe 存在:
    SQL 2000:C:\Program Files\Microsoft SQL Server\MSSQL\Binn
    SQL 2005+:C:\Program Files\Microsoft SQL Server\90\Tools\Binn(或更新版本對應路徑)
  2. 若缺少,從安裝媒體複製至上述目錄或加入 PATH。

步驟 1:建立資料表與初始化

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);

步驟 2:建立儲存程序包裝 textcopy(選用,方便重複呼叫)

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

步驟 3:匯入檔案(/I 參數)

-- 匯入圖片到 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';

步驟 4:匯出還原檔案(/O 參數)

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';

現代最佳實務(SQL 2005+)

  • 改用 VARBINARY(MAX) 取代 IMAGE(後者已棄用)。
  • 應用層使用 SqlCommand 參數化 @FileData VARBINARY(MAX) 直接讀寫,無需 xp_cmdshell(安全性更高)。
  • 超大檔案(> 2GB)啟用 FILESTREAM 或 FileTable,儲存於檔案系統並保持交易一致性。
  • xp_cmdshell 預設停用,生產環境嚴禁啟用;如必須用,限定特定 Proxy 帳號與最小權限。

快速驗證

SELECT DocID, DATALENGTH(DocData) AS Bytes FROM DocStore;
-- 匯入後 Bytes 應等於原檔案大小

掌握 textcopy 快速原型驗證,生產系統請遷移至參數化應用層寫入或 FILESTREAM 架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved