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

Откуда:
Сообщений: 101
Здравствуйте, нужна помощь в создании хранимой процедуры. Я только начала изучать SQL. Многие вещи мне неизвестны или непонятны.
1)На данном этапе мне нужно сделать с помощью хранимой процедуры фильтрацию данных поля со списком. Сложность заключается в том , что выборка должна быть осуществлена по двум параметрам из двух разных таблиц. Т.е. имеется таблица main, в ней данные из таблиц A, B, C. Пользователь выбрал данные A, автоматически отфильтровались по ее характеристикам данные B и C (Это я сделала.), также выбрал B или/и С отфильтровалось A. Но вот если я сначала выбираю B (A отфильтруется), затем выберу C. A будет выбрано только по параметру C. Мне нужно или сделать хранимую процедуру с выборкой по уже выбранным параметрам, или же сделать 2 условия в одной процедуре. И с тем и с другим у меня проблема.Подскажите как это можно осуществить.
2) В каждой форме у каждой записи есть кнопка "+". По нажатию на нее соответствующая запись должна добавляться в корзину. как просто добавить запись я знаю. Но сложность в том, что мне нужно использовать конкатенацию. Т.е. все необходимые поля должны объединиться и добавиться в корзину в поле "Инфо". Пробовала сразу в Insert в values прописать Concat(), но выдает ошибку.
3) Еще одна сложность. По нажатию на кнопку "+" количество выбранного товара не уменьшается т.к. человек, просто выбрал товар, но не купил его. А уже в корзине по нажатию кнопки "Оформить заказ" количество должно уменьшиться. Но я уже потеряю информацию о товаре, т.к. буду использовать конкатенацию. Можно ли использовать какие-либо глобальные переменные в T-SQL, чтобы переменная была доступна во всех процедурах? Или это можно осуществить как-то по-другому?
22 май 11, 11:20    [10690173]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
1. Пойдите на курсы основ СУБД и основы программирования. Лекции на форуме не проводятся - преследуется по закону.
2. По правилам форума вы должны представить хоть какие-то скрипты. В добавок вопросы 2 и 3 непонятны совсем.
3. В SQL никакой кнопки "+ в корзину" нет. Здесь обсуждается только MS SQL.
22 май 11, 12:55    [10690336]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Proggirl
Member

Откуда:
Сообщений: 101
Я и не имела ввиду , что кнопка есть в SQL. Формы реализованы через ACCES, но это не имеет никакого значения, т.к. хранимые процедуры все равно пишутся через SQL.
1)
Create procedure SP_primer
as
select *
from S_B
where sock=b.sock and ram=c.ram
пробовала по-разному. выдает ошибку.
2)
корзина - это таблица. в нее мне нужно добавить запись.
Insert into basket (info,price) values (Concat(manufacturer, model), price)
я знаю, что это не правильно. вот и хочу выяснить как правильно...
3) Можно ли присвоить значение переменной в одной процедуре, а в другой прочитать это значение?
22 май 11, 14:17    [10690445]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Proggirl
1)пробовала по-разному. выдает ошибку.
Ага, мы должны догадываться.
1. Вы слово JOIN знаете?
2. Вы слово VIEW знаете?
А без них никак. Почитайте основы.
3. Несколько раз прочитал первый пункт - многа букав, ниасилил. Дам ссылку которую вы видите каждый раз во время набора поста.
Нужны скрипты таблиц и тестовые данные. И результат который хотите.
Как я понял, вы должны написать представление из этих 2х таблиц, а потом написать запрос к нему, но может быть и по другому, ибо может быть всё что угодно у вас там. Нужны скрипты.

Proggirl
2) Concat(manufacturer, model)
Вы имели ввиду это?:
DECLARE	 @Var1	VarChar(50) = 'A'
	,@Var2	VarChar(50) = 'B'
SELECT	 'Prefix' + 'Sufix'
	,@A + @B
Перед использованием какого либо продукта ознакомьтесь с базовыми элементами:
Операторы (Transact-SQL)
Функции (Transact-SQL)
Привыкайте читать BOL, как это делают все, особенно спецы.

Proggirl
3) Можно ли присвоить значение переменной в одной процедуре, а в другой прочитать это значение?
Глобальных переменных нет. В современных языках и подавно. Эту вредную школьную привычку забудьте.
Вы должны почувствовать реляционное декларативное программирование. Здесь не должно быть никаких последовательностей действий.

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

select *
from S_B
where sock=b.sock and ram=c.ram
Не вижу таблиц для алиасов b и c. Пишите всегда алиасы к таблицам (и не потому что удобнее) и не забывайте писать схему (dbo. коль пока она у вас одна)
22 май 11, 21:41    [10691126]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
Или это можно осуществить как-то по-другому?


Да, тысячу раз - да. Можно для начала завести бой-френда программиста требуемой Вам специализации.
22 май 11, 21:47    [10691148]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Proggirl
Member

Откуда:
Сообщений: 101
Спасибо за ссылки.
1)Я наверно все таки плохо объяснила.Простите - филолог из меня б не получился...
Есть таблицы
Сборка компьютера:
CREATE TABLE Assemble_PC
([ID]	                int    NOT NULL	,
SystemBoard     int 	NOT MULL,
CPU                  int     NOT NULL,
RAM                 int     NOT NULL,
...
Price                int,
CONSTRAINT Assemble_PC_Pk PRIMARY KEY ([ID]))
Все поля - Внешние ключи.Они не могут быть нулевыми, я правильно поняла?
Материнские платы:
create table SystemBoard
(
[ID]                  int          NOT NULL,
Manufacturer  char[50],
Model             char[50],
Socket            tinyint    NOT NULL,
RAM_Type       tinyint   NOT NULL,
...
count              int,
Price               int,
Constraint      SystemBoard_PK primary key ([ID]))
Socket и RAM_Type подставляются из соответствующих таблиц типа ID tinyint, type char [20].

процессоры:

create table Processor
(
[ID]               int         NOT NULL,
Manufacturer char[50],
Model            char [50],
...
Socket           tinyint    NOT NULL,
count             int,
Price              int,
Constraint     Processor_PK primary key([ID]))    
Оперативная память:
create table RAM(
[ID]              int    NOT NULL,
Manufacturer  char[50] ,
Model             char [50] ,
...
RAM_Type     tinyint    NOT NULL,
count             int,
price              int,
Constraint      RAM_PK primary key ([ID]))

В Accese в форме Assemble_PC при выборе процессора с 775 сокетом материнские платы будут показываться только с 775 сокетом.
Если после выбора процессора выбрать оперативку например DDR2, то будет показываться все мат.платы с DDR2, а про 775 сокет забудится. Для этого мне нужно написать хранимую процедуру. Что я пыталась сделать выше.
2)в Accese в формах SystemBoard, Processor, RAM у каждой записи будет кнопка. По нажатию на кнопку эта запись должна добавиться в таблицу Basket:
create table basket(
[ID]     int    NOT NULL,
info      char [200],
price     int,
constraint Basket_PK primary key ([ID])
в info должно будет добавиться все о товаре кроме цены и количества, ну и ID. Для этого я и пыталась сделать конкатенацию.
3)Count не уменьшается по нажатию на кнопку"+".
В форме Basket есть кнопка "Оформить заказ". по ее нажатию таблица basket должна скопироваться в таблицу Sale, count у соответствующего товара должно уменьшиться на соответствующее число, а сама таблица Basket очиститься.
Вопрос в том, как мне запомнить ID выбранного товара на этапе добавления в корзину, а уменьшить count на этапе добавление в Sale.
23 май 11, 07:55    [10692091]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
iljy
Member

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

по поводу процедуры - https://www.sql.ru/faq/faq_topic.aspx?fid=114.
В таблицу Basket надо сохранять не текст, а идентификаторы. Т.е. таблица должна быть примерно такая:
create table basket(
IDOrder     int    NOT NULL, -- или ID_User, как удобнее идентифицировать заказ
GoodsType int, -- Тип заказанного товара - плата, камень, мозги, etc.
GoodsID int,    -- Идентификатор из соответствующей таблицы
Quantity int,   -- Количество
)
Остальное по желанию.
23 май 11, 09:11    [10692261]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
iljy, да но так FK не повесишь.

Коль для каждого вида товара есть отдельная табла, то стоит продолжать в этом направлении:
CREATE TABLE [dbo].[Order] (
	 ID		Int		PRIMARY KEY
	,[Date]		DateTime	NOT NULL
	 CONSTRAINT [DF_Date]	DEFAULT (GetDate())
	,[Session]	?
-- или
	,[User]		Int	+ FK на пользователя
	...
	,[Paid]		Money		    NULL
)
GO
CREATE TABLE [dbo].[OrderProcessor] (
	 [Order]	Int	NOT NULL
	 FOREIGN KEY [FK_OrderProcessor] REFERENCES [dbo].[Order](ID)
	,[Processor]	Int	NOT NULL
	 FOREIGN KEY [FK_ProcessorOrder] REFERENCES [dbo].[Processor](ID)
	,[Count]	SmallInt	NOT NULL
	,PRIMARY KEY [PK_OrderProcessor]
		 [Order]
		,[Processor]
	)
)
GO
CREATE TABLE [dbo].[OrderRAM] (
	 [Order]	Int	NOT NULL
	 FOREIGN KEY [FK_OrderRAM] REFERENCES [dbo].[Order](ID)
	,[RAM]		Int	NOT NULL
	 FOREIGN KEY [FK_RAMOrder] REFERENCES [dbo].[RAM](ID)
	,[Count]	SmallInt	NOT NULL
	,PRIMARY KEY [PK_OrderRAM]
		 [Order]
		,[Processor]
	)
)
...
Иначе выглядит ни рыба ни мясо. Подходы лучше не смешивать.
Искать соответственно:
SELECT	...
FROM	          dbo.[Order]		O
	LEFT JOIN dbo.OrderProcessor	P ON P.[Order] = O.ID
	LEFT JOIN dbo.OrderRAM		R ON R.[Order] = O.ID
	...
WHERE	    ...
--	AND O.[User]	= @User
--	AND O.[Paid]	IS NULL
	AND(P.Processor	= @Processor	OR @Processor	IS NULL)
	AND(R.RAM	= @RAM		OR @RAM		IS NULL)
23 май 11, 12:02    [10693271]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Proggirl
Member

Откуда:
Сообщений: 101
Спасибо за помощь. 3-я проблема решена. Просто буду хранить ID и название таблицы в корзине.
Почитала ссылки, все равно ничего у меня с первым не получается.
я сделала одиночную выборку когда выбирают сначала оперативку, затем мат.плату:
create procedure SystemBoard_RAM
@RAM_Type int,
as
Select *
from SystemBoard
where RAM_Type=@RAM_Type
Так все работает. Как я понимаю засчет того, что я эту процедуру подключаю к оперативке.когда я ее выбираю, фильтруется мат.плата.@RAM_Type int определяется тоже засчет этого. Но ведь мне нужно 2 инфы из 2 разных таблиц, т.е.
create procedure SystemBoard_RAM_CPU
@RAM_Type int,
@Socket
as
Select *
from SystemBoard
where RAM_Type=@RAM_Type
and Socket=@Socket
не проканает.
когда пытаюсь так:
Create procedure SystemBoard_RAM_CPU
as
Select *
from SystemBoard
where RAM_Type=dbo.RAM.RAM_Type
and Socket=dbo.Processor.Socket
выдает ошибку. Подскажите как мне обратиться к этим полям, чтобы все получилось. может мне сделать отдельно все. Могу ли я в Fromе вызвать другую хранимую процедуру?тогда я б смогла выбрать из выбранного.
23 май 11, 16:37    [10695539]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Proggirl
CREATE PROCEDURE [dbo].[spSystemBoard_RAM_CPU]
	 @RAM_Type	Int
	,@Socket	Int
AS BEGIN
	SELECT *
	FROM	dbo.SystemBoard
	WHERE	    RAM_Type	= @RAM_Type
		AND Socket	= @Socket
END
GO
не проканает.
Так и пишет "на канает"? Может просто нет материнки с такой комбинацией?

Proggirl
Но ведь мне нужно 2 инфы из 2 разных таблиц, т.е.
Т.е. сделать два раза SELECT ?
Или UNION ALL?

Изучайте! А не убегайте от этого.
SELECT	*
FROM	     dbo.SystemBoard	M
	JOIN dbo.Processor	P ON P.Socket	= M.Socket
	JOIN dbo.RAM		R ON R.RAM_Type	= M.RAM_Type
WHERE	    P.Manufacturer = 'Intel'
	AND R.Manufacturer = 'Kingston'
Только подставьте имеющиеся данные.
И поменяйте Char на VarChar. Анахронизм какой-то.
И процедуры кстати тут не причём, можно и без них запросы писать.
23 май 11, 20:52    [10696826]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Proggirl
Member

Откуда:
Сообщений: 101
Я совсем дура...как я могла забыть begin/end. спасибо вам огромное:) Только вот я там понатыкала, что теперь в Accese не хочет работать, хотя раньше работало. Буду разбираться. Может быть когда нибудь выучу SQL.
23 май 11, 21:14    [10696887]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Proggirl
Member

Откуда:
Сообщений: 101
Насчет конкатенации, я так и поняла.
мне все таки она понадобится.
Concat(Manufacturer, Model)
не правильно.
Concat([dbo].[Manufacturer], [dbo].[Model])
? и можно ли писать
Insert into basket (info) values(Concat([dbo].[Manufacturer], [dbo].[Model])
23 май 11, 21:38    [10696964]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Proggirl
Concat
10691126
23 май 11, 23:27    [10697340]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Proggirl
Insert into basket (info) values(Concat([dbo].[Manufacturer], [dbo].[Model])
INSERT	dbo.Basket (Info)
SELECT	M.Manufacturer + ' ' + M.Model
FROM	     dbo.SystemBoard	M
--	JOIN dbo.Processor	P ON P.Socket	= M.Socket
--	JOIN dbo.RAM		R ON R.RAM_Type	= M.RAM_Type
--WHERE	...
23 май 11, 23:33    [10697360]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Proggirl
Я совсем дура...как я могла забыть begin/end. спасибо вам огромное:)
А что там за проблема с BEGIN/END?
Где забыли-то? Не вижу ни одного места, где нужны эти ключевые слова.
24 май 11, 10:00    [10698228]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Proggirl
Member

Откуда:
Сообщений: 101
iap
Где забыли-то? Не вижу ни одного места, где нужны эти ключевые слова.

CREATE PROCEDURE [dbo].[spSystemBoard_RAM_CPU]
	 @RAM_Type	Int
	,@Socket	Int
AS BEGIN
	SELECT *
	FROM	dbo.SystemBoard
	WHERE	    RAM_Type	= @RAM_Type
		AND Socket	= @Socket
END
GO
24 май 11, 14:22    [10700178]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Proggirl,

ну и тут-таки необязательно ставить begin end, если уберете - тоже будет работать.
24 май 11, 15:15    [10700643]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить