powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Nvarchar(max)
43 сообщений из 43, показаны все 2 страниц
Nvarchar(max)
    #39668334
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Есть работающий SQL-запрос. Нужно сделать динамическим, чтобы менять периоды MDX-запроса внутри SQL-запроса.
SQL-запрос
Код: 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.
USE [SM]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[StandardMatrixNoveltiesONESFO3] (@DT date) AS

DECLARE @MDXQUERY nvarchar(4000);
DECLARE @SQLQUERY nvarchar(max);

SET @MDXQUERY =
		N'''SELECT
			{[Measures].[Отгрузки шт]} ON 0,
			... FROM PROFIT)''';

SET @SQLQUERY = N'...	
	FROM OPENROWSET(
		''MSOLAP'',
		''Provider=MSOLAP.3;...'',
		' + @MDXQUERY + '
				...'

EXEC (@SQLQUERY);

Все равно срезается до 4000 символов. Как можно передать в EXEC переменную, содержащий текст длиной свыше 4000 символов, и не использовать такой вариант EXEC (@SQLQUERY1 + @SQLQUERY2 + @SQLQUERY3) , который cоединяет разделенные тексты запроса?
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668341
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk, если так?
Код: sql
1.
2.
3.
4.
5.
6.
SET @SQLQUERY = N'...	
	FROM OPENROWSET(
		''MSOLAP'',
		''Provider=MSOLAP.3;...'',
		' + cast(@MDXQUERY as Varchar(MAX)) + '
				...'
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668343
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишу так
Код: sql
1.
SET @SQLQUERY = CAST(N'' AS VARCHAR(MAX)) + N' ...'


не помогает
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668349
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kopellyferzmikk, если так?
Код: sql
1.
2.
3.
4.
5.
6.
SET @SQLQUERY = N'...	
	FROM OPENROWSET(
		''MSOLAP'',
		''Provider=MSOLAP.3;...'',
		' + cast(@MDXQUERY as Varchar(MAX)) + '
				...'

Не помогает. Тут не MDX-запрос длинный, а SQL.
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668350
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

ошибка выполнения какая?
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668355
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKошибка выполнения какая?Срезает. В коде конце такие команды
Код: sql
1.
2.
3.
4.
5.
6.
...
PRINT @MDXQUERY
PRINT @SQLQUERY					
PRINT @DT
EXEC (@SQLQUERY);
PRINT 'Завершено'
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668359
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

для начала
Код: sql
1.
PRINT CAST(@SQLQUERY as TEXT) 
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668364
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKferzmikk,

для начала
Код: sql
1.
PRINT CAST(@SQLQUERY as TEXT) 

Меньше срезал
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668369
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

ну так и смотрите что у вас в 42 строке. Пялится в print не обязательно
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668371
boltnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так это может print обрезает, смотри через select.
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668373
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boltnikТак это может print обрезает, смотри через select. шутки за 300?
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668379
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

так даст целиком, если уж очень хочется весь смотреть, ну или параметры вывода поменяйте в настройке ssms
Код: sql
1.
SELECT CAST('<root><![CDATA[' + @SQLQUERY + ']]></root>' AS XML)
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668384
boltnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKшутки за 300?
Отнюдь.

https://docs.microsoft.com/ru-ru/sql/t-sql/language-elements/print-transact-sql?view=sql-server-2017

авторA message string can be up to 8,000 characters long if it is a non-Unicode string, and 4,000 characters long if it is a Unicode string. Longer strings are truncated. The varchar(max) and nvarchar(max) data types are truncated to data types that are no larger than varchar(8000) and nvarchar(4000).
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668385
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boltnik,

переоценил... шутка за 150 "смотри через select."
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668394
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKну или параметры вывода поменяйте в настройке ssmsВ какой именно ветке?
Код: sql
1.
SELECT CAST('<root><![CDATA[' + @SQLQUERY + ']]></root>' AS XML)

Также срезает как Text
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668396
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

а нажать на xml ссылку?

Tools - Query Result - Sql server - Result to grid/text
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668402
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKа нажать на xml ссылку?Нажимал, не полный текст запроса.
Tools - Query Result - Sql server - Result to grid/textКакой именно параметр менять?
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668406
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

утомляет...

вы уже исправили ошибку в 42 строке?
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668413
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

Да, исправил. Но все равно срезает. Запускал код без EXEC - выгружался.
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668415
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

а почему вы решили что это не весь запрос и вы не формируете кривой запрос с лишним AND?
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668416
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKferzmikk,

а почему вы решили что это не весь запрос и вы не формируете кривой запрос с лишним AND?

Код: sql
1.
select right(@SQLQUERY, 255)


развеет мрак.
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668417
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222TaPaKferzmikk,

а почему вы решили что это не весь запрос и вы не формируете кривой запрос с лишним AND?

Код: sql
1.
select right(@SQLQUERY, 255)


развеет мрак.Такое же окончание текста SQL-запроса
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668418
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkaleks222пропущено...


Код: sql
1.
select right(@SQLQUERY, 255)


развеет мрак.Такое же окончание текста SQL-запроса
и вывод у вас по прежнему не сложился?
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668421
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkТакое же окончание текста SQL-запроса 21537057
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668433
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заработало когда так написал
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SET @MDXQUERY =
		N'''SELECT
			{[Measures].[Отгрузки шт]} ON 0,
			... FROM PROFIT)''';

EXEC (N'...	
	FROM OPENROWSET(
		''MSOLAP'',
		''Provider=MSOLAP.3;...'',
		' + @MDXQUERY + '
				...');


Через переменную не получается
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668435
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

21536777
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668439
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

"Неправильный синтаксис около конструкции "AND"."
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668461
demind10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может быть поможет вот эта запись в блоге:
"Когда nvarchar(max) вмещает только nvarchar(4000)"
https://tyaps-asp.livejournal.com/49702.html
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668464
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demind10,

То есть, получается надо текст запроса делить на части менее или равно 4000 символов и потом соединять. Верно?
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668478
demind10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ferzmikk,
Наверное это можно сформулировать и так. Если я правильно понял автора блога, то при конкатенации строк первое слагаемое должно быть нужной нам размерности nvarchar(max).


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SET @MDXQUERY =
		N'''SELECT
			{[Measures].[Отгрузки шт]} ON 0,
			... FROM PROFIT)''';

--Здесь присваиваем что-то меньше nvarchar(4000)
SET @SQLQUERY = N'...	
	FROM OPENROWSET(
		''MSOLAP'',
		''Provider=MSOLAP.3;...'',
		' 
--Здесь первое слагаемое nvarchar(max), а остальные уже могут быть как nvarchar(max), так и меньше
SET @SQLQUERY = @SQLQUERY + @MDXQUERY + '
				...'



Похоже, что такое безобразие получается именно когда мы собираем строку из нескольких кусочков.
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668481
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
любители гадать всегда найдут зависимоти "первый"/левый

автор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.


+

авторReturns the data type of the argument with the highest precedence.

что ему написали сделать раз 5, а что у тс с руками отсюда не видно
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668500
demind10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK, спасибо. Когда я с таким столкнулся, не смог найти описание в первоисточнике. Мой косяк.
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668571
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demind10ferzmikk,
Наверное это можно сформулировать и так. Если я правильно понял автора блога, то при конкатенации строк первое слагаемое должно быть нужной нам размерности nvarchar(max).


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SET @MDXQUERY =
		N'''SELECT
			{[Measures].[Отгрузки шт]} ON 0,
			... FROM PROFIT)''';

--Здесь присваиваем что-то меньше nvarchar(4000)
SET @SQLQUERY = N'...	
	FROM OPENROWSET(
		''MSOLAP'',
		''Provider=MSOLAP.3;...'',
		' 
--Здесь первое слагаемое nvarchar(max), а остальные уже могут быть как nvarchar(max), так и меньше
SET @SQLQUERY = @SQLQUERY + @MDXQUERY + '
				...'



Похоже, что такое безобразие получается именно когда мы собираем строку из нескольких кусочков.Получилось, спасибо! Минус в том, что запрос на куски надо резать, чтобы потом соедиянть. Как бы это не усложняло при доработке.
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668799
demind10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ferzmikk,
не надо резать. Беру свои слова обратно.
Можно использовать функцию CAST и привести символьную строку явно к типу nvarchar(max):
Код: 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.
USE [SM]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[StandardMatrixNoveltiesONESFO3] (@DT date) AS

DECLARE @MDXQUERY nvarchar(4000);
DECLARE @SQLQUERY nvarchar(max);

SET @MDXQUERY =
		N'''SELECT
			{[Measures].[Отгрузки шт]} ON 0,
			... FROM PROFIT)''';

SET @SQLQUERY = CAST(N'...	
	FROM OPENROWSET(
		''MSOLAP'',
		''Provider=MSOLAP.3;...'',
		' AS nvarchar(max)) + @MDXQUERY + '
				...'

EXEC (@SQLQUERY);
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668855
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demind10,

Спасибо!
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668861
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Данные выгружаются. Теперь пишет такое: Внимание! Максимальная длина ключа - 900 байт. Индекс "i1" имеет максимальную длину 1840 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.

Длину ключа как можно увеличить? Можно ли игнорировать такую ошибку?
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668870
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkДанные выгружаются. Теперь пишет такое: Внимание! Максимальная длина ключа - 900 байт. Индекс "i1" имеет максимальную длину 1840 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.

Длину ключа как можно увеличить? Можно ли игнорировать такую ошибку?Никак не увеличить. А игнорировать ошибки вам никто запретить не может.
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668876
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анекдот почти в темуЭлектрик говорит хозяйке дома:
— Я нашел причину того, почему у вас погас свет, — это короткое замыкание.
— Так удлините его!
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668880
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посетитель,

)))
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668887
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начиная, кажется, с SQL Server 2017, максимальная длина ключа некластерного индекса увеличена до 1700 байт, а формальная длина ключа неуникального некластерного индекса до 2600 байт (ключ некаластерного + ключ кластетного)
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668897
Eleanor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,

C Sql Server 2016 , но ТС со своими 1840 немного не умещается.
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668905
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EleanormsLex,

C Sql Server 2016 , но ТС со своими 1840 немного не умещается.
2600 то хватит каждому :)
...
Рейтинг: 0 / 0
Nvarchar(max)
    #39668959
Eleanor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,
Ага, "640 килобайт хватит всем" :)

Казалось бы еще не так давно появился Filestream, переход на который можно было рассматривать от 256КВ, мол Sql Server исходно оптимизирован под работу со строками ~100 байт. А тут уже килобайтные ключи не вызывают удивления.
...
Рейтинг: 0 / 0
43 сообщений из 43, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Nvarchar(max)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]