Member 10761632 Ответов: 1

Как использовать динамический "порядок ПО" в табличнозначной функции


Я использую табличнозначную функцию в качестве параметрического представления. Работает почти все, кроме заказа по частям.Я изменил первоначальную функцию на эту короткую.

Функция:

ALTER FUNCTION [dbo].[fn_Get_NormalOrders]
(	
	@minimalLevel int,
	@recordStart int,
	@recordsEnd int,
	@orderBy varchar(30)
)
RETURNS TABLE 
AS
RETURN 
(
	select * 
		from
		(
			select 
				ROW_NUMBER() over (order by @orderBy) as row
				,d.nameModel
				,t.idToner
			from toner t
				inner join vwWebDevice d on d.idDevice = t.idDevice 
					and d.statusDevice not like '%stale%'
					and isnull(d.deleted,0) = 0
				inner join groups g on g.idGroup = d.idGroup

			where 
				t.currentLevel <= @minimalLevel

		) as x
	where x.row between @recordStart and @recordsEnd
)


Что я уже пробовал:

Я нашел решение, сделав varchar этого запроса и выполнив его, но как мне вернуть результат? Когда я использую его так, как сейчас, результат всегда один и тот же.

CHill60

Насколько я понимаю, вы не можете выполнять динамический sql изнутри функции. Чего вы на самом деле пытаетесь достичь?

1 Ответов

Рейтинг:
6

Member 10761632

Я хочу отсортировать результат по столбцу с помощью веб-портала PHP. Сначала у меня был тяжелый запрос в скрипте (я сделал его очень коротким для этой темы), но я хотел поместить тяжелую логику на SQL-сервер. Что-то вроде представления, в котором много логики. Я получил все, кроме сортировки по таблице (а также очень важную подкачку).

Я нашел решение ( с небольшой помощью : -)). Вместо того чтобы преобразовать запрос в текст, чем изменить жало и чем его извратить, я использовал случай. После этого мне пришлось добавить дополнительную сортировку, потому что результат не был отсортирован по строке.

Теперь я могу использовать такую функцию, как:

select * from dbo.fn_Get_NormalOrders(40,5,30,'nameModel') order by row


select *
    from
    (
        select
            case @orderBy
                when 'nameModel' then ROW_NUMBER() over (order by d.nameModel)
                when 'idToner' then ROW_NUMBER() over (order by t.idToner)
                else ROW_NUMBER() over (order by t.DTE)
            end as [row]
            ,d.nameModel
            ,t.idToner
        from toner t
            inner join vwWebDevice d on d.idDevice = t.idDevice
                and d.statusDevice not like '%stale%'
                and isnull(d.deleted,0) = 0
            inner join groups g on g.idGroup = d.idGroup

        where
            t.currentLevel <= 20

    ) as x
where x.row between 1 and 20