Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нужна помощь в реализации динамического запроса.  [new]
Prosha
Member

Откуда:
Сообщений: 10
Есть задача реализовать подсчет заработной платы в зависимости от выработки сотрудников. Так как количество тарифицируемых операций может изменяться во времени, было решено реализовывать это динамическим запросом, но тут я столкнулся с проблемой:
Внутри курсора, который бежит по списку услуг есть переменная, собирающая общий подзапрос, длина которого около 1500 символов, эта результирующая переменная быстро достигает своего максимума в 8000 и обрезается. Пока все что я смог придумать это каждый раз при новом шаге курсора вычислять длину результирующей переменной и если она больше 6500 символов, то использовать следующую переменную, но мне такое решение не нравится.

Подскажите свои идеи, плиз!




С уважением,

Россолов Петр.
14 окт 11, 13:14    [11440533]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в реализации динамического запроса.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
BOL->sp_executesql

sp_executesql [ @statement = ] statement
[
{ , [ @params = ] N'@parameter_name data_type [ OUT | OUTPUT ][ ,...n ]' }
{ , [ @param1 = ] 'value1' [ ,...n ] }
]

[ @statement = ] statement
Is a Unicode string that contains a Transact-SQL statement or batch. statement must be either a Unicode constant or a Unicode variable. More complex Unicode expressions, such as concatenating two strings with the + operator, are not allowed. Character constants are not allowed. If a Unicode constant is specified, it must be prefixed with an N. For example, the Unicode constant N'sp_who' is valid, but the character constant 'sp_who' is not. The size of the string is limited only by available database server memory. On 64-bit servers, the size of the string is limited to 2 GB, the maximum size of nvarchar(max).

Сообщение было отредактировано: 14 окт 11, 13:20
14 окт 11, 13:19    [11440595]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в реализации динамического запроса.  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Prosha,

автор
Есть задача реализовать подсчет заработной платы в зависимости от выработки сотрудников.
Так как количество тарифицируемых операций

Справочник тарифов

автор
может изменяться во времени,

Таблица действия тарифов

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

JOIN таблиц. SUM GROUP BY Сотрудники.

Чего то с структурой БД не то.

Если хочется уж, то сделайте на клиенте генерацию запроса или представления. Но "Когда я слышу слово декурсор, я хватаюсь за пистолет" (с) А.Пиночет
14 окт 11, 13:50    [11440920]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в реализации динамического запроса.  [new]
Prosha
Member

Откуда:
Сообщений: 10
Смысл в том, чтобы все оказанные услуги были записанны в одну строку, но скрипт должен быть универсальным и формировать ее в зависимости от оказанных за месяц услуг. Поэтому и было решено использовать курсор, на каждом шагу прибавляется достаточно весомый кусок кода, пока он выглядит так:

declare segamega cursor for
select distinct(gal_Label), cmp_Activity, convert(varchar(400),gps_ID) from LV_Company join GT_ServiceOrderDetail
on gsd_DebtorCompanyID = cmp_ID join GT_ActivityLabel on gal_ServiceID = gsd_ServiceID
join GT_ProvidedService on gps_id = gal_serviceID
order by 1, 2

open segamega
FETCH NEXT FROM segamega
INTO @Usluga, @ID_usl
while @@FETCH_STATUS = 0

begin


set @Prefix = @Prefix+'a'

set @Prefix2 = @Prefix2+'b'

set @query2 = @Prefix+'.cmp_FullName,'+@Prefix+'.gal_Label,'+@Prefix+'.summa,'+@Prefix+'.cena,'+@Prefix+'.oplata'

set @query4 = ' left join
(select cmp_FullName,
gal_Label,
gsd_ServiceOrderID,
SUM(convert(int,gsd_Value)) as summa,
convert(decimal(16,2),pcr_Price) as cena,
SUM(convert(int,gsd_Value))*convert(decimal(16,2),pcr_Price) as oplata
from GT_ServiceOrderDetail with(nolock) join GT_ActivityLabel on gal_ServiceID = gsd_ServiceID
and gal_LanguageID = 1 join (select * from dbo.BI_PriceList with(nolock) join dbo.BI_PriceListDates with(nolock) on
pld_PriceListID = pcl_ID join dbo.BI_PriceListDetail with(nolock) on pcr_PriceListDateID = pld_ID
join dbo.BI_PriceListDepositorLS on pdl_PriceListID = pcl_ID join LV_Company on cmp_Activity = CONVERT(varchar(10), pdl_DepositorID)
join dbo.BI_PriceListLang on pcll_PriceListID = pcl_id and pcll_LanguageID = 1
where pcl_Code like ('

set @querypromejutok = @query4 +@kovichki+@sdl+@kovichki+')) '+@Prefix2+' on '+@Prefix2+'.cmp_ID = gsd_DebtorCompanyID and gal_Label = '+@Prefix2+'.pcll_Description
where gsd_ServiceID = '+@ID_usl+' group by cmp_FullName, gal_Label, gsd_ServiceOrderID, pcr_Price) '+@Prefix+' on '+@Prefix+'.gsd_ServiceOrderID = gso_ID'

set @query6 = @Prefix+'.gal_Label, '+@Prefix+'.summa, '+@Prefix+'.cena, '+@Prefix+'.oplata, '+@Prefix+'.cmp_FullName'

set @queryitogselect = @queryitogselect + @query2 + ','

set @queryitogfrom = @queryitogfrom + @querypromejutok

set @queryitoggroup = @queryitoggroup + @query6 + ','
FETCH NEXT FROM segamega
INTO @Usluga, @ID_usl

end

close segamega
deallocate segamega


а ниже все это дело экзекутится.
но переменная @queryitogfrom растет очень быстро и до выполнения доходит обрезанной.
на сколько я понимаю в таком случае мне не поможет применение sp_executesql, так как я не смогу собрать полную строку для ее запуска.
быть может я изначально выбрал неверный способ реализации данной задачи?
14 окт 11, 14:11    [11441104]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в реализации динамического запроса.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Prosha,

Объявите переменную @queryitogfrom как nvarvhar(max) и перечитайте процитированное и выделенное из BOL.
14 окт 11, 14:17    [11441153]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в реализации динамического запроса.  [new]
Prosha
Member

Откуда:
Сообщений: 10
pkarklin,

Спасибо большое, все заработало!
14 окт 11, 14:38    [11441372]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в реализации динамического запроса.  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
Prosha
Спасибо большое, все заработало!
Это хорошо.

Но все же,
Ken@t
Чего то с структурой БД не то.
+1
14 окт 11, 14:44    [11441444]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в реализации динамического запроса.  [new]
Prosha
Member

Откуда:
Сообщений: 10
Но все же,
Ken@t
Чего то с структурой БД не то.
+1[/quot]

Ну база не нашего авторства, мы просто пытаемся вкорячить в нее что-то свое...
14 окт 11, 14:52    [11441545]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить