在java中向sql列中插入8000多个字符(带换行符)

在java中向sql列中插入8000多个字符(带换行符),java,sql,sql-server,Java,Sql,Sql Server,如何使用java将数据插入MS-SQL中超过8000个字符且换行的一列 我有一个来自psinfo的软件列表-使用StringBuilder将arraylist排序并转换为字符串,并将\n替换为“'+CHAR(13)+CHAR(10)+” 我可以在没有CHAR 10和CHAR 13的情况下插入大约15000个字符的所有文本,但我不能用新行插入,它只能插入大约8000个字符 你知道问题出在哪里吗 我的现场软件为VARCHAR(MAX) 我有以下声明: stmt.executeUpdate(…”,so

如何使用java将数据插入MS-SQL中超过8000个字符且换行的一列

我有一个来自
psinfo
的软件列表-使用StringBuilder将arraylist排序并转换为字符串,并将
\n
替换为
“'+CHAR(13)+CHAR(10)+”

我可以在没有
CHAR 10
CHAR 13
的情况下插入大约15000个字符的所有文本,但我不能用新行插入,它只能插入大约8000个字符

你知道问题出在哪里吗

我的现场软件为VARCHAR(MAX)

我有以下声明:
stmt.executeUpdate(…”,software=CAST(“+software+”,作为varchar(MAX));
我建议使用
PreparedStatement

PreparedStatement stmt = con.prepareStatement("... software=? ...");
stmt.setString(index, veryLongStringWithNewlines);
stmt.executeUpdate();
这将避免字符串中与SQL方言的字符串文本语法冲突的字符出现任何问题


(我想不出,
CAST…AS
能实现什么,所以我把它漏掉了。我猜这是为了处理字符串长度或嵌入的换行符之类的问题。)

我还建议不要创建这样的SQL表达式,而是直接将换行符添加到Java代码中的字符串中,并在参数化查询中使用结果。解决此问题并避免其他问题

但我对这个案例的“原因”很感兴趣,并做了一些测试

问题似乎是由
+
字符串运算符导致的隐式强制转换引起的。返回操作数中具有这些类型中最高优先级的类型的状态

如果只包含
varchar(n)
操作数,则该操作显然返回
varchar(m)
,但不返回
varchar(max)
。for
m
的值为
8000
。因此,如果结果实际超过8000个字符,则数据将被截断

+
需要“查看”操作数中至少一个
varchar(max)
,才能返回
varchar(max)

如预期,结果为
'b'


因此,由于来自Java程序的字符串中的行的长度可能从未超过8000个字符,因此
+
操作给出了
varchar(8000)
,而整个字符串在没有任何操作的情况下超过了8000个字符的边界,并且隐式地被视为
varchar(max)
由SQL Server提供。这就是程序突然中断的原因。

为什么不离开它\n?:)它应该可以工作,这看起来像是一个非参数化查询-您能确认吗?您应该使用PreparedStatement。不要传递嵌入SQL字符串中的文本以及从系统内部输出的psinfo,所以数字、字母、任何-VARCHAR。。。是否可以像“preparedStatement.setString(X,我的15000个字符的softwarestring,字符10和字符13作为换行符”);“?我将重写所有的as preparedstatement。它看起来比我在代码上看到的更好。感谢您的提前。
SELECT '<put 8000 a's here>' + 'b'
SELECT '<put 8000 a's here>c' + 'b'
SELECT '<put 8000 a's here>' + convert(varchar(max), 'b')