![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хранимая процедура в запросе [D5, MSSQL]
Котяра © (2003-07-03 19:07:00)Привет всем!
Я написал для обработки полей таблицы хранимую процедуру. Как мне вставить в запрос? Если я ее выполняю "вручную", т.е.
exec имя_процедуры данные, или просто имя_процедуры данные, - то все нормально, выдается результат. а в инструкции select она работать не хочет. Как заставить ее обрабатывать столбец таблицы?
С уважением, Разживин Александ.
Котяра (2003-07-07 17:54:00) [1]Текст хранимой процедуры
CREATE PROCEDURE SP_INTTODATESTR (@I INTEGER, @R CHAR(1) = ".", @Z CHAR(10) = "****") AS
DECLARE
@N INTEGER,
@S CHAR(10),
@D CHAR(3),
@M CHAR(3)
BEGIN
if @I IS NULL or @I = 0
select @Z else
begin
if @I < 100 begin if @I > 50
select @N = (1900 + @I) * 10000
else select @N = (2000 + @I) * 10000
end
else if @I < 10000
select @N = @I * 10000
else if @I < 1000000
select @N = @I * 100
else select @N = @I
select @S = CONVERT(CHAR(10),@N)
if substring(@S,7,2) <> "00"
select @D = substring(@S,7,2) + @R
else select @D = ""
if substring(@S,5,2) <> "00"
select @M = substring(@S,5,2) + @R
else
begin
select @D = ""
select @M = ""
end
select @D + @M + substring(@S,1,4)
end
END
GO
Результат возвращается в виде строки, например запускаю так:
EXEC SP_INTTODATESTR 20030701 выдает:
------------
01.07.2003
Как мне его "засунуть" в select? Пробую консрукцию типа:
SELECT EQ_LIST.DATA1, "DATE1" = (SP_INTTODATESTR EQ_LIST.DATA1) FROM EQ_LIST -
не работает. Я уже все варианты испробовал....
пробовал возвращать результат в виде параметра с OUTPUT, еще сложнее получается. Сервер MS SQL 6.5, там _функций_ не предусмотрено. А таких полей в таблице - 6, если эту процедуру писать в вьювере, мне кажется, слишком "круто".
Fiend (2003-07-04 12:51:00) [2]То Котяра:
а что если показать нам скрипт функции?
И в данном случае поддержу sniknik © (04.07.03 08:38).
Хотя даже в принципе можно и безо всяких там функций и вьюх
sniknik (2003-07-04 08:38:00) [3]кстати если функция написана исключительно ради разбора одного поля то по моему она лишняя, достаточно бы сделать VIEW и работать с таблицей через нее.
но это так, лирическое отступление. по вопросу информации недостаточно.
ЮЮ (2003-07-04 08:14:00) [4]Осталось показать как ты её используешь в запросе и вручную :-)
Котяра (2003-07-04 06:56:00) [5]Процедура называется IntToDateStr("дата - целое число", "символ - разделитель", "строка для <пустых> дат")
В поле хранятся данные типа
20020301, 20020000, 0, 20030500, 200112
Процедура (вернее функция) выдает:
01.03.2002, 2002, ****, 05.2003, 12.2001
sniknik (2003-07-03 23:26:00) [6]исключительно правильная функция получилась, в потемках не работает. наде вывести ее в свет. (в смысле на всеобшее обозрение)
Котяра © (03.07.03 19:07)
...
exec имя_ процедуры
Тих (03.07.03 21:35)
...
create function
забавно, но мне кажется потому и не работает (хотя никаких оснований к таким выводам нет)
Котяра (2003-07-03 23:16:00) [7]дык и функцию написал, и селект делал наподобие того - не работает, причем вручную функция выполняется отлично
:-(
Тих (2003-07-03 21:35:00) [8]такая хранимая процедура в MSSQL 2000 носит название функции, если я вас правильно понял, см. create function в books online.
из функции даже можно делать select, если функция возвращает таблицу.
Вариант второй. Есть таблица, над каждой ячейкой некоего поля которой надо проделать какую-то сложную манипуляцию. Аналогично, пиишется функция навроде
create function foo(@value nvarchar(100)) returns int
as
begin
/* 1000 строк сложного кода */
return len(@value);
end
потом делается вьюшка навроде
create view view_tbl as select a, dbo.foo(b) from tbl
и - дело в шляпе.