抱歉,如果这已在其他地方得到回答,但我在这里或网上找不到任何东西。
openrowset 有文件大小限制吗?我正在尝试编写一个存储过程,其中一部分检查文件中是否存在某些字符,如果存在,我必须跳到存储过程的下一部分。到目前为止,我只是将整个文件批量插入到一个单列表中,然后做了:
IF(SELECT COUNT(*) FROM #fulltable WHERE fulltable LIKE '%}%')>0 GOTO NEXTSECTION
IF(SELECT COUNT(*) FROM #fulltable WHERE fulltable LIKE '%~%')>0 GOTO NEXTSECTION
IF(SELECT COUNT(*) FROM #fulltable WHERE fulltable LIKE '%#%')>0 GOTO NEXTSECTION
在处理大文件(有时超过 10GB)时,它很可靠,但速度很慢。我认为下面的查询对于大文件会更快
DECLARE @FILE NVARCHAR(MAX)
select @FILE = BULKCOLUMN from (
select * from openrowset(BULK N'filpath', single_clob) [a]
)a
IF(SELECT IIF(@FILE LIKE '%{%',1,0)) = 1 GOTO NEXTSECTION
IF(SELECT IIF(@FILE LIKE '%}%',1,0)) = 1 GOTO NEXTSECTION
IF(SELECT IIF(@FILE LIKE '%~%',1,0)) = 1 GOTO NEXTSECTION
IF(SELECT IIF(@FILE LIKE '%@%',1,0)) = 1 GOTO NEXTSECTION
IF(SELECT IIF(@FILE LIKE '%£%',1,0)) = 1 GOTO NEXTSECTION
但正如我所说的批量插入是可靠的,如果存在某种文件大小限制,我不想冒着使用 OPENROWSET 时文件被截断的风险。
任何关于此事的建议将不胜感激。
我知道这不是您的主要问题,但您提到了性能缓慢。当检查某个字符或子字符串是否存在于较大的字符串中时,您应该尝试使用 CHARINDEX('x', strColumn) 而不是 LIKE '%x%'。这将大大提高你的表现。使用 LIKE 和 % 围绕您的搜索词非常缓慢且成本高昂。
我不相信 OPENROWSET 有限制,至少我没有遇到过 - 而且没有记录在案,所以回答这个问题,不。
但是,SSMS 是一个 32 位应用程序,所以我认为这将它在 64 位操作系统上的内存限制为 4gb - 所以无论你做什么,你都会受到限制。这并不意味着您可以导入的最大文件为 4gb,但它会使用可用的内存通过应用程序将其流式传输。
此外,如果您在笔记本电脑/客户端 SSMS 上运行 OPENROWSET 到远程服务器,那也会减慢您的速度。考虑在服务器上运行 OPENROWSET - 我已经看到通过在服务器上而不是在客户端上进行工作来大大提高速度。
来自微软:-
注意 SSMS 是一个 32 位进程。因此,它被限制为 2 GB 的内存。(https://support.microsoft.com/en-za/help/2874903)