Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032

Превышает длину 8000 символов

18.12.2025, 13:57. Показов 490. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Пока не понятно в какой именно ветке задавать вопрос: PostgreSQL или MS SQL.

Есть представление в postgresql
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
CREATE VIEW test.my_view1 AS 
SELECT
    n.nspname::text AS schema_name
    ,CASE p.prokind
        WHEN 'f' THEN 'FUNCTION'
        WHEN 'p' THEN 'PROCEDURE'
        WHEN 'a' THEN 'AGGREGATION'
        WHEN 'w' THEN 'WINDOW'
    END AS kind,
    p.oid::INTEGER,
    p.proname::text AS pro_name,
    pg_get_functiondef(p.oid) AS definition
FROM
    pg_proc p
LEFT JOIN
    pg_namespace n
ON
    p.pronamespace = n.oid
LEFT JOIN 
    pg_language l
ON
    p.prolang = l.oid
LEFT JOIN 
    pg_type t
ON
    t.oid = p.prorettype
WHERE 
    l.lanname IN ('sql', 'plpgsql')
    AND
    n.nspname = 'test'
ORDER BY 
    n.nspname,
    p.proname,
    p.oid
;


В MS SQL есть link, который подключается к posgresql. Запускаем запрос
SQL
1
SELECT * FROM [Test_link].test_DB.test.my_view1;
Возвращает ошибку OLE DB provider 'SDASQL' for linked server 'Test_link' returnend data that does not match expected data length for column '[Test_link].[test_DB].[test].[my_view1].definition'. The (maximum) expected data length is 8000, while the returned data length is 151044.

Аналогично, если использовать openquery.

Придется использовать костыль.

Как вариант вместо
SQL
1
pg_get_functiondef(p.oid) AS definition
написать
SQL
1
unnest(regexp_split_to_array(pg_get_functiondef(p.oid), E'\n')) AS definition_row
чтобы для каждой строки (как объект функции/процедуры) получить подстроки. Но во-первых, даже подстрока может превышать длину 8000 символов. А во-вторых, надо сделать нумерацию соответствующей точному разбиению на подстроки.

Есть еще вариант: создавать подстроки через каждые 8000 символов.

Postgresql
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
CREATE VIEW test.my_view1 AS 
WITH
-- Получаем исходные данные
source_data AS (
    SELECT
        n.nspname::text AS schema_name,
        p.oid::INTEGER,
        CASE p.prokind
            WHEN 'f' THEN 'FUNCTION'
            WHEN 'p' THEN 'PROCEDURE'
            WHEN 'a' THEN 'AGGREGATION'
            WHEN 'w' THEN 'WINDOW'
        END AS kind,
        p.proname::text AS pro_name,
        pg_get_functiondef(p.oid) AS definition
    FROM
        pg_proc p
    LEFT JOIN
        pg_namespace n ON p.pronamespace = n.oid
    LEFT JOIN 
        pg_language l ON p.prolang = l.oid
    WHERE 
        l.lanname IN ('sql', 'plpgsql')
        AND
        n.nspname = 'test'
),
-- Вычисляем длину и сколько нужно частей для каждой строки
part_calculation AS (
    SELECT
        schema_name,
        kind,
        oid,
        pro_name,
        definition,
        len,
        (len + length_part-1) / length_part AS part_count,
        length_part
    FROM
        (SELECT
            schema_name,
            kind,
            oid,
            pro_name,
            definition,
            LENGTH(definition) AS len,
            8000 AS length_part
        FROM
            source_data) t
),
-- Генерируем номера частей для каждой строки
parts_generation AS (
    SELECT
        pc.schema_name,
        pc.kind,
        pc.oid,
        pc.pro_name,
        pc.definition,
        pc.len AS total_length,
        pc.part_count,
        pc.length_part,
        gs.n AS part_number
    FROM
        part_calculation pc
    CROSS JOIN lateral
        generate_series(1, greatest(pc.part_count, 1)) AS gs(n)
)
-- Извлекаем соответствующие подстроки
SELECT
    t.schema_name,
    t.kind,
    t.oid,
    t.pro_name,
    t.length_part,
    t.part_number,
    t.definition_chunk,
    LENGTH(t.definition_chunk) AS chunk_length,
    t.total_length,
    t.total_parts
FROM
    (SELECT
        pg.schema_name,
        pg.kind,
        pg.oid,
        pg.pro_name,
        pg.length_part,
        pg.part_number,
        SUBSTRING(
            pg.definition,
            (pg.part_number - 1) * length_part + 1,
            length_part
        ) AS definition_chunk,
        pg.total_length,
        pg.part_count AS total_parts
    FROM
        parts_generation pg
    ) t
ORDER BY 
    t.schema_name,
    t.pro_name,
    t.oid,
    t.part_number
;

MS SQL
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT 
    schema_name,
    kind,
    oid,
    pro_name,
    STRING_AGG(CAST(definition_chunk AS NVARCHAR(MAX)), '') WITHIN GROUP (ORDER BY part_number) AS definition
FROM
    [Test_link].test_DB.test.my_view1
GROUP BY
    schema_name,
    kind,
    oid,
    pro_name;

Возвращает ошибку OLE DB provider 'SDASQL' for linked server 'Test_link' returnend data that does not match expected data length for column '[Test_link].[test_DB].[test].[my_view1].definition_chunk'. The (maximum) expected data length is 8000, while the returned data length is 16006.

Нормально стало работать при length_part = 2000.

Почему при length_part = 8000 отображает ошибку "while the returned data length is 16006"? Есть же вероятность, что при length_part = 2000 может не сработать.

Скажите, как написать скрипт более безопасно? Или может быть есть более оптимальное решение?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.12.2025, 13:57
Ответы с готовыми решениями:

SQL 7.0: text или varchar(8000)
Известно, что размер данных в некотором поле не превысит 8000 символов. В таком случае, какой тип...

Конвертирование Text в Varchar(8000) в MS SQL
Приветствую. Скажите, пожалуйста, это глюк, или как? В таблице есть некоторые поля, среди которых...

Для всех строк в таблице удалить данные в столбце commission_pct, если длина телефонного номера не превышает 12 символов
очень нужна помощь по заданию, Создайте и выполните хранимую функцию, осуществляющую обработку...

4
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
18.12.2025, 14:31
Цитата Сообщение от MConst Посмотреть сообщение
Скажите, как написать скрипт более безопасно? Или может быть есть более оптимальное решение?
Указать явно типы данных для Text, а-ля

T-SQL
1
2
3
4
5
6
7
SELECT 
cast(schema_name as nvarchar(max)) as [schema_name],
...
cast(pro_name  as nvarchar(max)) as [pro_name],
cast(definition  as nvarchar(max)) as [definition]
 
FROM [Test_link].test_DB.test.my_view1;
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
18.12.2025, 14:41  [ТС]
SQL
1
CAST(definition  AS nvarchar(MAX)) AS [definition]
Так делал. Все также
0
 Аватар для Andrey-MSK
3341 / 2228 / 387
Регистрация: 14.08.2018
Сообщений: 7,519
Записей в блоге: 4
19.12.2025, 09:20
Цитата Сообщение от MConst Посмотреть сообщение
OLE DB provider 'SDASQL' for linked server
А почему OLE DB? Используйте родной клиент для MS SQL Server, может на нём всё будет нормально...

Добавлено через 24 минуты
MConst, Download ODBC Driver for SQL Server
0
74 / 18 / 6
Регистрация: 18.01.2025
Сообщений: 83
22.12.2025, 12:37
а если использовать вместо nvarchar(max) - varchar(max)?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.12.2025, 12:37
Помогаю со студенческими работами здесь

Как установить тип символов и длину поля.
Где в А2000 можно установить тип символов, длину поля. Допустим надо установить параметр поля...

Как добавить к соединить число в строке с префиксом , чтобы его длинна не превышала определеного количества
Проблема следующая есть сторока вида 18464, 18539, 18588, 8589 Необходимо сделать из них...

Вывести список офисов где имееться служащий план об продаж которого превышает 55% от планов об продаж офиса
Кто нибудь Помогите! Сижу на экзамене Срочно нужна помощь Плиз! Задача В базе данных Access...

Вывести список преподавателей, у которых количество лекционных занятий превышает количество практических
Здравствуйте, форумчане! Помогите, пожалуйста, со следующим вопросом. Необходимо составить...

Триггер подсчета процентов и процедура его удаления если сумма превышает 100%
Доброго времени суток вопрос стоит таковой: Создаю таблицу: CREATE TABLE NAME procent_a...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru