SQL 服务器将字符串的长度减少到 8000 个字符
SQL Server reducing the length of the string to 8000 characters
我正在尝试将数据插入 table 中,列数据类型为 NTEXT
。理想情况下,它应该存储超过 8000 个字符,但在我的例子中,它将减少到 8000 个字符。
我正在运行时在过程中进行插入查询。下面是程序正在进行的示例查询。
INSERT INTO TMPRESULTS SELECT ('A' + ',' + 'B' + ',' + 'C')
A、B、C等为示例数据,实际数据将在运行时识别,实际内容超过8000个字符。用于存储值的变量也定义为'NVARCHAR(MAX)
'
但是,当我尝试执行以下查询时,它确实在 table
中插入了超过 8000 个字符
INSERT INTO TMPRESULTS SELECT ('ABCdddd................')
我想当我尝试用“+”号连接数据时,sql 服务器正在将长度减少到 8000。我不能使用 CONCAT
,因为数据将超过256columns/arguments.
知道为什么要这样做吗?另外,如果有人可以提供一些替代解决方案,因为我将不得不在运行时进行插入查询。
这在 + (String Concatenation) (Transact-SQL) - Remarks 中有记录:
If the result of the concatenation of strings exceeds the limit of
8,000 bytes, the result is truncated. However, if at least one of the
strings concatenated is a large value type, truncation does not occur.
对于 varchar
8,000 字节将是 8,000 个字符,对于 nvarchar
4,000。
查询INSERT INTO TMPRESULTS SELECT ('A' + ',' + 'B' + ',' + 'C')
中的所有文字字符串都是非大值类型(事实上,它们都是varchar(1)
)。如果你 CONVERT
/CAST
其中之一到 varchar(MAX)
这将解决问题:
INSERT INTO TMPRESULTS
SELECT (CONVERT(varchar(MAX),'A') + ',' + 'B' + ',' + 'C');
如果您想要 nvarchar
,请确保您也将文字字符串声明为 nvarchar
:
INSERT INTO TMPRESULTS
SELECT (CONVERT(nvarchar(MAX),N'A') + N',' + N'B' + N',' + N'C');
在SQL Server 2017以后,有CONCAT_WS function to perform concatenation easily. You can also read about 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 更好,原因如下:
If CONCAT_WS receives arguments with all NULL values, it will return
an empty string of type varchar(1).
CONCAT_WS ignores null values during concatenation, and does not add
the separator between null values.
我正在尝试将数据插入 table 中,列数据类型为 NTEXT
。理想情况下,它应该存储超过 8000 个字符,但在我的例子中,它将减少到 8000 个字符。
我正在运行时在过程中进行插入查询。下面是程序正在进行的示例查询。
INSERT INTO TMPRESULTS SELECT ('A' + ',' + 'B' + ',' + 'C')
A、B、C等为示例数据,实际数据将在运行时识别,实际内容超过8000个字符。用于存储值的变量也定义为'NVARCHAR(MAX)
'
但是,当我尝试执行以下查询时,它确实在 table
中插入了超过 8000 个字符INSERT INTO TMPRESULTS SELECT ('ABCdddd................')
我想当我尝试用“+”号连接数据时,sql 服务器正在将长度减少到 8000。我不能使用 CONCAT
,因为数据将超过256columns/arguments.
知道为什么要这样做吗?另外,如果有人可以提供一些替代解决方案,因为我将不得不在运行时进行插入查询。
这在 + (String Concatenation) (Transact-SQL) - Remarks 中有记录:
If the result of the concatenation of strings exceeds the limit of 8,000 bytes, the result is truncated. However, if at least one of the strings concatenated is a large value type, truncation does not occur.
对于 varchar
8,000 字节将是 8,000 个字符,对于 nvarchar
4,000。
查询INSERT INTO TMPRESULTS SELECT ('A' + ',' + 'B' + ',' + 'C')
中的所有文字字符串都是非大值类型(事实上,它们都是varchar(1)
)。如果你 CONVERT
/CAST
其中之一到 varchar(MAX)
这将解决问题:
INSERT INTO TMPRESULTS
SELECT (CONVERT(varchar(MAX),'A') + ',' + 'B' + ',' + 'C');
如果您想要 nvarchar
,请确保您也将文字字符串声明为 nvarchar
:
INSERT INTO TMPRESULTS
SELECT (CONVERT(nvarchar(MAX),N'A') + N',' + N'B' + N',' + N'C');
在SQL Server 2017以后,有CONCAT_WS function to perform concatenation easily. You can also read about 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 更好,原因如下:
If CONCAT_WS receives arguments with all NULL values, it will return an empty string of type varchar(1).
CONCAT_WS ignores null values during concatenation, and does not add the separator between null values.