Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/48: Рейтинг темы: голосов - 48, средняя оценка - 4.63
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
1

Инлайн-функция

26.03.2013, 00:34. Показов 9562. Ответов 14
Метки нет (Все метки)

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

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

Вообщем вопрос такой. Есть какая-то возможность особая при составлении таких функций? Я так поняла мне просто нужно составить для возвращаемого значения запрос, типа select name, fio. В результате такого вывода и получится таблица. Или всё же можно как-то ещё. Запрос достаточно сложный и одним запросом у меня не очень получается. Может можно как-то сделать выборку айдишников сотрудников и к каждому ид поискать ид гостиницы. Т.е. получить первый столбец таблицы, пробежаться по нему и вычислить второй? Вот моя наработка:

T-SQL
1
2
3
4
5
6
7
8
9
Create Function dbo.hotel_function (@org varchar(max))
returns table
return
select hotel.name, stuff((select ', ' + fio  from participant t
             for xml path('')), 1,1,'')
             from hotel where hotel.id_hotel=(select id_hotel from participant where 
 
id_organization = 
             (select id_organization from organization where name = 'Волгоградская медицинская академия'))
Здесь вместо переменной подставляю конкретное название, просто для удобства, чтобы сразу можно было проверить результат

Добавлено через 1 час 55 минут
так, почитала посмотрела, вроде появилась мысль.
Создать таблицу и действительно сначала заполнить один столбец значениями, а потом уже выбрать по ним значения второго столбца. Стала делать и почему-то всё время ругается на ошибку синтаксиса
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
GO
Create function dbo.hotel_function (@org varchar(max))
returns table
as
Begin
declare @tbl table (rowId int identity(1,1),hotel_id int, fio_list varchar(max) )
 
Insert @tbl select id_hotel from participant where id_organization = 
             (select id_organization from organization where name = 'Волгоградская медицинская академия')
return @tbl
 
 end
Где я здесь косячу?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2013, 00:34
Ответы с готовыми решениями:

Инлайн-функция замедляет работу
Здравствуйте! видимо что-то делаю неправильно...имею код. Запускаю скомпилированную программу -...

Инлайн в Паскале
program t1; var a,b,c:integer; begin writeln('Введите первое числo'); asm mov...

std::map в инлайн-асме
Доброго времени суток Имеется MAP-массив содержащий хуки для функций Нужно получить...

Как отключить инлайн в MSVS2008?
Такое дело. Я сейчас разбираюсь в дизассемблированном коде простых программ, а Visual Studio мешает...

14
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
26.03.2013, 04:25 2
Цитата Сообщение от PinkPink Посмотреть сообщение
Где я здесь косячу?
Однозначно здесь
T-SQL
1
2
Insert @tbl select id_hotel from participant where id_organization = 
             (select id_organization from organization where name = 'Волгоградская медицинская академия')
Думаю, ошибка синтаксиса у вас именно в этом операторе. Ошибку можно убрать двумя способами:
T-SQL
1
2
Insert @tbl (hotel_id) select id_hotel from participant where id_organization = 
             (select id_organization from organization where name = 'Волгоградская медицинская академия')
T-SQL
1
2
Insert @tbl select id_hotel, NULL from participant where id_organization = 
             (select id_organization from organization where name = 'Волгоградская медицинская академия')
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
26.03.2013, 09:46 3
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
select h.name,
   stuff((
      select ','+fio 
      from participant 
      where id_hotel=h.id_hotel 
      order by fio 
      for xml path('')
   ),1,1,'') list
from (
   select distinct h.*
   from organization o
   join participant p on p.id_organization=o.id_organization
   join hotel h on h.id_hotel=p.id_hotel
   where o.name='Волгоградская медицинская академия'
)h
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
26.03.2013, 10:49 4
Цитата Сообщение от PinkPink Посмотреть сообщение
Где я здесь косячу?
Да везде. Получается функция НЕ inline.
inline функция состоит из одной инструкции SELECT
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
26.03.2013, 12:00  [ТС] 5
Цитата Сообщение от iap Посмотреть сообщение
Да везде. Получается функция НЕ inline.
inline функция состоит из одной инструкции SELECT
Спасибо, теперь понятен смысл. Значит будет return Select... и запрос
никакого тела функции не будет, правильно я поняла?
соответственно как я поняла не будет Begin и end

Добавлено через 13 минут
Цитата Сообщение от cygapb-007 Посмотреть сообщение
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
select h.name,
   stuff((
      select ','+fio 
      from participant 
      where id_hotel=h.id_hotel 
      order by fio 
      for xml path('')
   ),1,1,'') list
from (
   select distinct h.*
   from organization o
   join participant p on p.id_organization=o.id_organization
   join hotel h on h.id_hotel=p.id_hotel
   where o.name='Волгоградская медицинская академия'
)h
Спасибо за способ. Почему-то ругается

Недопустимое имя объекта "organization".
Не подскажете с чем это может быть связано?
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
26.03.2013, 12:03 6
Цитата Сообщение от PinkPink Посмотреть сообщение
Спасибо, теперь понятен смысл. Значит будет return Select... и запрос
никакого тела функции не будет, правильно я поняла?
соответственно как я поняла не будет Begin и end
Надо так, как написано тут:

http://msdn.microsoft.com/ru-r... .110).aspx
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
26.03.2013, 12:04 7
а на
T-SQL
1
select * from organization
тоже ругается?
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
26.03.2013, 12:09  [ТС] 8
Цитата Сообщение от cygapb-007 Посмотреть сообщение
а на
T-SQL
1
select * from organization
тоже ругается?
и в этом случае тоже
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
26.03.2013, 12:15 9
Цитата Сообщение от PinkPink Посмотреть сообщение
и в этом случае тоже
и это ни о чем не говорит пытливому уму?
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
26.03.2013, 13:06  [ТС] 10
Цитата Сообщение от cygapb-007 Посмотреть сообщение
и это ни о чем не говорит пытливому уму?
блин( не знаю. Извелась уже. Может дадите подсказку если поняли в чём причина?
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
26.03.2013, 13:09 11
Цитата Сообщение от PinkPink Посмотреть сообщение
блин( не знаю. Извелась уже. Может дадите подсказку если поняли в чём причина?
Таблицы organization у Вас нет или Вы не имеете права доступа к ней.
Вариант попроще: Вы делаете запрос не в той базе.
Обычно это master
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
26.03.2013, 13:11  [ТС] 12
Цитата Сообщение от iap Посмотреть сообщение
Таблицы organization у Вас нет или Вы не имеете права доступа к ней.
Вариант попроще: Вы делаете запрос не в той базе.
Обычно это master
нееее, быть не может. таблица есть, всё есть. другие запросы делала нормально всё было.
по ошибке то понятно, что он её почему-то не воспринимает, но в это то и задача, что с ней всё нормально. яж не первый запрос к ней делаю. а 18ый) если быть точной
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
26.03.2013, 13:18 13
Цитата Сообщение от PinkPink Посмотреть сообщение
нееее, быть не может. таблица есть, всё есть. другие запросы делала нормально всё было.
по ошибке то понятно, что он её почему-то не воспринимает, но в это то и задача, что с ней всё нормально. яж не первый запрос к ней делаю. а 18ый) если быть точной
Как называется база, в которой эта таблица?
Не могли Вы написать в запросе некоторые буквы имени таблицы по-русски (многие ведь очень похожи)
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
26.03.2013, 15:04  [ТС] 14
Цитата Сообщение от iap Посмотреть сообщение
Как называется база, в которой эта таблица?
Не могли Вы написать в запросе некоторые буквы имени таблицы по-русски (многие ведь очень похожи)
ладно, если ошибка может быть только в этом, то это упрощает задачу, потому что я сразу решила, что ошибки в этом быть не может. Потому что действительно не первый раз уже делаю запросы к этой таблице. Повожусь ещё, поищу.

Добавлено через 59 минут
вообщем хз где накосячила.
выбрала в списке базу данных ткнула на неё - создать запрос и всё получилось.
кроме самого запроса. гостиницы выбирает те что нужно, а вот список участников выводит вообще всех, а не только тех, которые относятся к данной организации. что по-моему странно, ведь выборка происходит из таблицы сформированной с условием
T-SQL
1
where o.name='Волгоградская медицинская академия'
Соответственно, как мне кажется в этой таблице должны быть только те участники, которые относятся к данной организации

Добавлено через 3 минуты
хотя нет.. выборка имён идёт из participant просто по айди гостиницы, которое уже берётся из образованной таблицы

Добавлено через 3 минуты
а можно как-нибудь сделать чтобы выборка названия гостиницы и имён были из одной общей таблицы? Или когда используется stuff надо внутри всегда указывать из какой таблицы берутся данные?

Добавлено через 4 минуты
и пожалуйста, объясните зачем и как перед from используется list?

Добавлено через 32 минуты
Единственное, что у меня получилось и что действительно работает это вот то это:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Create function dbo.hotel_function (@org varchar(max))
returns table
 
return select h.name,
   stuff((
      select ','+fio 
      from participant 
      where id_hotel=h.id_hotel AND id_organization = 
      (select id_organization from organization where name = 'Астраханский государственный технический университет')
      order by fio 
      for xml path('')
   ),1,1,'') list
from (
   select distinct h.*
   from organization o
  inner join participant p on p.id_organization=o.id_organization
  inner join hotel h on h.id_hotel=p.id_hotel
  where o.name='Астраханский государственный технический университет'
)h
Но! Мне кажется, что это весьма не разумно добавлять всё вот это
T-SQL
1
2
AND id_organization = 
      (select id_organization from organization where name = 'Астраханский государственный технический университет')
если мы в результате делаем всё равно потом выборку по названию организации. Получается я два раза делаю одно и тоже. Но почему то, если я буду из h брать ид организации, он начинает ругаться ><
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
26.03.2013, 16:36 15
Да, там неточно сделал выборку... Вот так вроде бы работает:
T-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
declare @org varchar(max)--='Org1'
;with 
   hotel as (select * from (values (1,'hotel1'), (2,'hotel2'), (3,'hotel3'))t(id_hotel,name)),
   organization as (select * from (values(1,'Org1'),(2,'Org2'))t(id_organization,name)),
   participant as (select * from (values
      (1,'Par1',1),(1,'Par2',1),(1,'Par3',2),(2,'Par4',1))t(id_organization, fio, id_hotel))
--create function dbo.hotel_function (@org varchar(max)) returns table return 
select 
   id_organization,
   (select name from organization where id_organization=d.id_organization)name_organization,
   id_hotel,
   (select name from hotel h where id_hotel=d.id_hotel)name_hotel,
   stuff((
      select ','+fio 
      from participant
      where id_hotel=d.id_hotel and id_organization=d.id_organization
      order by fio 
      for xml path('')
   ),1,1,'') list_participants
from (
  select distinct id_hotel,id_organization
  from participant 
  where id_organization in 
    (select id_organization from organization where @org is null or name like @org)
)d
0
26.03.2013, 16:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2013, 16:36
Помогаю со студенческими работами здесь

Реализация шаблонов класса в инлайн файле
Пытался написать шаблонный класс, реализуя как обычно объявление класса в h файле и определение...

Реализация шаблонов класса в инлайн файле
Пытался написать шаблонны MyClass.h #pragma once #define MYCLASS template &lt;typename T&gt;...

Очень нужен инлайн ассемблер в шарпе
Дали мне лабу, в которой нужно сделать инлайн вставку в С++. Ну это элементарно, Ватсон. const int...

Вертикальное выравнивание двух инлайн блоков
&lt;div class=&quot;wrapper one-project&quot;&gt; &lt;div class=&quot;one-project-about&quot;&gt;&lt;/div&gt; &lt;div...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru