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

Откуда:
Сообщений: 22
Параметры процедуры можно получить из системных таблиц. Например так:

SELECT 
    p.name AS Parameter,        
    t.name AS [Type]
FROM sys.procedures sp
JOIN sys.parameters p 
    ON sp.object_id = p.object_id
JOIN sys.types t
    ON p.system_type_id = t.system_type_id
WHERE sp.name = 'InsertAttribute'



А как получить список переменных, которы возвращаются просто с помощью RETURN ?
8 авг 17, 08:25    [20707081]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
aleks222
Guest
Только Аллах, великий и милосердный, знает все.
8 авг 17, 08:34    [20707108]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
Alexander Titkin
Member

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

А с помощью return возвращается всегда одно значение типа int, он же код возврата.
8 авг 17, 08:35    [20707111]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
Izyum
Member

Откуда:
Сообщений: 22
В основном - да, возвращаем код ошибки.
Но возможно ли сделать универсально?
8 авг 17, 08:44    [20707142]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7762
Izyum
В основном - да, возвращаем код ошибки.
Но возможно ли сделать универсально?


Непонятен вопрос...
8 авг 17, 09:03    [20707183]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
Izyum
Member

Откуда:
Сообщений: 22
2 вопроса

1. Как сделать, если знаем, что всегда возвращается код ошибки, т.е. İNT

2. Как сделать, если не знаем тип RETURN-a
8 авг 17, 09:14    [20707199]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
o-o
Guest
Izyum
2 вопроса

1. Как сделать, если знаем, что всегда возвращается код ошибки, т.е. İNT

2. Как сделать, если не знаем тип RETURN-a

RETURN (Transact-SQL)
BOL
RETURN [ integer_expression ]
Arguments
integer_expression
Is the integer value that is returned. Stored procedures can return an integer value to a calling procedure or an application.
Return Types
Optionally returns int.
8 авг 17, 09:35    [20707238]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
Izyum
Member

Откуда:
Сообщений: 22
o-o,

вы не поняли вопроса.
мне нужно получить СПИСОК этих реторнов.
как например получаем список параметров из sys.parameters

т.е. нужно получить ОПИСАНИЕ процедуры.
8 авг 17, 09:50    [20707264]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6037
Izyum,

Если ты про тип возвращаемый скалярной функцией, то
select
       o.name
     , t.name as type_
     , p.* 
from 
    sys.objects o
    inner join sys.parameters p
        on o.object_id = p.object_id
    inner join sys.types t
        on t.system_type_id = p.system_type_id
where 
    o.type = 'FN' 
    and p.parameter_id = 0 
8 авг 17, 09:53    [20707272]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Вопрос про исходящие параметры (output) ? У них есть соотв.признак в sys.parameters is_output
8 авг 17, 10:03    [20707300]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
o-o
Guest
Izyum
o-o,
вы не поняли вопроса.

really???
автор
2. Как сделать, если не знаем тип RETURN-a

каков вопрос, таков и ответ:
кто не знает тип RETURN-а, вычитывает его в справке
8 авг 17, 10:16    [20707342]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31356
Izyum
o-o,

вы не поняли вопроса.
мне нужно получить СПИСОК этих реторнов.
как например получаем список параметров из sys.parameters

т.е. нужно получить ОПИСАНИЕ процедуры.
Ну и получите:
SELECT 
    'RETURN' AS Parameter,        
    'int' AS [Type]
8 авг 17, 10:56    [20707510]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
А. Х.
Member

Откуда: Зеленоград
Сообщений: 247
Расслабьтесь, это алгоритмически неразрешимая задача.
В общем случае не существует алгоритма, который глядя на другой алгоритм (в данном случае Ваша SP) - скажет все его возможные результаты.
См. [/url]
и в частности [url=https://ru.wikipedia.org/wiki/Проблема_остановки]
8 авг 17, 12:01    [20707851]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
А. Х.
Member

Откуда: Зеленоград
Сообщений: 247
[/url]
[url=ru.wikipedia.org/wiki/Проблема_остановки]
8 авг 17, 12:02    [20707855]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
А. Х.
Member

Откуда: Зеленоград
Сообщений: 247
Извиняюсь за коряво вставленные ссылки,
короче :
Алгоритмически неразрешимая задача
Проблема остановки
8 авг 17, 12:03    [20707862]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
SELECT SCHEMA_NAME(SCHEMA_ID) AS [Schema], 
SO.name AS [ObjectName],
SO.Type_Desc AS [ObjectType (UDF/SP)],
P.parameter_id AS [ParameterID],
P.name AS [ParameterName],
TYPE_NAME(P.user_type_id) AS [ParameterDataType],
P.max_length AS [ParameterMaxBytes],
P.is_output AS [IsOutPutParameter]
FROM sys.objects AS SO
INNER JOIN sys.parameters AS P 
ON SO.OBJECT_ID = P.OBJECT_ID
WHERE SO.OBJECT_ID IN ( SELECT OBJECT_ID 
FROM sys.objects
WHERE TYPE IN ('P','FN'))
ORDER BY [Schema], SO.name, P.parameter_id
8 авг 17, 12:10    [20707894]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7762
Izyum
2 вопроса

1. Как сделать, если знаем, что всегда возвращается код ошибки, т.е. İNT

2. Как сделать, если не знаем тип RETURN-a


С чего Вы решили, что есть какие-то варианты? Сами нафантазировали?
8 авг 17, 13:23    [20708259]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31356
А. Х.
В общем случае не существует алгоритма, который глядя на другой алгоритм (в данном случае Ваша SP) - скажет все его возможные результаты.
Почему не существует?
Любая процедура имеет одно возвращаемое RETURN-ом значение типа int
Задача решена, ничего не надо анализировать.
8 авг 17, 17:28    [20709120]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
А. Х.
Member

Откуда: Зеленоград
Сообщений: 247
alexeyvg,
Глядя на название топика "Получить список return значений процедуры" я бы сказал, что топикстартеру нужен список всех возможных значений, которые процедура может вернуть через RETURN.
8 авг 17, 22:33    [20709578]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31356
А. Х.
alexeyvg,
Глядя на название топика "Получить список return значений процедуры" я бы сказал, что топикстартеру нужен список всех возможных значений, которые процедура может вернуть через RETURN.
Судя по стартовому топику, ему нужно получить просто список названий с типами.
9 авг 17, 08:02    [20709795]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Автору топика:

out-of-box никак. Но можно:
- через системные структуры получить исходный код процедуры
- написать парсер, который парсит этот код и находит все RETURNы

Как писать?
- средствами T-SQL - возможно, если возвращаются только константы. Во всех остальных случаях слишком сложно
- средствами внешней процедуры написанной на .NET - самому парсить можно, если возвращаются константы.
Если же переменные, а значения им через запросы присваиваются, то можно воспользоваться Microsoft CodeDom библиотекой для T-SQL.
Типа как тут: Using the TransactSql.ScriptDOM parser to get statement counts

других путей нет.
9 авг 17, 09:11    [20709883]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31356
Yuri Abele
out-of-box никак. Но можно:
Вы тоже считаете, что ТС находит своим запросом именно значения параметров???
Izyum
SELECT 
    p.name AS Parameter,        
    t.name AS [Type]
FROM sys.procedures sp
JOIN sys.parameters p 
    ON sp.object_id = p.object_id
JOIN sys.types t
    ON p.system_type_id = t.system_type_id
WHERE sp.name = 'InsertAttribute'
10 авг 17, 01:29    [20712322]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
alexeyvg,

Значения? Нет конечно! Как можно узнать будущее?
10 авг 17, 07:19    [20712420]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Yuri Abele
alexeyvg,

Значения? Нет конечно! Как можно узнать будущее?

Но автор и не утверждал, что он значения вытаскивает, а вот описание сигнатуры таки да.
Т.е. его скрипт возвращает список параметров и их типы. Там только ещё OUPUT/INPUT не хватает
10 авг 17, 07:34    [20712436]     Ответить | Цитировать Сообщить модератору
 Re: Получить список return значений процедуры  [new]
o-o
Guest
Yuri Abele
Т.е. его скрипт возвращает список параметров и их типы. Там только ещё OUPUT/INPUT не хватает

output parameter это output parameter, а RETURN это RETURN.

ТС не нарисовал пример кода, теперь все угадывают до опупения.
вот моя версия их написания кода:
create proc dbo.sp_test_return
as  
	if datepart(dw, getdate()) = 1 return 10; 
	if datepart(dw, getdate()) = 2 return cast((convert(char(8), getdate(), 112)) as int);
	declare @p1 int, @p2 int;
	select @p1 = count(*),  @p2 = avg(number)
	from master..spt_values
	where type = 'p'; 
	if datepart(dw, getdate()) = 3 return @p1; 
	if datepart(dw, getdate()) = 4 return @p2; 
	return 400;
go

теперь он хочет выцепить все то, что у него может вернуть RETURN.

про типы у меня в первом же посте отвечено: возвращается всегда INT и только INT
(ну или ошибка конвертации в INT, если кто-то все же не понял про тип возвращаемого значения
и лепит туда что-то другое)

ну а значения пусть выгребает тот, кто придумал использовать RETURN вместо OUTPUT-параметра
10 авг 17, 09:59    [20712707]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить