SQL Server сокращает длину строки до 8000 символов - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь вставить данные в таблицу с типом данных столбца NTEXT.В идеале он должен хранить более 8000 символов, но в моем случае он сокращает его до 8000 символов.

Я делаю запрос вставки во время выполнения в процедуре.Ниже приведен пример запроса, который выполняет процедура.

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

A, B, C и т. Д. Представляют собой образцы данных, и фактические данные будут идентифицироваться во время выполнения с фактическим содержанием, пересекающим 8000 символов.Также переменная, используемая для хранения значения, определяется как 'NVARCHAR(MAX)'

Однако, когда я пытаюсь выполнить следующий запрос, он вставляет в таблицу более 8000 символов

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

Я предполагаюв то время как я пытаюсь объединить данные со знаком «+», сервер sql сокращает длину до 8000. Я не могу использовать CONCAT, поскольку данные будут содержать более 256 столбцов / аргументов.

Любая идеязачем это так?Кроме того, если кто-то может помочь с каким-либо альтернативным решением, так как мне придется сделать запрос вставки во время выполнения.

Ответы [ 2 ]

3 голосов
/ 16 апреля 2019

Это задокументировано в + (Конкатенация строк) (Transact-SQL) - Примечания :

Если результат конкатенации строк превышает предел 8000 байт, результат усекается. Однако, если хотя бы один из Конкатенация строк - это тип большого значения, усечение не происходит.

Для varchar 8000 байтов будет 8000 символов, а для nvarchar 4000.

Все ваши литеральные строки в запросе 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');
0 голосов
/ 16 апреля 2019

В 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 игнорирует нулевые значения во время конкатенации и не добавляет разделитель между нулевыми значениями.

...