IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   MSSQL. Stored procedures (http://www.imho.ws/showthread.php?t=86786)

TRiPLE 01.06.2005 16:00

MSSQL. Stored procedures
 
Тут такая проблемка. Есть сабжевый сервер. Через Enterprise Manages создал там процедуру для базы. Обозвал, допустим, GetTotalTime. В процедуре три параметра. Проверку она прошла и сохранилась.
Теперь вот пытаюсь использовать её, а мне queryBuilder отвечает, что неизвестная процедура и все тут. Может, я что-то не так делаю с её вызовом? Первый раз пользую процедуры, так что не до конца понимаю суть проблемы... Уже битый час читаю хелп и книжку.
Примерный текст:
Код:

CREATE PROCEDURE dbo.GetTotalTime
(
@ID int,
@MinDate smalldatetime,
@MaxDate smalldatetime
)
AS
...

Вывзываю примерно так:
Код:

GetTotalTime(MWDB.ID,DATEADD(Mm,-1,GETDATE()),DATEADD(Dd,-1,GETDATE()))
Чё делать?

ЕЖ 01.06.2005 16:42

Обычно пишут так:
EXEC <имя процедуры> <параметры>
Всё через пробелы.

Ещё проверь в Query Analyzer в верху в выпадающем списке чтобы была твоя база, а не какая-нибудь master.

Почитай Book Online, там всё хорошо описано.

knight 02.06.2005 17:00

Также можно написать так:
use имя_базы
exec имя_процедуры аргументы

Где имя_базы это та база где должна храниться процедура

Dolphin_spb 10.06.2005 11:42

Цитата:

Сообщение от TRiPLE
Тут такая проблемка. Есть сабжевый сервер. Через Enterprise Manages создал там процедуру для базы. Обозвал, допустим, GetTotalTime. В процедуре три параметра. Проверку она прошла и сохранилась.
Теперь вот пытаюсь использовать её, а мне queryBuilder отвечает, что неизвестная процедура и все тут. Может, я что-то не так делаю с её вызовом? Первый раз пользую процедуры, так что не до конца понимаю суть проблемы... Уже битый час читаю хелп и книжку.
Примерный текст:
Код:

CREATE PROCEDURE dbo.GetTotalTime
(
@ID int,
@MinDate smalldatetime,
@MaxDate smalldatetime
)
AS
...

Вывзываю примерно так:
Код:

GetTotalTime(MWDB.ID,DATEADD(Mm,-1,GETDATE()),DATEADD(Dd,-1,GETDATE()))
Чё делать?

Да млин нельзя в параметры процедуры вставлять системыные функции!!!
надо типа так:
use [<Имя базы>]
go
declare @datenow smalldatetime
set @datenow = getdate()

exec dbo.GetTotalTime(MWDB.ID,DATEADD(Mm,-1,@datenow),DATEADD(Dd,-1,@datenow))

Kvarx 10.04.2007 13:24

Мне по курсовику надо написать много триггеров для MSSQL Server 2005 EE. Начал с самого простого, но не получается. Есть табличка:
Код:

CREATE TABLE [dbo].[articles](
        [iid] [int] IDENTITY(1,1) NOT NULL,
        [name] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
(

А триггер такой написал:
Код:

CREATE TRIGGER trigger1 ON dbo.articles
AFTER INSERT
AS
DECLARE @article_id int
select @article_id = 0
SELECT TOP 1 @article_id = A.iid FROM dbo.articles A, inserted i WHERE A.name = i.name
IF @article_id > 0
BEGIN
        RAISERROR ('MyError', 16,1)
        ROLLBACK TRANSACTION
END
GO

Чтоб одинаковые строки не добавлять. Он срабатывает теперь для любого инсерта.

Gunslinger 12.04.2007 20:35

Kvarx, так как инсерт уже произошел, то @article_id у тебя будет всегда равна только что вставленой записи.
Если надо обезательно триггером, то исспользуй INSTEAD OF INSERT, и сам вручную вставляй после проверки.
Ну а если по доброму это делать, то надо уникальный индекс построить по полю name без всяких триггеров :)

Kvarx 12.04.2007 21:54

Цитата:

Сообщение от Gunslinger (Сообщение 1391882)
Ну а если по доброму это делать, то надо уникальный индекс построить по полю name без всяких триггеров

Я б тоже так сделал, но структура базы задана преподом.

Разобрался с триггерами, сделал вот так:
Код:

ALTER TRIGGER [dbo].[trigger1] ON [dbo].[articles]
AFTER INSERT
AS
DECLARE @rowcount int
select @rowcount = 0
SELECT @rowcount = COUNT(A.iid) FROM dbo.articles A, inserted i WHERE A.name = i.name
IF @rowcount != 1
BEGIN
        RAISERROR ('MyError 50001. Article already exists.', 16, 1)
        ROLLBACK TRANSACTION
END

Теперь другой вопрос:
1) Вроде из процедуры можно вернуть значение только целого типа. Но в задании надо как-то вернуть строку, а в другом целых два значения :idontnow:
2) И можно ли передать как параметр массив значений?

Gunslinger 13.04.2007 16:30

Цитата:

Сообщение от Kvarx (Сообщение 1391927)
1) Вроде из процедуры можно вернуть значение только целого типа. Но в задании надо как-то вернуть строку, а в другом целых два значения

Так можно сделать:
Код:

CREATE PROCEDURE p_test_s

AS
        DECLARE @arg1 int
        set @arg1 = 1

        DECLARE @arg2 nvarchar(256)
        set @arg2 ='string here'

        select @arg1, @arg2
GO

Цитата:

Сообщение от Kvarx (Сообщение 1391927)
2) И можно ли передать как параметр массив значений?

Почитай тут:
http://www.sql.ru/subscribe/2003/146.shtml#9

Лично мне было нужно только несколько раз, я исспользовал строку, которую потом парсил и составлял из нее таблицу.

Kvarx 27.04.2007 01:11

Gunslinger,
Очень помогло :yees:

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

Сам нашел обсуждение на эту тему:
_http://www.sql.ru/forum/actualthread.aspx?tid=10801&hl=%f2%f0%e8%e3%e3%e5%f0%fb

Hubbitus 10.05.2007 20:32

Цитата:

Сообщение от Kvarx (Сообщение 1399485)
Не подскажешь, почему триггеры в реальных проектах не особо применяются? И чем они заменяются?

Почему, применяются. Я и в реальных применяю, когда надо. Прежде всего, применяю их какраз для денормализации БД, и поддержки целостности данных.
Часто (в достаточно простых случаях правда) заменить можно ограничениями на значения и модификацией данных только из хранимых процедур, с проверками в них.


Часовой пояс GMT +4, время: 18:06.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.