Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.31;
Скачать: CL | DM;

Вниз

Хранимая процедура в запросе   Найти похожие ветки 

 
Котяра ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
1-100821
Zilog
2003-07-17 16:28
2003.07.31
КАК: нужно дату 17.07.2003 преобразовать в 2003/07/17


1-100793
ramdy
2003-07-17 10:22
2003.07.31
stringgrid focused cell


14-100885
Дмитрий К.К.
2003-07-14 07:08
2003.07.31
Именинники 14 июля


8-100831
Дмитрий К.К.
2003-04-07 11:50
2003.07.31
TMediaplayer: playing from stream


11-100649
SPeller
2002-11-17 16:35
2003.07.31
Это DoubleBuffered виноват?