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

Откуда:
Сообщений: 32
Приветствую. Сам новичок в MS SQL.

Есть скрипт, который должен выполнятся раз в 6 часов, но по к-ву символов не "влазит" в Job.

Как сделать его процедурой и делать вызов данный процедуры через джоб.

Заранее премного благодарен.


Вот и сам скрипт (писал не я):

Begin
  Set nocount on
  Set dateformat dmy --date format (day month year)

  Declare --varibles
    @ItemCount int, --count
    @GroupID int, --group item
    @GroupIDHex varbinary(10), --group item HEX
    @ItemID int, --item id in group 
    @ItemIDHex varbinary(10), --item id in group HEX
    @ResetLevel int, --reset level
    @ItemLevel int,
	@MinReset int,
	@MaxReset int,
	@Money int,
	@PointsDK int,
	@PointsDW int,
	@PointsFE int,
	@PointsMG int,
	@PointsDL int,
	@PointsCommDL int,
    @Npp int,
    @NppMax int,
    @In int,
    @InMax int,
    @Inventory varbinary(8000),
    @PerInv varchar(8000),
    @PerInvTMP varchar(8000),
    @PerInvTMP2 varchar(8000),
    @CharId varchar(10),
    @StartPoint int

  Set @ItemCount=1  
  Set @GroupID=14  
  Set @ItemID=21
  Set @ItemLevel=0
  Set @ResetLevel=400
  Set @MinReset=0
  Set @MaxReset=9
  Set @Money=99999999
  Set @PointsDK=500
  Set @PointsDW=500
  Set @PointsFE=500
  Set @PointsMG=650
  Set @PointsDL=650
  Set @PointsCommDL=300 -- real: (@PointsCommDL - (resets*10))

  set @GroupIDHex=dbo.HexStrToVarBin(master.dbo.fn_varbintohexstr(cast(@GroupID*16 as varbinary(1))) )
  set @ItemIDHex=dbo.HexStrToVarBin(master.dbo.fn_varbintohexstr(cast(@ItemID as varbinary(1))) )

select 'steep1'

	Declare @TLS table (CharID varchar(10), resets int, inventory varbinary(8000), npp int identity(1,1))

	Insert into @TLS (CharID, resets, inventory)
		select name, resets, inventory
		FROM Character c
			JOIN MEMB_STAT m ON c.AccountID = m.memb___id 
			COLLATE Latin1_general_CI_AI
		WHERE (clevel>=@ResetLevel) and (ConnectStat = 0) and (resets >= @MinReset and resets <= @MaxReset) and (Money >= @Money) and substring(inventory, 1, 192) = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
  --если таких нет то выходим из процедуры

	if (Select count(*) from @TLS)=0 Goto EX

	Declare @PS table (CharID varchar(10), ItemBin Varbinary(1000), ItemId int, Ready int, npp int identity(1,1))  
	
	set @NppMax=(select max(npp) from @TLS) --получаем количество ресетников
	set @InMax=64 --количество ячеек где будем искать
	Set @Npp=0
select 'steep2'

-- обходим инвентари игровок и разделяем его на составляющие части
	While @Npp<>@NppMax 
	begin
		Set @Npp=@Npp+1
		Set @In=0
		Set @StartPoint=-15
		Select @CharId=CharId, @Inventory=substring(Inventory, 193, 1024) from @TLS where npp=@Npp
		
		--обходим инвентарь ресетника
		While @In<>@InMax
		   begin
			Set @In=@In+1
			Set @StartPoint=@StartPoint+16
			Insert into @PS (CharID, ItemBin, ItemId, Ready) select @CharID, substring(@Inventory, @StartPoint, 16), @In, 0
		end
    end

	-- ищем нужные предметы в вещах, и если нашли меняем статус ready на 1
	Update p set ready=1 from @PS p where substring(ItemBin, 1, 1) = @ItemIDHex and substring(ItemBin, 10, 1) = @GroupIDHex and (convert(INT, substring(ItemBin, 2, 1))%128/8) = @ItemLevel

	-- создаём таблицу для нового инвентаря
	Declare @TRES table (CharId varchar(10), inventory varbinary(8000), npp int identity (1,1))
	
	insert into @TRES (CharId) (select p.CharId from @PS p where p.ready=1 group by p.CharId having sum(1)>=(select t.resets * @ItemCount + @ItemCount from @TLS t WHERE t.CharID = p.CharID))
	-- если некому делать ресет, потому что не хватает вещей, то выходим

	if (Select count(*) from @TRES)=0 Goto EX
	
	-- удаляем нужное количество вещей из таблицы с вещами
	set @NppMax=(select max(npp) from @TRES)
	set @Npp=0
	While @Npp<>@NppMax
	begin
		Set @Npp=@Npp+1
		Set @In=0
		
		Select @CharId=CharId from @TRES where npp=@Npp
		While @In<>(select t.resets * @ItemCount + @ItemCount from @TLS t WHERE t.CharID = @CharID)
		begin
			Set @In=@In+1
			Set @StartPoint = (
				select top 1 npp from @PS where CharId=@CharId and ready=1 and ItemBin<>0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF order by ItemId
			)
			Update p set ItemBin=0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF from @PS p where npp=@StartPoint
		end
	end
	-- -------------------------------------------------
	
	
	set @NppMax=(select max(npp) from @TRES) --получаем количество игроков у которых нужно обновить инвентарь
	Set @Npp=0 -- уже обновлено инвентарей
	select @Npp Npp, @NppMax NppMax
	While @Npp<>@NppMax
	begin
		Set @Npp=@Npp+1
		Set @In=0
		Select @CharId=CharId from @TRES where npp=@Npp
		Set @PerInv=''
		
		-- формируем инвентарь
		While @In<>64
		begin
			Set @In=@In+1
			Set @PerInvTMP=master.dbo.fn_varbintohexstr((select ItemBin from @PS where CharId=@CharId and ItemId=@In))
			Set @PerInv=@PerInv+substring(@PerInvTMP,3,32)
			select substring(@PerInvTMP,3,32)  -- обрезаем 0x из PerInvTMP
		end
		
		-- формируем полный инвентарь с сетом сундуком и шопом
		
		
		Select @Inventory=Inventory from @TLS where CharId=@CharId
		
		Set @PerInvTMP=master.dbo.fn_varbintohexstr(substring(@Inventory, 1, 192)) -- подключем сет
		Set @PerInvTMP2=master.dbo.fn_varbintohexstr(substring(@Inventory, 1217, 512)) -- подключаем шоп
		Set @PerInvTMP=@PerInvTMP+@PerInv+substring(@PerInvTMP2, 3, 1024)
		
		Update t set Inventory=dbo.HexStrToVarBin(@PerInvTMP) from @TRES t where npp=@Npp
		
		
		select * FROM @TRES --новый инвентарь
		
	end
	
	
	UPDATE c SET 
		clevel= 1, --level
		Experience= 0, --exp
		Money = Money - @Money,
		Strength = Case when ((class = 0) OR (class = 1) OR (class = 2))     then 18 --DW SM
			when ((class = 16) OR (class = 17) OR (class = 18))     then 28 --DK BK
			when ((class = 32) OR (class = 33) OR (class = 34) OR (class = 80) OR (class = 81) OR (class = 82)) then 22 --Elf summ
			when ((class = 96) OR (class = 97) OR (class = 98) OR (class = 48) OR (class = 49))			 then 26 --MG   
			when ((class = 64) OR (class = 65))			 then 28 --DL
			End,

		Dexterity = Case when ((class = 0) OR (class = 1) OR (class = 2))     then 18 --DW SM
			when ((class = 16) OR (class = 17))     then 20 --DK BK
			when ((class = 32) OR (class = 33) OR (class = 34) OR (class = 80) OR (class = 81) OR (class = 82)) then 25 --Elf summ
			when ((class = 96) OR (class = 97) OR (class = 98) OR (class = 48) OR (class = 49))			 then 26 --MG   
			when ((class = 64) OR (class = 65))			 then 20 --DL
			End,

		Vitality = Case when ((class = 0) OR (class = 1) OR (class = 2))     then 15 --DW SM
			when ((class = 16) OR (class = 17) OR (class = 18))     then 25 --DK BK
			when ((class = 32) OR (class = 33) OR (class = 34) OR (class = 80) OR (class = 81) OR (class = 82)) then 20 --Elf summ
			when ((class = 96) OR (class = 97) OR (class = 98) OR (class = 48) OR (class = 49))			 then 26 --MG   
			when ((class = 64) OR (class = 65))			 then 25 --DL
			End,

		Energy = Case when ((class = 0) OR (class = 1) OR (class = 2))     then 30 --DW SM
			when ((class = 16) OR (class = 17) OR (class = 18))     then 10 --DK BK
			when ((class = 32) OR (class = 33) OR (class = 34) OR (class = 80) OR (class = 81) OR (class = 82)) then 15 --Elf summ
			when ((class = 96) OR (class = 97) OR (class = 98) OR (class = 48) OR (class = 49))			 then 26 --MG   
			when ((class = 64) OR (class = 65))			 then 10 --DL
			End,
		MapNumber= Case when ((class = 0) OR (class = 1) OR (class = 2))     then 0 --DW SM
			when ((class = 16) OR (class = 17) OR (class = 18))     then 0 --DK BK
			when ((class = 32) OR (class = 33) OR (class = 34) OR (class = 80) OR (class = 81) OR (class = 82)) then 0 --Elf summ
			when ((class = 96) OR (class = 97) OR (class = 98) OR (class = 48) OR (class = 49))			 then 0 --MG   
			when ((class = 64) OR (class = 65))			 then 0 --DL
			End,

		MapPosX= Case when ((class = 0) OR (class = 1) OR (class = 2))     then 130 --DW SM
			when ((class = 16) OR (class = 17) OR (class = 18))     then 130 --DK BK
			when ((class = 32) OR (class = 33) OR (class = 34) OR (class = 80) OR (class = 81) OR (class = 82)) then 130 --Elf summ
			when ((class = 96) OR (class = 97) OR (class = 98) OR (class = 48) OR (class = 49))			 then 130 --MG   
			when ((class = 64) OR (class = 65))			 then 130 --DL
			End,

		MapPosY= Case when ((class = 0) OR (class = 1) OR (class = 2))     then 130 --DW SM
			when ((class = 16) OR (class = 17) OR (class = 18))     then 130 --DK BK
			when ((class = 32) OR (class = 33) OR (class = 34) OR (class = 80) OR (class = 81) OR (class = 82)) then 130 --Elf summ
			when ((class = 96) OR (class = 97) OR (class = 98) OR (class = 48) OR (class = 49))			 then 130 --MG   
			when ((class = 64) OR (class = 65))			 then 130 --DL
			End,
		Leadership = Case when ((class = 64) OR (class = 65)) then (@PointsCommDL - (resets*10)) --DL
			End,
		PkTime = 0,
		PkCount = 0,
		PkLevel = 0,
		resets = resets + 1, 
		LevelUpPoint = Case when ((class = 0) OR (class = 1) OR (class = 2))     then @PointsDW --DW SM
			when ((class = 16) OR (class = 17) OR (class = 18))     then @PointsDK --DK BK
			when ((class = 32) OR (class = 33) OR (class = 34) OR (class = 80) OR (class = 81) OR (class = 82)) then @PointsFE --Elf summ
			when ((class = 96) OR (class = 97) OR (class = 98) OR (class = 48) OR (class = 49))			 then @PointsMG --MG   
			when ((class = 64) OR (class = 65))			 then @PointsDL --DL
			End * (Resets + 1),
		c.inventory=t.inventory,
		-- SCFMasterLevel = 0,
		MagicList = NULL  --magies and skils (disabld)
	FROM Character c
    Inner join @TRES t on c.name=t.charid
	COLLATE Latin1_general_CI_AI
EX:
End
5 дек 11, 18:57    [11709549]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры из job  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
denimko,

надо
- создать хранимую процедуру (команда create procedure)
- поместить в джоб вызов процедуры (команда execute)
5 дек 11, 19:00    [11709558]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры из job  [new]
denimko
Member

Откуда:
Сообщений: 32
Le Peace,
Подробнее можно, если Вас не затруднит, или хоть примерные ссылки на гайды?
5 дек 11, 19:04    [11709575]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры из job  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
denimko,

http://social.msdn.microsoft.com/Search/ru-ru?query=create%20procedure&ac=8
http://social.msdn.microsoft.com/Search/ru-RU?query=execute&beta=0&ac=8

В конце статей примеры.
5 дек 11, 19:33    [11709648]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить