0

我正在尝试在列数据类型为的表中插入数据NTEXT。理想情况下,它应该存储超过 8000 个字符,但在我的情况下,它将减少到 8000 个字符。

我在过程中在运行时进行插入查询。以下是该程序正在进行的示例查询。

INSERT INTO TMPRESULTS SELECT ('A' + ',' + 'B' + ',' + 'C')

A、B、C 等是样本数据,实际数据将在运行时识别,实际内容超过 8000 个字符。用于存储值的变量也定义为 ' NVARCHAR(MAX)'

但是,当我尝试以下查询时,它会在表中插入超过 8000 个字符

INSERT INTO TMPRESULTS SELECT ('ABCdddd................')

我想当我试图用“+”号连接数据时,sql server 正在将长度减少到 8000。我不能使用CONCAT,因为数据将超过 256 列/参数。

任何想法,为什么要这样做?另外,如果有人可以提供一些替代解决方案,因为我将不得不在运行时进行插入查询。

4

2 回答 2

5

这记录在+ (String Concatenation) (Transact-SQL) - 备注

如果字符串连接的结果超过 8,000 字节的限制,则结果将被截断。但是,如果连接的字符串中至少有一个是大值类型,则不会发生截断。

对于varchar8,000 字节,将是 8,000 个字符,对于nvarchar4,000。

查询中的所有文字字符串INSERT INTO TMPRESULTS SELECT ('A' + ',' + 'B' + ',' + 'C')都是非大值类型(实际上,它们都是 a varchar(1))。如果你CONVERT/CAST他们中的一个人varchar(MAX)这样做可以解决问题:

INSERT INTO TMPRESULTS
SELECT (CONVERT(varchar(MAX),'A') + ',' + 'B' + ',' + 'C');

如果你想要一个nvarchar,请确保你将你的文字字符串声明为 a nvarchar

INSERT INTO TMPRESULTS
SELECT (CONVERT(nvarchar(MAX),N'A') + N',' + N'B' + N',' + N'C');
于 2019-04-16T09:05:23.740 回答
0

从 SQL Server 2017 开始,有CONCAT_WS 函数可以轻松执行连接。您还可以阅读关于CONCAT

所以,而不是这个:

INSERT INTO TMPRESULTS SELECT ('A' + ',' + 'B' + ',' + 'C')

我们可以有以下:

INSERT INTO TMPRESULTS SELECT CONCAT_WS(CAST(N',' AS NVARCHAR(MAX)),'A','B','C'))

我已将 SQL Server 2017 中的示例放在下面以供参考:

CREATE TABLE #tempValue(BigValue NVARCHAR(MAX))

INSERT INTO #tempValue
SELECT CONCAT_WS(CAST(N',' AS NVARCHAR(MAX)),REPLICATE('A',4000),REPLICATE('B',4000),REPLICATE('C',4000))

SELECT LEN(BigValue) FROM #tempValue -- 12002

此外,CONCAT_WS 更好,原因如下:

如果 CONCAT_WS 接收到所有 NULL 值的参数,它将返回一个 varchar(1) 类型的空字符串。

CONCAT_WS 在连接过程中会忽略空值,并且不会在空值之间添加分隔符。

于 2019-04-16T10:12:26.870 回答