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

Откуда:
Сообщений: 7
Здравствуйте коллеги.

Уже несколько дней оптимизирую скрипт. Я не могу избавится от курсора. Пробовал через CTE, но не получилось.
Помогите, пожалуйста, решить данную задачу не прибегая к курсорам.
Постараюсь подробно описать задачу.

Предметная область.
Допустим прошел турнир по шашкам на призы "Деда мороза".
а) В начале турнира у каждого участника есть по 10 очков.
б) После каждой игры победителю начисляется столько очков, сколько было у проигравшего.
в) Победитель записан в поле "plr1"

Необходимо каждому игроку подсчитать кол-во заработанных очков. И выявить победителя.

--Таблица @Games - Состоявшиеся игры
--npp		Номер игры по-порядку
--npp1		Номер последней игры "Участника1" (ссылается на поле npp)
--npp2		Номер последней игры "Участника2" (ссылается на поле npp)
--plr1		Имя "Участника1"
--plr2		Имя "Участника2"
--points1	Очки "Участника1"
--points2	Очки "Участника2"

DECLARE @Games TABLE(npp int,npp1 int,npp2 int,plr1 VARCHAR(4),plr2 VARCHAR(4),points1 int,points2 int)

INSERT INTO @Games(npp,npp1,npp2,plr1,plr2,points1,points2)
SELECT 1,0,0,'Петя','Коля',0,0
UNION ALL
SELECT 2,0,0,'Вася','Витя',0,0
UNION ALL
SELECT 3,2,1,'Вася','Петя',0,0
UNION ALL
SELECT 4,1,2,'Коля','Витя',0,0
UNION ALL
SELECT 5,0,3,'Толя','Вася',0,0
UNION ALL
SELECT 6,4,4,'Коля','Витя',0,0
UNION ALL
SELECT 7,5,6,'Вася','Коля',0,0
UNION ALL
SELECT 8,3,5,'Петя','Толя',0,0
UNION ALL
SELECT 9,8,6,'Петя','Витя',0,0
UNION ALL
SELECT 10,7,9,'Вася','Витя',0,0

----Все игры
--SELECT * FROM @Games

DECLARE @npp INT,@npp1 INT,@npp2 INT,@plr1 VARCHAR(4),@plr2 VARCHAR(4),@points1 INT,@points2 INT, @points1_prew INT, @points2_prew INT

DECLARE cGames CURSOR LOCAL FORWARD_ONLY STATIC FOR
SELECT npp,npp1,npp2,plr1,plr2,points1,points2 FROM @Games ORDER BY npp

OPEN cGames
FETCH NEXT FROM cGames INTO @npp,@npp1,@npp2,@plr1,@plr2,@points1,@points2

WHILE @@FETCH_STATUS=0
BEGIN
	--Кол-во очков "Участника1", из предыдущей игры с его участием
	SET @points1_prew=10
	SELECT @points1_prew=CASE WHEN plr1=@plr1 THEN points1 ELSE points2 END FROM @Games g1 WHERE npp=@npp1

	--Кол-во очков "Участника2", из предыдущей игры с его участием
	SET @points2_prew=10
	SELECT @points2_prew=CASE WHEN plr1=@plr2 THEN points1 ELSE points2 END FROM @Games g2 WHERE npp=@npp2

	--Начисляем заработанные очки
	UPDATE @Games SET points1=@points1_prew+@points2_prew, points2=@points2_prew WHERE npp=@npp 

	FETCH NEXT FROM cGames INTO @npp,@npp1,@npp2,@plr1,@plr2,@points1,@points2
END

CLOSE cGames
DEALLOCATE cGames

--Результат выполнения курсора
SELECT * FROM @Games

--Набранные очки
--Меньше всех очков набрал "Витя". У него 10 очков, т.к. все свои встречи он проиграл.

--А участник турнира "Вася" заработал 80 очков.
--Как он это сделал:
--1.Изначально у него было 10 очков
--2.Он обыграл "Витя"(10). Теперь у "Вася" стало 10+10=20
--3.Он обыграл "Петя"(20). Теперь у "Вася" стало 20+20=40
--4.Он проиграл "Толя". У "Вася" очки не увеличились 40+0=40
--5.Он обыграл "Коля"(30). Теперь у "Вася" стало 40+30=70
--6.Он обыграл "Витя"(10). Теперь у "Вася" стало 70+10=80

SELECT plr, MAX(pnts) AS pnts FROM
(SELECT plr1 AS plr, points1 AS pnts FROM @Games
UNION ALL
SELECT plr2 AS plr, points2 AS pnts FROM @Games) t
GROUP BY plr
ORDER BY pnts DESC


Спасибо.
20 сен 13, 01:47    [14862066]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, избавиться от курсора.  [new]
aleks2
Guest
Считать ты не умеешь. И о нормальных формах - не ведаешь.

DECLARE @Games TABLE(npp int,npp1 int,npp2 int,plr1 VARCHAR(4),plr2 VARCHAR(4),points1 int,points2 int)

INSERT INTO @Games(npp,npp1,npp2,plr1,plr2,points1,points2)
SELECT 1,0,0,'Петя','Коля',0,0
UNION ALL
SELECT 2,0,0,'Вася','Витя',0,0
UNION ALL
SELECT 3,2,1,'Вася','Петя',0,0
UNION ALL
SELECT 4,1,2,'Коля','Витя',0,0
UNION ALL
SELECT 5,0,3,'Толя','Вася',0,0
UNION ALL
SELECT 6,4,4,'Коля','Витя',0,0
UNION ALL
SELECT 7,5,6,'Вася','Коля',0,0
UNION ALL
SELECT 8,3,5,'Петя','Толя',0,0
UNION ALL
SELECT 9,8,6,'Петя','Витя',0,0
UNION ALL
SELECT 10,7,9,'Вася','Витя',0,0

declare @npp int = (select max(npp) from @Games), @i int = 1;
declare @t table (plr VARCHAR(4), points int);

insert @t
select plr1 as plr, 10 as points from @Games union select plr2 as plr, 10 as points from @Games;

while @i<=@npp
begin
	--Начисляем заработанные очки
	UPDATE t SET points = t.points + t2.points
	  from @t t 
	       inner join ( select * from @Games where npp = @i ) g on g.plr1 = t.plr 
	       inner join @t t2 on t2.plr = g.plr2
	;
    --select * from @Games where npp = @i     
    --select * from @t order by points desc;
    set @i = @i + 1;	  
end;

select * from @t order by points desc;


Шоб ты мог посчитать на пальцах...

npp npp1 npp2 plr1 plr2 points1 points2
----------- ----------- ----------- ---- ---- ----------- -----------
1 0 0 Петя Коля 0 0
plr points
---- -----------
Петя 20
Толя 10
Вася 10
Витя 10
Коля 10

npp npp1 npp2 plr1 plr2 points1 points2
----------- ----------- ----------- ---- ---- ----------- -----------
2 0 0 Вася Витя 0 0
plr points
---- -----------
Вася 20
Петя 20
Толя 10
Витя 10
Коля 10

npp npp1 npp2 plr1 plr2 points1 points2
----------- ----------- ----------- ---- ---- ----------- -----------
3 2 1 Вася Петя 0 0
plr points
---- -----------
Вася 40
Петя 20
Толя 10
Витя 10
Коля 10

npp npp1 npp2 plr1 plr2 points1 points2
----------- ----------- ----------- ---- ---- ----------- -----------
4 1 2 Коля Витя 0 0
plr points
---- -----------
Вася 40
Коля 20
Петя 20
Толя 10
Витя 10

npp npp1 npp2 plr1 plr2 points1 points2
----------- ----------- ----------- ---- ---- ----------- -----------
5 0 3 Толя Вася 0 0
plr points
---- -----------
Толя 50
Вася 40
Коля 20
Петя 20
Витя 10

npp npp1 npp2 plr1 plr2 points1 points2
----------- ----------- ----------- ---- ---- ----------- -----------
6 4 4 Коля Витя 0 0
plr points
---- -----------
Толя 50
Вася 40
Коля 30
Петя 20
Витя 10

npp npp1 npp2 plr1 plr2 points1 points2
----------- ----------- ----------- ---- ---- ----------- -----------
7 5 6 Вася Коля 0 0
plr points
---- -----------
Вася 70
Толя 50
Коля 30
Петя 20
Витя 10

npp npp1 npp2 plr1 plr2 points1 points2
----------- ----------- ----------- ---- ---- ----------- -----------
8 3 5 Петя Толя 0 0
plr points
---- -----------
Вася 70
Петя 70
Толя 50
Коля 30
Витя 10

npp npp1 npp2 plr1 plr2 points1 points2
----------- ----------- ----------- ---- ---- ----------- -----------
9 8 6 Петя Витя 0 0
plr points
---- -----------
Петя 80
Вася 70
Толя 50
Коля 30
Витя 10

npp npp1 npp2 plr1 plr2 points1 points2
----------- ----------- ----------- ---- ---- ----------- -----------
10 7 9 Вася Витя 0 0
plr points
---- -----------
Вася 80
Петя 80
Толя 50
Коля 30
Витя 10
20 сен 13, 07:29    [14862173]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, избавиться от курсора.  [new]
orrery
Member

Откуда:
Сообщений: 7
Здравствуйте aleks2.

Спасибо, что откликнулись на мою просьбу.
Я немного почерпнул полезного из Вашего ответа.
Будьте добры ответить еще на пару вопросов.

aleks2
Считать ты не умеешь. И о нормальных формах - не ведаешь.


Разъясните , пожалуйста, ваше видение.
Почему я не умею считать?
И что можно нормализовать?

aleks2
Мне важно это узнать, т.к. мне понравился Ваш подход к решению задачи.

И еще последний вопрос. То что в цикле уменьшилось кол-во операций - это несомненно плюс и производительность вырастет.
А скажите можно ли вообще избавиться от построчного перебора. Если да, может быть у Вас есть ссылка на статью по данной теме.
Просто очень хочется разобраться.

Спасибо.
20 сен 13, 11:23    [14862893]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, избавиться от курсора.  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Можно одним рекурсивным запросом. Для 2005-го и выше.

DECLARE @Games TABLE(npp int,npp1 int,npp2 int,plr1 VARCHAR(4),plr2 VARCHAR(4),points1 int,points2 int)

INSERT INTO @Games(npp,npp1,npp2,plr1,plr2,points1,points2)
SELECT 1,0,0,'Петя','Коля',0,0
UNION ALL
SELECT 2,0,0,'Вася','Витя',0,0
UNION ALL
SELECT 3,2,1,'Вася','Петя',0,0
UNION ALL
SELECT 4,1,2,'Коля','Витя',0,0
UNION ALL
SELECT 5,0,3,'Толя','Вася',0,0
UNION ALL
SELECT 6,4,4,'Коля','Витя',0,0
UNION ALL
SELECT 7,5,6,'Вася','Коля',0,0
UNION ALL
SELECT 8,3,5,'Петя','Толя',0,0
UNION ALL
SELECT 9,8,6,'Петя','Витя',0,0
UNION ALL
SELECT 10,7,9,'Вася','Витя',0,0


;with q as (
select cast((select cast(plr1 as char(4))+cast(plr2 as char(4)) from @Games order by npp for xml path('')) as varchar(8000)) n,
		cast((select cast(s as char(4))+'    10' from (select plr1 s from @Games union select plr2 from @Games)t for xml path('')) as varchar(8000)) s
union all
select substring(n,9,8000), stuff(s,s1+4,6,str(v,6))
from q 
outer apply (select substring(n,1,4) n1, substring(n,5,4) n2)t
outer apply (select charindex(n1,s) s1, charindex(n2,s) s2)tt
outer apply (select cast(substring(s,s1+4,6) as int)+cast(substring(s,s2+4,6) as int) v)ttt
where n>''
),
p as (select substring(s,1,4)nam, cast(substring(s,5,6) as int)val, substring(s,11,8000)s 
from q 
where n=''
union all
select substring(s,1,4), cast(substring(s,5,6) as int), substring(s,11,8000)
from p
where s>''
)
select nam, val 
from p 
order by val desc
20 сен 13, 12:33    [14863456]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, избавиться от курсора.  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
сдается мне что в 2012 данная задача решается очень просто с sum() over (partiton by plr1 order by npp ) . жаль проверить не могу
20 сен 13, 13:26    [14863885]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, избавиться от курсора.  [new]
orrery
Member

Откуда:
Сообщений: 7
Клас Anddros.
Вот при решении таких задач у меня мозги настроены на построчный анализ. К сожалению(((

Я решил посмотреть что возвращает "CTE q"

DECLARE @Games TABLE(npp int,npp1 int,npp2 int,plr1 VARCHAR(4),plr2 VARCHAR(4),points1 int,points2 int)

INSERT INTO @Games(npp,npp1,npp2,plr1,plr2,points1,points2)
SELECT 1,0,0,'Петя','Коля',0,0
UNION ALL
SELECT 2,0,0,'Вася','Витя',0,0
UNION ALL
SELECT 3,2,1,'Вася','Петя',0,0
UNION ALL
SELECT 4,1,2,'Коля','Витя',0,0
UNION ALL
SELECT 5,0,3,'Толя','Вася',0,0
UNION ALL
SELECT 6,4,4,'Коля','Витя',0,0
UNION ALL
SELECT 7,5,6,'Вася','Коля',0,0
UNION ALL
SELECT 8,3,5,'Петя','Толя',0,0
UNION ALL
SELECT 9,8,6,'Петя','Витя',0,0
UNION ALL
SELECT 10,7,9,'Вася','Витя',0,0


;with q as (
select cast((select cast(plr1 as char(4))+cast(plr2 as char(4)) from @Games order by npp for xml path('')) as varchar(8000)) n,
		cast((select cast(s as char(4))+'    10' from (select plr1 s from @Games union select plr2 from @Games)t for xml path('')) as varchar(8000)) s
union all
select substring(n,9,8000), stuff(s,s1+4,6,str(v,6))
from q 
outer apply (select substring(n,1,4) n1, substring(n,5,4) n2)t
outer apply (select charindex(n1,s) s1, charindex(n2,s) s2)tt
outer apply (select cast(substring(s,s1+4,6) as int)+cast(substring(s,s2+4,6) as int) v)ttt
where n>''
)
select * 
from q


ПетяКоляВасяВитяВасяПетяКоляВитяТоляВасяКоляВитяВасяКоляПетяТоляПетяВитяВасяВитя Вася 10Витя 10Коля 10Петя 10Толя 10
ВасяВитяВасяПетяКоляВитяТоляВасяКоляВитяВасяКоляПетяТоляПетяВитяВасяВитя Вася 10Витя 10Коля 10Петя 20Толя 10
ВасяПетяКоляВитяТоляВасяКоляВитяВасяКоляПетяТоляПетяВитяВасяВитя Вася 20Витя 10Коля 10Петя 20Толя 10
КоляВитяТоляВасяКоляВитяВасяКоляПетяТоляПетяВитяВасяВитя Вася 40Витя 10Коля 10Петя 20Толя 10
ТоляВасяКоляВитяВасяКоляПетяТоляПетяВитяВасяВитя Вася 40Витя 10Коля 20Петя 20Толя 10
КоляВитяВасяКоляПетяТоляПетяВитяВасяВитя Вася 40Витя 10Коля 20Петя 20Толя 50
ВасяКоляПетяТоляПетяВитяВасяВитя Вася 40Витя 10Коля 30Петя 20Толя 50
ПетяТоляПетяВитяВасяВитя Вася 70Витя 10Коля 30Петя 20Толя 50
ПетяВитяВасяВитя Вася 70Витя 10Коля 30Петя 70Толя 50
ВасяВитя Вася 70Витя 10Коля 30Петя 80Толя 50
Вася 80Витя 10Коля 30Петя 80Толя 50


В связи с этим вопрос. А если записей не 10 а 300К, можно ли применять такой подход или же решение от aleks2 с использованием цикла "while @i<=@npp" будет выполняться быстрее.

Спасибо.
20 сен 13, 16:20    [14864838]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, избавиться от курсора.  [new]
orrery
Member

Откуда:
Сообщений: 7
Клас Anddros.
Вот при решении таких задач у меня мозги настроены на построчный анализ. К сожалению(((

Я решил посмотреть что возвращает "CTE q"

DECLARE @Games TABLE(npp int,npp1 int,npp2 int,plr1 VARCHAR(4),plr2 VARCHAR(4),points1 int,points2 int)

INSERT INTO @Games(npp,npp1,npp2,plr1,plr2,points1,points2)
SELECT 1,0,0,'Петя','Коля',0,0
UNION ALL
SELECT 2,0,0,'Вася','Витя',0,0
UNION ALL
SELECT 3,2,1,'Вася','Петя',0,0
UNION ALL
SELECT 4,1,2,'Коля','Витя',0,0
UNION ALL
SELECT 5,0,3,'Толя','Вася',0,0
UNION ALL
SELECT 6,4,4,'Коля','Витя',0,0
UNION ALL
SELECT 7,5,6,'Вася','Коля',0,0
UNION ALL
SELECT 8,3,5,'Петя','Толя',0,0
UNION ALL
SELECT 9,8,6,'Петя','Витя',0,0
UNION ALL
SELECT 10,7,9,'Вася','Витя',0,0


;with q as (
select cast((select cast(plr1 as char(4))+cast(plr2 as char(4)) from @Games order by npp for xml path('')) as varchar(8000)) n,
		cast((select cast(s as char(4))+'    10' from (select plr1 s from @Games union select plr2 from @Games)t for xml path('')) as varchar(8000)) s
union all
select substring(n,9,8000), stuff(s,s1+4,6,str(v,6))
from q 
outer apply (select substring(n,1,4) n1, substring(n,5,4) n2)t
outer apply (select charindex(n1,s) s1, charindex(n2,s) s2)tt
outer apply (select cast(substring(s,s1+4,6) as int)+cast(substring(s,s2+4,6) as int) v)ttt
where n>''
)
select * 
from q


ПетяКоляВасяВитяВасяПетяКоляВитяТоляВасяКоляВитяВасяКоляПетяТоляПетяВитяВасяВитя Вася 10Витя 10Коля 10Петя 10Толя 10
ВасяВитяВасяПетяКоляВитяТоляВасяКоляВитяВасяКоляПетяТоляПетяВитяВасяВитя Вася 10Витя 10Коля 10Петя 20Толя 10
ВасяПетяКоляВитяТоляВасяКоляВитяВасяКоляПетяТоляПетяВитяВасяВитя Вася 20Витя 10Коля 10Петя 20Толя 10
КоляВитяТоляВасяКоляВитяВасяКоляПетяТоляПетяВитяВасяВитя Вася 40Витя 10Коля 10Петя 20Толя 10
ТоляВасяКоляВитяВасяКоляПетяТоляПетяВитяВасяВитя Вася 40Витя 10Коля 20Петя 20Толя 10
КоляВитяВасяКоляПетяТоляПетяВитяВасяВитя Вася 40Витя 10Коля 20Петя 20Толя 50
ВасяКоляПетяТоляПетяВитяВасяВитя Вася 40Витя 10Коля 30Петя 20Толя 50
ПетяТоляПетяВитяВасяВитя Вася 70Витя 10Коля 30Петя 20Толя 50
ПетяВитяВасяВитя Вася 70Витя 10Коля 30Петя 70Толя 50
ВасяВитя Вася 70Витя 10Коля 30Петя 80Толя 50
Вася 80Витя 10Коля 30Петя 80Толя 50


В связи с этим вопрос. А если записей не 10 а 300К, можно ли применять такой подход или же решение от aleks2 с использованием цикла "while @i<=@npp" будет выполняться быстрее.

Спасибо.
20 сен 13, 16:23    [14864864]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, избавиться от курсора.  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
на больших обьемах данных первое решение будет быстрее второго. Я решал подобную задачу, сложилось впечатление что в первом случае время выполнения линейно зависит от количества записей, во втором экспоненциально.
20 сен 13, 16:49    [14865053]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, избавиться от курсора.  [new]
Anddros
Member

Откуда:
Сообщений: 1077
orrery
В связи с этим вопрос. А если записей не 10 а 300К, можно ли применять такой подход или же решение от aleks2 с использованием цикла "while @i<=@npp" будет выполняться быстрее.

Работа со строковыми функциями замедляется с увеличением длины строки линейно. Это при строках до 8000 символов. А вот если в 8000 не влезает и приходится использовать varchar(max), то уже идут капитальные тормоза. Особенно это проявляется в подобных рекурсивных запросах, когда серверу приходится не только читать данные из длинных строк, но и записывать в них.

Так что на больших объемах этот способ использовать не стоит.
21 сен 13, 21:23    [14867956]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, избавиться от курсора.  [new]
Александр Бердышев
Member

Откуда: Санкт-Петербург
Сообщений: 396
orrery
Здравствуйте коллеги.

Уже несколько дней оптимизирую скрипт. Я не могу избавится от курсора. Пробовал через CTE, но не получилось.
Помогите, пожалуйста, решить данную задачу не прибегая к курсорам.
Постараюсь подробно описать задачу.

Предметная область.
Допустим прошел турнир по шашкам на призы "Деда мороза".
а) В начале турнира у каждого участника есть по 10 очков.
б) После каждой игры победителю начисляется столько очков, сколько было у проигравшего.
в) Победитель записан в поле "plr1"

Необходимо каждому игроку подсчитать кол-во заработанных очков. И выявить победителя.

--Таблица @Games - Состоявшиеся игры
--npp Номер игры по-порядку
--npp1 Номер последней игры "Участника1" (ссылается на поле npp)
--npp2 Номер последней игры "Участника2" (ссылается на поле npp)
--plr1 Имя "Участника1"
--plr2 Имя "Участника2"
--points1 Очки "Участника1"
--points2 Очки "Участника2"

Спасибо.


Подсчитываем кол-во очков:

SELECT plr, s_all = SUM(s)
(SELECT plr = plr1, s = SUM(points1)
FROM @Games 
GROUP BY plr1
UNION
SELECT plr = plr2, s = SUM(points2)
FROM @Games 
GROUP BY plr2) T
GROUP BY plr
24 сен 13, 15:46    [14878136]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, избавиться от курсора.  [new]
Александр Бердышев
Member

Откуда: Санкт-Петербург
Сообщений: 396
Александр Бердышев
orrery
Здравствуйте коллеги.

Уже несколько дней оптимизирую скрипт. Я не могу избавится от курсора. Пробовал через CTE, но не получилось.
Помогите, пожалуйста, решить данную задачу не прибегая к курсорам.
Постараюсь подробно описать задачу.

Предметная область.
Допустим прошел турнир по шашкам на призы "Деда мороза".
а) В начале турнира у каждого участника есть по 10 очков.
б) После каждой игры победителю начисляется столько очков, сколько было у проигравшего.
в) Победитель записан в поле "plr1"

Необходимо каждому игроку подсчитать кол-во заработанных очков. И выявить победителя.

--Таблица @Games - Состоявшиеся игры
--npp Номер игры по-порядку
--npp1 Номер последней игры "Участника1" (ссылается на поле npp)
--npp2 Номер последней игры "Участника2" (ссылается на поле npp)
--plr1 Имя "Участника1"
--plr2 Имя "Участника2"
--points1 Очки "Участника1"
--points2 Очки "Участника2"

Спасибо.


Подсчитываем кол-во очков:

SELECT plr, s_all = SUM(s)
(SELECT plr = plr1, s = SUM(points1)
FROM @Games 
GROUP BY plr1
UNION
SELECT plr = plr2, s = SUM(points2)
FROM @Games 
GROUP BY plr2) T
GROUP BY plr

Извиняюсь, гоню - не дочитал условие.
24 сен 13, 15:48    [14878159]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить