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

Откуда: Москва
Сообщений: 187
Здравствуйте,
подскажите пожалуйста...
Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение из другой хранимой процедуры?

Есть процедура которая запращивает сообщения:

ALTER PROCEDURE [dbo].[SelectOutBoxMessages]
	@IdSender int,
	@IsAlreadySend bit
AS
BEGIN
	SELECT *
  FROM [Zada4i].[dbo].[Сообщение]
  WHERE [Отправитель_ID] = @IdSender
	AND [Удалено_у_отправителя] ='false'
	AND [Отправлено] = @IsAlreadySend
END

Вот пример результата:
------------------------------------------------------------------------------------
[ID] |[Текст_сообщения]|[Дата_отправки]|[Время_отправки]|[Отправитель_ID]|[Тема]
--------+-----------------+---------------+----------------+----------------+------
23 |сообщение | 2011-10-21 | 13:59:40 | 1 |тема
-----------------------------------------------------------------------------------

Есть процедура которая запрашивает получателей сообщения:

ALTER PROCEDURE [dbo].[SelectReceivesOutBoxMessage]
	@IdMessage int 
AS
BEGIN
    SELECT *
    FROM [Zada4i].[dbo].[Получатели_исходящих_сообщений]
	WHERE [ID_Сообщения] = @IdMessage
END

Вот пример результата:
-----------------------------------------
|[ID] |[ID_Сообщения] | [ФИО] |
-----------------------------------------
| 45 | 23 | Иванов |
-----------------------------------------
| 46 | 23 | Петров |
-----------------------------------------
| 47 | 23 | Сидоров |
-----------------------------------------

Что нужно получить:

-------------------------------------------------------------------------------------------------------
[ID]| Получатели_ФИО_______|[Текст_сообщения]|[Дата_отправки]|[Время_отправки]|[Отправитель_ID]|[Тема]
----+----------------------------------+------------------------+---------------------+----------------+----------------+------
23 | Иванов,Петров,Сидоров |сообщение_______| 2011-10-21_____ | 13:59:40 _______ |______1____|тема
-------------------------------------------------------------------------------------------------------


Пыталась найти примеры в интеренете как можно такое сделать, но таких не было. Хотела попробывать реализовать это как нибудь через переменные что-то на подобие SET @a = (SELECT * FROM [Получатели_исходящих_сообщений] WHERE [ID_Сообщения] = 23), но синтаксис не правильный. Я не очень понимаю как это можно сделать.

Может кто нибудь посоветывать как можно выдернуть значение из хранимой процедуры из другой хранимой процедуры
?


_________________________________________________________________________________
Жизнь - это сплошное движение, кто-то шевелит извилинами, а кто-то хлопает ушами...
24 окт 11, 16:16    [11490179]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Solomka,

создать таблицу, по структуре соответствующую возвращаемому процедурой датасету.
Заполнить таблицу вызовом процедуры.
Далее работать только с таблицей.

А вот если переделать процедуру на табличную функцию...
24 окт 11, 16:21    [11490212]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
Solomka
Member

Откуда: Москва
Сообщений: 187
iap
Solomka,

создать таблицу, по структуре соответствующую возвращаемому процедурой датасету.
Заполнить таблицу вызовом процедуры.
Далее работать только с таблицей.

А вот если переделать процедуру на табличную функцию...


Создать временную таблицу мне удалось...
DECLARE @tbl TABLE (
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[ID_сообщение] [int] NULL,
	[ФИО] [nvarchar] NULL ) ; 


А как её заполнить из ХП?
SET @tbl = CALL SelectReceivesOutBoxMessage (23)
этот синтаксис не правильный
24 окт 11, 16:53    [11490501]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
iljy
Member

Откуда:
Сообщений: 8711
Solomka,

insert ... exec
24 окт 11, 16:58    [11490549]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
Solomka
Member

Откуда: Москва
Сообщений: 187
iljy
Solomka,

insert ... exec


А как туда передать значение?

INSERT @tbl EXEC SelectReceivesOutBoxMessage (23)
Так не работает
24 окт 11, 17:14    [11490686]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
iljy
Member

Откуда:
Сообщений: 8711
Solomka,

а вы синтаксис не пытались посмотреть?
24 окт 11, 17:19    [11490722]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Solomka,

и версию сервера назовите
24 окт 11, 17:28    [11490809]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
Solomka
Member

Откуда: Москва
Сообщений: 187
iljy
Solomka,

а вы синтаксис не пытались посмотреть?

В интернете нашла такой синтаксис, но он у меня не работает
24 окт 11, 21:48    [11492051]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
Solomka
Member

Откуда: Москва
Сообщений: 187
iap
Solomka,

и версию сервера назовите

Microsoft Sql Server 2008
24 окт 11, 21:49    [11492053]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
iljy
Member

Откуда:
Сообщений: 8711
Solomka
iljy
Solomka,

а вы синтаксис не пытались посмотреть?

В интернете нашла такой синтаксис, но он у меня не работает

И ссылку покажете?
24 окт 11, 22:16    [11492133]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
гадя
Guest
Solomka
...кто-то шевелит извилинами, а кто-то хлопает ушами...

эт точно.

[dbo].[SelectReceivesOutBoxMessage] - странная процедура получения скалярного значения.
как вариант, сделайте ее такой чтобы могла список id сообщений получать.
а лучше сделать всё что вам надо вобще одним селектом. а то направление в котором идете курсорами в будущем попахивает.

табличка @... отличается от таблички #... и временной называется только одна из них.
24 окт 11, 22:24    [11492146]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
Solomka
Member

Откуда: Москва
Сообщений: 187
iljy
Solomka
пропущено...

В интернете нашла такой синтаксис, но он у меня не работает

И ссылку покажете?

Боюсь не покажу...
В интернет я заходила с рабочего компьютера, и в закладки я эту страницу не добавляла.

А к чему такой вопрос? :-/
24 окт 11, 22:30    [11492164]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
Solomka
Member

Откуда: Москва
Сообщений: 187
гадя
Solomka
...кто-то шевелит извилинами, а кто-то хлопает ушами...

эт точно.

[dbo].[SelectReceivesOutBoxMessage] - странная процедура получения скалярного значения.
как вариант, сделайте ее такой чтобы могла список id сообщений получать.
а лучше сделать всё что вам надо вобще одним селектом. а то направление в котором идете курсорами в будущем попахивает.

табличка @... отличается от таблички #... и временной называется только одна из них.


Что-то я Вас совсем не поняла...
Я чайник относительно хранимых процедур и функций.
24 окт 11, 22:33    [11492172]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
iljy
Member

Откуда:
Сообщений: 8711
Solomka,

к тому, что в моем интернете синтаксис мало-мало другой.

Чайник - так учитесь. Процедура не может вызываться в теле запроса (кроме INSERT EXEC). Соответственно вы не можете ни нормально вызвать ее для множества параметров, ни удобно обработать возвращаемое множество значений. Есть обходные пути (типа табличных параметров), но они не всегда удобны и применимы. Функция, особенно инлайн, в этом смысле гораздо более практична, но у нее другие ограничения.
24 окт 11, 23:01    [11492248]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
Solomka
Member

Откуда: Москва
Сообщений: 187
iljy
Solomka,

к тому, что в моем интернете синтаксис мало-мало другой.

Чайник - так учитесь. Процедура не может вызываться в теле запроса (кроме INSERT EXEC). Соответственно вы не можете ни нормально вызвать ее для множества параметров, ни удобно обработать возвращаемое множество значений. Есть обходные пути (типа табличных параметров), но они не всегда удобны и применимы. Функция, особенно инлайн, в этом смысле гораздо более практична, но у нее другие ограничения.


До правильного синтаксиса я дошла сама, через создание сценариев, сегодня утром.

А в чем будет преимущество функции inline перед хранимой процедурой?

И ещё вопрос: не подскажете как можно обращаться построчно к полученной таблице?
число строк можно посчитать через RowCount. что нибудь на подобие for есть?
25 окт 11, 10:42    [11493347]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
iljy
Member

Откуда:
Сообщений: 8711
Solomka
А в чем будет преимущество функции inline перед хранимой процедурой?

В том, что ее можно напрямую использовать в запросах, а то, что она инлайн, позволяет оптимизатору выбирать хороший план выполнения.
Solomka
И ещё вопрос: не подскажете как можно обращаться построчно к полученной таблице?
число строк можно посчитать через RowCount. что нибудь на подобие for есть?

Не надо обращаться к таблице построчно. Это путь порочный и тупиковый. Скуль предназначен для работы с множествами.
25 окт 11, 10:48    [11493396]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
Solomka
Member

Откуда: Москва
Сообщений: 187
iljy
Не надо обращаться к таблице построчно. Это путь порочный и тупиковый. Скуль предназначен для работы с множествами.


А как можно через множества склеить в одну переменную все значения в столбце таблицы?
25 окт 11, 11:00    [11493491]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
Solomka
До правильного синтаксиса я дошла сама, через создание сценариев, сегодня утром.
Просто доку посмотреть некошерно?

Solomka
И ещё вопрос: не подскажете как можно обращаться построчно к полученной таблице?
число строк можно посчитать через RowCount. что нибудь на подобие for есть?
Ага
гадя
а лучше сделать всё что вам надо вобще одним селектом. а то направление в котором идете курсорами в будущем попахивает.
25 окт 11, 11:00    [11493494]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
iljy
Member

Откуда:
Сообщений: 8711
Solomka
А как можно через множества склеить в одну переменную все значения в столбце таблицы?

FAQ - Сложение символьных полей в запросе.
25 окт 11, 11:03    [11493528]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
Solomka
Member

Откуда: Москва
Сообщений: 187
iljy
Solomka
А как можно через множества склеить в одну переменную все значения в столбце таблицы?

FAQ - Сложение символьных полей в запросе.

Спасибо за совет,
Мне удалось создать такую функцию, которая возвращяем получателей сообщения в том виде в которром я именно хотела...
Вот её код:
ALTER FUNCTION [dbo].[CalcPeople] 
(
	@IdCalcMessage int
)
RETURNS nvarchar(max)
AS
BEGIN

DECLARE  
	@tbl TABLE ([ID] [int]  NOT NULL, [ID_сообщение] [int] NULL, [ФИО] [nvarchar](max) NULL )
DECLARE   @needReturn nvarchar(max)
 
set @needReturn= ( select [ФИО] + ',' as 'data()' from [Zada4i].[dbo].[Получатели_исходящих_сообщений]  WHERE [ID_Сообщения] = @IdCalcMessage for xml path('') )
set @needReturn= LEFT(@needReturn,LEN(@needReturn)-1) 


 RETURN (@needReturn)
END

Отталкиваясь от того что функии вызываются:
Название_функции(передаваемое_значение)


Я предположила что надо делать хп следующим образом:
CREATE PROCEDURE SelectOutBoxMessages2 
	(@IdSender int,
	@IsAlreadySend bit)
AS

BEGIN

DECLARE  @tbl TABLE (
	[ID] [int] NOT NULL,
	[Текст_сообщения] [nvarchar](max) NULL,
	[Дата_отправки] [date] NULL,
	[Время_отправки] [time](7) NULL,
	[Отправитель_ID] [int] NULL,
	[Тема] [nvarchar](max) NULL,
	[Получатели] [nvarchar](max) NULL)
 

SET @tbl = ( SELECT *, CalcPeople([ID])  FROM [Zada4i].[dbo].[Сообщение]  WHERE [Отправитель_ID] = @IdSender 	AND [Удалено_у_отправителя] ='false' AND [Отправлено] = @IsAlreadySend)
	
RETURN  @tbl

END
GO

Однако при попытке выполнить команду мне выдается ошибка:
Сообщение 195, уровень 15, состояние 10, процедура SelectOutBoxMessages2, строка 25
CalcPeople не является известным имя встроенной функции.


Как эту функцию надо вызвать ?
25 окт 11, 16:07    [11496800]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
dbo.CalcPeople([ID])  FROM ...

а вот так нельзя!
DECLARE  @tbl TABLE
SET @tbl = ...
25 окт 11, 16:17    [11496942]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
Solomka
Мне удалось создать такую функцию, которая возвращяем получателей сообщения в том виде в которром я именно хотела...
ALTER FUNCTION [dbo].[CalcPeople] 
(
	@IdCalcMessage int
)
RETURNS nvarchar(max)
AS
BEGIN

DECLARE  
	@tbl TABLE ([ID] [int]  NOT NULL, [ID_сообщение] [int] NULL, [ФИО] [nvarchar](max) NULL )
DECLARE   @needReturn nvarchar(max)
 
set @needReturn= ( select [ФИО] + ',' as 'data()' from [Zada4i].[dbo].[Получатели_исходящих_сообщений]  WHERE [ID_Сообщения] = @IdCalcMessage for xml path('') )
set @needReturn= LEFT(@needReturn,LEN(@needReturn)-1) 


 RETURN (@needReturn)
END

Однако при попытке выполнить команду мне выдается ошибка:
Сообщение 195, уровень 15, состояние 10, процедура SelectOutBoxMessages2, строка 25
CalcPeople не является известным имя встроенной функции.
Судя по сообщению, вам не удалось ее создать.

ALTER FUNCTION [dbo].[CalcPeople] можно выполнить, если функция [dbo].[CalcPeople] уже существует.
Иначе, надо:
CREATE FUNCTION [dbo].[CalcPeople]...

Зачем у вас там
DECLARE  
	@tbl TABLE ([ID] [int]  NOT NULL, [ID_сообщение] [int] NULL, [ФИО] [nvarchar](max) NULL )
?
Где эта табличная переменная используется?

Что делает строка
set @needReturn= ( select [ФИО] + ',' as 'data()' from [Zada4i].[dbo].[Получатели_исходящих_сообщений]  WHERE [ID_Сообщения] = @IdCalcMessage for xml path('') )
?

Начниите, уже, документацию читать.
25 окт 11, 16:30    [11497074]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
Solomka
Member

Откуда: Москва
Сообщений: 187
Konst_One
dbo.CalcPeople([ID])  FROM ...

а вот так нельзя!
DECLARE  @tbl TABLE
SET @tbl = ...



Спасибо,
Заменила на:
SET @tbl = ( SELECT *, dbo.CalcPeople([ID])  FROM [Zada4i].[dbo].[Сообщение]  WHERE [Отправитель_ID] = @IdSender 	AND [Удалено_у_отправителя] ='false' AND [Отправлено] = @IsAlreadySend)

Теперь эта ошибка не вылетает.

В сумме у меня получилось:
CREATE PROCEDURE SelectOutBoxMessages2 
	(@IdSender int,
	@IsAlreadySend bit)
AS

BEGIN

DECLARE  @tbl TABLE (
	[ID] [int] NOT NULL,
	[Текст_сообщения] [nvarchar](max) NULL,
	[Дата_отправки] [date] NULL,
	[Время_отправки] [time](7) NULL,
	[Отправитель_ID] [int] NULL,
	[Отправлено] [bit] NULL,
	[Удалено_у_отправителя] [bit] NULL,
	[Тема] [nvarchar](max) NULL,
	[Получатели] [nvarchar](max) NULL)
 

SET @tbl = ( SELECT *, dbo.CalcPeople([ID])  FROM [Zada4i].[dbo].[Сообщение]  WHERE [Отправитель_ID] = @IdSender 	AND [Удалено_у_отправителя] ='false' AND [Отправлено] = @IsAlreadySend)
	
RETURN  @tbl

END
GO

Вот тольк незадача. Теперь вылетает другая ошибка:
Сообщение 137, уровень 16, состояние 1, процедура SelectOutBoxMessages2, строка 25
Необходимо объявить скалярную переменную "@tbl".
Сообщение 137, уровень 16, состояние 1, процедура SelectOutBoxMessages2, строка 27
Необходимо объявить скалярную переменную "@tbl".


Вроде бы синтаксис верный, единственное я добавила поле [Получатели], которое как раз по идее должно заполняться с помощъю функции.
Что тут недоучла?
25 окт 11, 16:41    [11497169]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Solomka, по ошибкам видно, что синтаксис неверный - вы пытаетесь табличную переменную @tbl использовать как скалярную, присваивая ей нечто через SET

а данные в таблицу надо вставлять при помощи INSERT
25 окт 11, 16:48    [11497229]     Ответить | Цитировать Сообщить модератору
 Re: Как для одного поля таблицы возвращаемой хранимой процедуры выдергивать значение значение  [new]
Solomka
Member

Откуда: Москва
Сообщений: 187
Shakill
Solomka, по ошибкам видно, что синтаксис неверный - вы пытаетесь табличную переменную @tbl использовать как скалярную, присваивая ей нечто через SET

а данные в таблицу надо вставлять при помощи INSERT


Спасибо,
заменила на
INSERT	INTO @tbl   SELECT *, dbo.CalcPeople([ID])  FROM [Zada4i].[dbo].[Сообщение]  WHERE [Отправитель_ID] = @IdSender 	AND [Удалено_у_отправителя] ='false' AND [Отправлено] = @IsAlreadySend
теперь стало на одну ошибку меньше
автор
Сообщение 137, уровень 16, состояние 1, процедура SelectOutBoxMessages2, строка 27
Необходимо объявить скалярную переменную "@tbl".

Вроде я всегда DECLARE после BEGIN и ошибок не вылетает. Может я как то таблицу не правильно делаю?
25 окт 11, 17:03    [11497383]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить