Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как вернуть таблицу с колонкой табличного типа?  [new]
SolidSnake
Member

Откуда:
Сообщений: 98
Добрый день!

Исходные таблицы:

Таблица RequestMessages:
CREATE TABLE [dbo].[RequestMessages](
	[message_datetime] [datetime] NOT NULL,
	[message_id] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
	[message_html] [nvarchar](max) NOT NULL
 CONSTRAINT [PK_RequestMessages] PRIMARY KEY CLUSTERED ([message_id] ASC)
)


Таблица RequestMessageAttachments:
CREATE TABLE [dbo].[RequestMessageAttachments](
	[message_id] [uniqueidentifier] NOT NULL,
	[file_name] [nvarchar](255) NOT NULL,
	[file_description] [nvarchar](1000) NULL,
	[file_size] [bigint] NOT NULL,
 CONSTRAINT [IX_RequestMessageAttachments] UNIQUE NONCLUSTERED ([message_id] ASC, [file_name] ASC)
)


Вопрос:

Как описать запрос так, чтобы добавить колонку Attachments, где каждая строка содержала бы вложенную таблицу RequestMessageAttachments, связанную по message_id.
SELECT [RequestMessages].[message_datetime] AS MessageDateTime,
       [RequestMessages].[message_id]       AS MessageID,
       [RequestMessages].[user_id]          AS UserID,
       [Users].[name]                       AS UserName,
       [Users].[surname]                    AS UserSurname,
       [RequestMessages].[message_html]     AS MessageHTML
FROM [RequestMessages]
ORDER BY MessageDateTime
22 ноя 13, 13:13    [15173628]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть таблицу с колонкой табличного типа?  [new]
SolidSnake
Member

Откуда:
Сообщений: 98
Уж очень не хочется обращаться к SQL с кучей запросов по вложениям на каждое сообщение.
Есть еще идея, получить таблицу "RequestMessages" как есть, затем отправить пакет запросов и получить recordsetы, обойти их все и сопоставить на уровне приложения а не запроса.
22 ноя 13, 13:16    [15173655]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть таблицу с колонкой табличного типа?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SolidSnake
где каждая строка содержала бы вложенную таблицу

Что такое для вас "вложенная таблица"? Как вы себе представляете таблицу, вложенную в строку?
22 ноя 13, 13:25    [15173739]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть таблицу с колонкой табличного типа?  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
может просто напишите нормальный запрос с JOIN ?
22 ноя 13, 13:35    [15173827]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть таблицу с колонкой табличного типа?  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Гость333,

можно просто выдернуть два запроса и потом при перемещении по первому делать выборку из второго на клиенте.

1 источник данных: из таблицы с сообщениями выдернуть все сообщения по пользователю.
2 источник данных: из таблицы с аттачами выдернуть все аттачи всех сообщений пользователя.
сделать 2 источника данных master - detail и связать их по полю IDMessage.
22 ноя 13, 13:41    [15173884]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть таблицу с колонкой табличного типа?  [new]
SolidSnake
Member

Откуда:
Сообщений: 98
Гость333
SolidSnake
где каждая строка содержала бы вложенную таблицу

Что такое для вас "вложенная таблица"? Как вы себе представляете таблицу, вложенную в строку?


Мы же можем объявить в TSQL переменную типа таблица.
Я хотел, чтобы колонка была такого типа.

Jaffar
Гость333,
можно просто выдернуть два запроса и потом при перемещении по первому делать выборку из второго на клиенте.
1 источник данных: из таблицы с сообщениями выдернуть все сообщения по пользователю.
2 источник данных: из таблицы с аттачами выдернуть все аттачи всех сообщений пользователя.
сделать 2 источника данных master - detail и связать их по полю IDMessage.

Спасибо за ответ, я так и думал делать, если это единственный способ)
22 ноя 13, 15:02    [15174716]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть таблицу с колонкой табличного типа?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SolidSnake
Мы же можем объявить в TSQL переменную типа таблица.
Я хотел, чтобы колонка была такого типа.

К счастью, в MSSQL это невозможно. В некоторых других СУБД существуют nested tables, но большой вопрос — используются ли они где-то реально, т.к. это нарушение первой нормальной формы.

В общем, лучше считать, что способ Jaffar — единственный.
22 ноя 13, 15:09    [15174774]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть таблицу с колонкой табличного типа?  [new]
SolidSnake
Member

Откуда:
Сообщений: 98
Всем спасибо :)
22 ноя 13, 15:20    [15174880]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть таблицу с колонкой табличного типа?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
Можно сложить подчиненные записи в XML-поле, потом на клиенте разобрать. Лимит 2 гига, правда.

Но лучше сделать так, как советовал Jaffar.
23 ноя 13, 10:16    [15178277]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть таблицу с колонкой табличного типа?  [new]
SolidSnake
Member

Откуда:
Сообщений: 98
автор
лучше сделать так, как советовал Jaffar.

Я уже сделал, с той разницей, что оба запроса исполняются в одном batch'e.
т.е. 1 обращение и 1 результат.
23 ноя 13, 11:03    [15178332]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть таблицу с колонкой табличного типа?  [new]
SolidSnake
Member

Откуда:
Сообщений: 98
автор
сделать 2 источника данных master - detail и связать их по полю IDMessage.

Эту часть я видимо пропустил)
Результат первого запроса формирует коллекцию объектов на клиенте.
При обходе результата второго запроса, я нахожу нужный объект и дозаполняю его данными аттачментов.
23 ноя 13, 11:07    [15178337]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить