powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Конкатенация строк в функции
23 сообщений из 23, страница 1 из 1
Конкатенация строк в функции
    #39965872
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица Table1 со строковым полем Value1. В таблице N строк. Напишите функцию на языке T-SQL, возвращающую строку, являющуюся результатом конкатенации поля Value1 по всем строкам таблицы Table1.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE TABLE #Product 
(ProdId INT IDENTITY primary key Not null, 
ProdName NVARCHAR(20),
Price MONEY)
 
INSERT INTO #Product
VALUES ('Nokia 8', 18000),
        ('iPhone 8', 56000),(N'Молоко', 5),(N'Сметана', 6),(N'Гвозди', 44),(N'Машины', 1)
 
--SELECT * FROM #Product

declare @pp2 nvarchar(4000)

  select @pp2=
	
	 ( select '  ' + #Product.ProdName + '  ' + CAST(#Product.Price AS NVARCHAR(10))
		from #Product 
		
		for xml path('')
	  ) --as Результат_конкатинации_всех_строк_таблицы

  print @pp2



Вот в запросе выводится в строку а как реализовать это в функции ?
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965885
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И где здесь таблица Table1 с полем Value1?
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965888
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,
Да не все ли равно как называется таблица и как поле == не суть == суть в том как это реализовать
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965900
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот сделал такую функцию
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE FUNCTION Hl112() -- создать функцию
RETURNS varchar(30)
-- объявляем тип возвращаемого значения
AS
BEGIN -- начало тела функции
DECLARE @MyVar varchar(8000)=''
 Select  @MyVar +=  ( select '  ' + Product.ProdName + '  ' + CAST(Product.Price AS NVARCHAR(10))
		from Product 
		
		for xml path('')
	  )
RETURN @MyVar; --возвращаемое значение функции
END; -- конец тела функции
GO

PRINT dbo.Hl112();



Но она почему то выводит только 2 поля из базы данных

Nokia 8 18000.00 iPhone 8

Время выполнения: 2020-06-03T21:07:57.1300901+03:00


что то не дает дальше ?
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965903
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не пойму что мешает дальше прибавлятся строкам
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965908
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iivvvii,

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

2 вариант) Создаем функцию, которая на входе принимает строковый параметр "Table1" и строковый параметр "Value1", формирует динамический запрос, делает exec, и возвращает результирующую строку
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965910
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql,
просто сделать select и вернуть канкатенацию всех строк и столбцов таблицы одной строкой
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965911
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iivvvii,

м.б. , потому что RETURNS varchar(30)
:)
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965914
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я тут немного улучшел скрипт и теперь возврвшает прилично

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE FUNCTION Hl119() -- создать функцию
RETURNS varchar(8000)
-- объявляем тип возвращаемого значения
AS
BEGIN -- начало тела функции
DECLARE @MyVar varchar(500)=''
 Select  @MyVar +=  ( select Product.ProdName + '  ' + CAST(Product.Price AS NVARCHAR(50))+ ' '
		from Product 
		
		for xml path('')
	  )
RETURN @MyVar; --возвращаемое значение функции
END; -- конец тела функции
GO

PRINT dbo.Hl119();



Но у этой функции как я понимаю есть придел строки в 8 000 символов а если там больше будет ?
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965917
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может есть какой то другой вариант
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965918
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iivvvii,

возвращайте blob или xml
строки имеют максимальную длину
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965919
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql,
нет по заданию нужно вернуть строку
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965920
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iivvvii,

все равно нужно делать проверку на максимальную длину

varchar [ ( n | max ) ] — строковые данные переменного размера. Используйте значение n для определения размера строки в байтах (допускаются значения от 1 до 8000) или используйте max для указания предельного размера столбца вплоть до максимального размера хранилища, что составляет 2^31-1 байт (2 ГБ).

использовать varchar(max) , если размеры записей данных в столбцах существенно отличаются и длина строки может превышать 8000 байт.
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965922
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iivvvii
не пойму что мешает дальше прибавлятся строкам
Объявленная длина результата.
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965924
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE FUNCTION Hl121() -- создать функцию
RETURNS varchar(max)
-- объявляем тип возвращаемого значения
AS
BEGIN -- начало тела функции
DECLARE @MyVar varchar(max)=''
 Select  @MyVar +=  ( select Product.ProdName + '  ' + CAST(Product.Price AS NVARCHAR(50))+ ' '
		from Product 
		
		for xml path('')
	  )
RETURN @MyVar; --возвращаемое значение функции
END; -- конец тела функции
GO

PRINT dbo.Hl121();



Да вот так вмещает много
Только я не пойму почему и эту переменную нужно ставить max значение DECLARE @MyVar varchar(max)=''
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965929
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iivvvii,

размер возвращаемой переменной д.б. такой же (не меньше или приводится к), как и описываемой функции.
Грубо говоря, если вы описали, что функция возвращает значение varchar(max), то и после Return должно быть указано значение типа varchar(max) или совместимое
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965934
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql,
Спасибо == смеюсь сам потом допер == такой вопрос простой
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965935
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iivvvii,

как вариант
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE FUNCTION Hl121() -- создать функцию
RETURNS varchar(max)
-- объявляем тип возвращаемого значения
AS
BEGIN -- начало тела функции
/*DECLARE @MyVar varchar(max)=''
 Select  @MyVar +=  ( select Product.ProdName + '  ' + CAST(Product.Price AS NVARCHAR(50))+ ' '
		from Product 
		
		for xml path('')
	  )*/
RETURN  cast ( ( select Product.ProdName + '  ' + CAST(Product.Price AS NVARCHAR(50))+ ' '
		from Product 
		for xml path('')		) 
		as varchar(max)	)

; --возвращаемое значение функции
END; -- конец тела функции
GO
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965937
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iivvvii
godsql,
нет по заданию нужно вернуть строку

И зачем тогда FOR XML?
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965939
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На T-SQL редко пишу, в основном C# и JavaScript под MongoDB.

А сделал бы так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE FUNCTION Hl121() -- создать функцию
RETURNS VARCHAR(MAX)
-- объявляем тип возвращаемого значения
AS
BEGIN -- начало тела функции
  DECLARE @MyVar VARCHAR(MAX)

  SELECT @MyVar = ISNULL(@MyVar + ' ', '') + Product.ProdName + ' ' + CAST(Product.Price AS VARCHAR)
  FROM   Product

  RETURN @MyVar; --возвращаемое значение функции
END; -- конец тела функции
GO
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39965973
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
А сделал бы так:

Зря - это же скалярка, она в плане производительности еще ещё хуже, чем multi-statement TVF. Тут же легко делается инлайновая TVF, которая нормально и по-человечески встроится в план вызывающего запроса.
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39966034
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

лично я понял, что по заданию автору необходимо реализовать функцию, что возвращает строку

iivvvii
а как реализовать это в функции ?
iivvvii
по заданию нужно вернуть строку
...
Рейтинг: 0 / 0
Конкатенация строк в функции
    #39966037
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iivvvii
Гавриленко Сергей Алексеевич,
Да не все ли равно как называется таблица и как поле == не суть == суть в том как это реализовать
Не все ли равно. Попробуйте написать такую функцию для таблицы #Product.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Конкатенация строк в функции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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