powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / пользовательская функция
11 сообщений из 11, страница 1 из 1
пользовательская функция
    #32035981
AAron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все привет. что-то я споткнулся на таких граблях.
хочу сделать функцию
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE FUNCTION fn(@AddCondition varchar( 8000 ))
RETURNS INT
AS
BEGIN
    DECLARE @SQL varchar( 8000 ), @CNT int
    SET @SQL = 'SELECT COUNT(*) FROM Tbl WHERE ' + @AddCondition
....
   RETURN @CNT
END

Вопрос! Как переменной @CNT получить значение COUNT(*). Или более общий вопрос, как получить назад параметры из запроса в текстовой строке?

Как мне кажется EXEC сюда не подходит, а sp_executesql вроде параметры принимает только внутрь.
...
Рейтинг: 0 / 0
пользовательская функция
    #32035986
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри здесь.
...
Рейтинг: 0 / 0
пользовательская функция
    #32035994
AAron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
большое спасибо... проблема были именно в возможности указать OUTPUT
...
Рейтинг: 0 / 0
пользовательская функция
    #32036008
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не поможет. sp_executesql внутри функции запрещена, хотя и является extended. MS постарался, а предупредить об этом исключении из правила не удосужился.
...
Рейтинг: 0 / 0
пользовательская функция
    #32036034
AAron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм... а тогда какие есть способы?
может сделать процедурой? правда тогда работать будет не так удобно...
...
Рейтинг: 0 / 0
пользовательская функция
    #32036043
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведи весь запрос пожалуйста.
...
Рейтинг: 0 / 0
пользовательская функция
    #32036060
AAron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот это хотелось бы обернуть в функцию, чтобы не лепить извращения.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
CREATE PROCEDURE func
    @Condition varchar( 8000 ),
    @Date datetime
RETURNS INT
BEGIN
DECLARE 
	@date_str varchar( 8000 ),
	@date_bom_str varchar( 8000 ),
	@result int

SET @date_str = CONVERT(varchar( 30 ), @date,  112 )

SET @date_bom_str = CONVERT(varchar( 30 ), DATEADD(day, -DATEPART(day, @date), @date),  112 )

DECLARE @SQL nvarchar( 4000 )
SET @SQL = 
N'
SELECT  @result = count(*)
FROM DD
INNER JOIN MD on DD.InstrumentID = MD.InstrumentID and MD.Date = '''+@date_str+'''
INNER JOIN BOM on DD.InstrumentID = BOM.InstrumentID and BOM.Date = '''+@date_bom_str+'''
WHERE
'

SET @SQL = @SQL + @Condition

EXEC sp_executesql @SQL, N'@result int output', @result = @result output

RETURN @result
END


запрос, в котором это требуется
Код: plaintext
1.
2.
SELECT ConditionID, FOUND = func(Condition, '2001-01-01')
FROM Conditions
...
Рейтинг: 0 / 0
пользовательская функция
    #32036066
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да уж, задачка. У меня с ходу ничего не придумывается. Когда-то уже что-то похожее в форуме было, но давно навеоное, найти не смог.

А сколько типов условий планируется хранить? Если пару десятков, то можно на каждое сделать по вьюхе и не мудрствуя лукаво спокойно жить. :)
...
Рейтинг: 0 / 0
пользовательская функция
    #32036069
AAron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там будет что-то типа
Price > 0.01 and Price < 1.1
или
FlagID in (........)
условия могут меняться в зависимости от предпочтений пользователя системы, который через интерфейс может формировать условия
...
Рейтинг: 0 / 0
пользовательская функция
    #32036073
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, похоже без курсора не обойтись...

А обязательно надо count'ы пачками расчитывать?
Может как-нибудь поодиночке получится?
...
Рейтинг: 0 / 0
пользовательская функция
    #32036074
AAron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно и через курсоры посчитать, тем более, что там можно и не использовать функцию, а считать через GROUP BY...

принципиально не хотелось делать курсоры, но кажется придется... :)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / пользовательская функция
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]