7

在SQL Server 2008 R2中,我可以使用varbinary(max)插入的文件的最大大小是多少?我試圖將列中的最大值更改爲超過8,000字節,但它不會讓我,所以我猜最大是8,000字節,但從this article on MSDN,它說最大存儲大小爲2^31- 1個字節:SQL Server 2008 R2 Varbinary最大大小

VARBINARY [(ñ | 最大)]

可變長度的二進制數據。 n可以是從1到8,000的值。 max表示最大存儲大小爲2^31-1字節。存儲大小是輸入數據的實際長度+ 2個字節。輸入的數據可以是0字節。 varbinary的ANSI SQL同義詞是二進制變化

那麼我如何在varbinary字段中存儲較大的文件?我不使用FILESTREAM考慮,因爲我要保存的文件是從200KB到1MB最大,該代碼我使用:

UPDATE [table] 
SET file = (SELECT * FROM OPENROWSET (BULK 'C:\A directory\A file.ext', SINGLE BLOB) alias) 
WHERE idRow = 1 

我已經能夠成功地執行該代碼的文件小於或等於比8000字節。如果我嘗試使用8001字節大小的文件,它將會失敗。我在表格中的文件字段有一個名爲「文件」的字段,類型varbinary(8000),正如我所說的,我無法更改爲更大的值。

+1

你是怎麼試的?你可以顯示你用來做這個的代碼和表的創建表結構嗎?也沒有'nvarbinary'這樣的東西。 –

+0

對不起,我的意思是varbinary(max),我也加了我用的代碼,非常感謝 –

+0

您是否檢查過兼容模式設置? –

回答

15

我無法重現此場景。我試過如下:

USE tempdb; 
GO 

CREATE TABLE dbo.blob(col VARBINARY(MAX)); 

INSERT dbo.blob(col) SELECT NULL; 

UPDATE dbo.blob 
    SET col = (SELECT BulkColumn 
    FROM OPENROWSET(BULK 'C:\Folder\File.docx', SINGLE_BLOB) alias 
); 

SELECT DATALENGTH(col) FROM dbo.blob; 

結果:

-------- 
39578 

如果這是越來越在8K上限,那麼我會猜,要麼下列條件之一爲真:

  1. 列實際上是VARBINARY(8000)

  2. 您正在Management Studio中選擇數據,並分析顯示在那裏的數據的長度。在文本結果中限制爲最大8192個字符,如果是這種情況,那麼直接對列使用DATALENGTH()是一種更好的方法。

1

我敢說,使用文件流的文件基礎上,大於1 MB來自跟隨:MS TechNet | FILESTREAM Overview

在SQL Server中,BLOB的可以是存儲在 表中的數據,或者存儲在文件系統 數據FILESTREAM varbinary(max)對象的標準varbinary(max)數據。數據的大小和用途決定了您是否應該使用數據庫存儲或文件系統存儲 。如果 下列條件爲真,你應該考慮使用FILESTREAM

  • 對象,會被存儲,平均而言,大於1 MB。
  • 快速讀取訪問非常重要。
  • 您正在開發爲應用程序邏輯使用中間層的應用程序。

對於較小的對象,存儲varbinary(max)數據庫中的BLOB 通常會提供更好的流式傳輸性能。

1

「SET TEXTSIZE」 指定varchar(max)nvarchar(max)varbinary(max)textntext,以及圖像由SELECT語句返回數據的大小。

select @@TEXTSIZE 

在SQL Server Native Client的ODBC驅動程序和SQL Server本機客戶端OLE DB提供程序SQL Server連接時自動設置TEXTSIZE到2147483647。 SET TEXTSIZE的最大設置爲2千兆字節(GB),以字節爲單位。設置爲0會將大小重置爲默認值(4 KB)。

如上所述,對於大文件,您應該更喜歡文件流。