Форум: "Базы";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];
ВнизХранимая процедура в запросе Найти похожие ветки
← →
Котяра (2003-07-03 19:07) [0]Привет всем!
Я написал для обработки полей таблицы хранимую процедуру. Как мне вставить в запрос? Если я ее выполняю "вручную", т.е.
exec имя_процедуры данные, или просто имя_процедуры данные, - то все нормально, выдается результат. а в инструкции select она работать не хочет. Как заставить ее обрабатывать столбец таблицы?
С уважением, Разживин Александ.
← →
Тих (2003-07-03 21:35) [1]такая хранимая процедура в 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
и - дело в шляпе.
← →
Котяра (2003-07-03 23:16) [2]дык и функцию написал, и селект делал наподобие того - не работает, причем вручную функция выполняется отлично
:-(
← →
sniknik (2003-07-03 23:26) [3]исключительно правильная функция получилась, в потемках не работает. наде вывести ее в свет. (в смысле на всеобшее обозрение)
Котяра © (03.07.03 19:07)
...
exec имя_ процедуры
Тих (03.07.03 21:35)
...
create function
забавно, но мне кажется потому и не работает (хотя никаких оснований к таким выводам нет)
← →
Котяра (2003-07-04 06:56) [4]Процедура называется IntToDateStr("дата - целое число", "символ - разделитель", "строка для <пустых> дат")
В поле хранятся данные типа
20020301, 20020000, 0, 20030500, 200112
Процедура (вернее функция) выдает:
01.03.2002, 2002, ****, 05.2003, 12.2001
← →
ЮЮ (2003-07-04 08:14) [5]Осталось показать как ты её используешь в запросе и вручную :-)
← →
sniknik (2003-07-04 08:38) [6]кстати если функция написана исключительно ради разбора одного поля то по моему она лишняя, достаточно бы сделать VIEW и работать с таблицей через нее.
но это так, лирическое отступление. по вопросу информации недостаточно.
← →
Fiend (2003-07-04 12:51) [7]То Котяра:
а что если показать нам скрипт функции?
И в данном случае поддержу sniknik © (04.07.03 08:38).
Хотя даже в принципе можно и безо всяких там функций и вьюх
← →
Котяра (2003-07-07 17:54) [8]Текст хранимой процедуры
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, если эту процедуру писать в вьювере, мне кажется, слишком "круто".
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c