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

Откуда: Киев
Сообщений: 1387
Помогите пжлста нормально написать хранимую процедуру.

Знаю задача детская но...

Суть вопроса

Есть сайт там пользователи смотрят статьи, и вот мне надо сделать счетчик посещений.


create PROCEDURE Счетчик
@id int,
@count int

if (@id.Exist == true)
{
goto 1:
}
else
{
goto 2:
}
AS
BEGIN
1:
update dbo.Table set [count] = @count WHERE [id] = @id
2:
insert into dbo.Table ([count]) VALUES (@count)
DECLARE @id int
SET @id = scope_identity()
END

Вот проблемы с проверкой, я могу сделать это через linq(ASP.NET) но хотелось бы сделать через хранимую процедуру.

Спасибо.
22 июн 12, 10:11    [12757775]     Ответить | Цитировать Сообщить модератору
 Re: Простая хранимая процедура  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Не надо выдумывать свой синтаксис и все получится.
22 июн 12, 10:16    [12757809]     Ответить | Цитировать Сообщить модератору
 Re: Простая хранимая процедура  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
invm
Не надо выдумывать свой синтаксис и все получится.


А что я придумал?
22 июн 12, 10:24    [12757873]     Ответить | Цитировать Сообщить модератору
 Re: Простая хранимая процедура  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
VIT2708,
версия сервера? если > 2005,посмотрите merge.
22 июн 12, 10:30    [12757916]     Ответить | Цитировать Сообщить модератору
 Re: Простая хранимая процедура  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
denis2710
VIT2708,
версия сервера? если > 2005,посмотрите merge.


2008 R2 да вот и проблема что я умею создавать простые ХР а вот посложнее еще не научился.
22 июн 12, 10:39    [12758006]     Ответить | Цитировать Сообщить модератору
 Re: Простая хранимая процедура  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
VIT2708
invm
Не надо выдумывать свой синтаксис и все получится.


А что я придумал?
При попытке создания этой процедуры, сервер вам сам все расскажет.
22 июн 12, 10:48    [12758064]     Ответить | Цитировать Сообщить модератору
 Re: Простая хранимая процедура  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
VIT2708,
+ что-то в этом духе

alter procedure [dbo].[zz_Xlam] @id int out, @count int
as 
begin

  set NOCOUNT on ;
  declare @t_out table ( id int ) ;
  merge dbo.[table] as target
    using 
      ( select  @id
              , @count
      ) as source ( id, count )
    on( target.id = source.id )
    when  matched 
      then 
        update
          set   count = source.count
    when not matched 
      then	
	    insert  ( id, count )
          values
              ( source.id
              , source.count
              )
    output
      inserted.id
      into @t_out ;
	     
  select  @id = id
  from    @t_out ;
	    
 
end

22 июн 12, 10:54    [12758104]     Ответить | Цитировать Сообщить модератору
 Re: Простая хранимая процедура  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
invm
VIT2708
пропущено...


А что я придумал?
При попытке создания этой процедуры, сервер вам сам все расскажет.


Так он и говорит что неправильный синтаксис. Вот я и попросил направить меня на путь истины так как я с него сбился.

PS: ну плохо я знаю язык запросов (пока что)
22 июн 12, 10:55    [12758128]     Ответить | Цитировать Сообщить модератору
 Re: Простая хранимая процедура  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
VIT2708,
Что мешает (если конечно же есть желание научиться) заглянуть в документацию, а не бежать на форум при первых же проблемах? Тем более, что русскоязычная документация уже 7 лет как есть.
22 июн 12, 11:07    [12758231]     Ответить | Цитировать Сообщить модератору
 Re: Простая хранимая процедура  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
denis2710
VIT2708,
+
+ что-то в этом духе

alter procedure [dbo].[zz_Xlam] @id int out, @count int
as 
begin

  set NOCOUNT on ;
  declare @t_out table ( id int ) ;
  merge dbo.[table] as target
    using 
      ( select  @id
              , @count
      ) as source ( id, count )
    on( target.id = source.id )
    when  matched 
      then 
        update
          set   count = source.count
    when not matched 
      then	
	    insert  ( id, count )
          values
              ( source.id
              , source.count
              )
    output
      inserted.id
      into @t_out ;
	     
  select  @id = id
  from    @t_out ;
	    
 
end



Спасибо сейчас буду изучать
22 июн 12, 11:07    [12758236]     Ответить | Цитировать Сообщить модератору
 Re: Простая хранимая процедура  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
invm
VIT2708,
Что мешает (если конечно же есть желание научиться) заглянуть в документацию, а не бежать на форум при первых же проблемах? Тем более, что русскоязычная документация уже 7 лет как есть.


Я просто не знал ключевого слова по какому искать вот вы подсказали я и нашел

[url=]http://sqlserverperformance.wordpress.com/2007/07/13/more-merge-examples-in-sql-server-2008/[/url]
22 июн 12, 11:12    [12758256]     Ответить | Цитировать Сообщить модератору
 Re: Простая хранимая процедура  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
denis2710,


USE tempdb
GO
IF OBJECT_ID ('dbo.Table') IS NOT NULL
	DROP TABLE dbo.[Table]
GO

IF OBJECT_ID ('proc_Counters') IS NOT NULL
	DROP PROCEDURE dbo.proc_Counters
GO

CREATE TABLE dbo.[Table]	(id INT, cnt BIGINT)

GO

CREATE PROCEDURE proc_Counters
(
@id INT = NULL
)
AS
BEGIN
	DECLARE @count BIGINT =0
	IF ((SELECT 1 FROM dbo.[Table] WHERE id=@id) IS NOT NULL)
	BEGIN
		UPDATE dbo.[Table]  SET cnt+=1 WHERE id=@id
	END 
	ELSE
	BEGIN
		INSERT INTO dbo.[Table] VALUES (isnull(@id,(select MAX(id)+1 from dbo.[Table])) ,1)
	END
END
GO


EXEC proc_Counters 3
GO
SELECT * FROM dbo.[Table]
GO

EXEC proc_Counters 1
GO
SELECT * FROM dbo.[Table]
GO

EXEC proc_Counters 3
GO
SELECT * FROM dbo.[Table]
GO

EXEC proc_Counters 3
GO
SELECT * FROM dbo.[Table]
GO

EXEC proc_Counters 
GO
SELECT * FROM dbo.[Table]
GO
22 июн 12, 11:32    [12758460]     Ответить | Цитировать Сообщить модератору
 Re: Простая хранимая процедура  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Andrey Sribnyak,
DECLARE @count BIGINT =0

это как я понимаю для эстетики?
IF ((SELECT 1 FROM dbo.[Table] WHERE id=@id) IS NOT NULL)

жесткий треш.
Про exists почитайте.
isnull(@id,(select MAX(id)+1 from dbo.[Table]))

@id это разве не ид статьи?
22 июн 12, 11:38    [12758549]     Ответить | Цитировать Сообщить модератору
 Re: Простая хранимая процедура  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
denis2710
Andrey Sribnyak,
[src]
isnull(@id,(select MAX(id)+1 from dbo.[Table]))

@id это разве не ид статьи?


Все правильно, если такой статьи нет, то мы добавляем запись с новой
23 июн 12, 21:55    [12765057]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить