Member 13542464 Ответов: 3

Вызов процедуры SQL server для вставки значений еще для двух столбцов в SQL server 2014


Я пытаюсь создать единую хранимую процедуру SQL Server, в которую я могу ввести свои собственные " c_id` и `COST` вместе с моей ранее созданной хранимой процедурой SQL Server.

Мои таблицы выглядят следующим образом:

* ТВ1: а (распределения a_id (ПК), a_name, a_description, a_qh)
* ТВ2: переменного тока (ac_id (ПК), распределения a_id(ФК), основные достижения и итоговые документы(ФК), ac_cost)
* ТБ3: с (основные достижения и итоговые документы (ПК), c_name)

Моя ранее созданная процедура выглядит следующим образом:

** НОВЫЙ ОБНОВЛЕННЫЙ КОД:**

CREATE PROCEDURE test (@name char(30), @description varchar(255), @VEid INT, @Cost as int) as
    BEGIN
    	DECLARE @A_id INT
  		INSERT INTO a(a_Name,a_description) VALUES (@name,@Description )
		Select @A_id = a_ID from A where a_Name = @name               
    	 Insert into AC(cost, A_ID, C_ID)  values(@Cost, @A_id, @VEid) 
     END

Я хотел бы добавить, что моя таблица А имеет следующую информацию.

a_id   a_name  a_description
1       Pen    THIS IS PEN
2       pAPER   IT IS PAPAR
3       GLASS   IT IS gLASS
14      RUBBER   THIS IS RUBBR


Моя таблица с состоит из
c_id    c_name
1        name1
2        nam2
3       name3

Моя таблица переменного тока имеет следующую информацию
ac_id    cost     a_id  c_id
1	50.0000	   1	NULL
2	45.0000	   2	NULL
3	30.0000	   3	NULL
4	55.0000	   1	2
5	20.0000	  14	2
6	60.0000	   1	3
7	25.0000	  14	3


Обновлена таблица AC после выполнения нижеприведенного запроса
1	15.0000	1	NULL
2	15.0000	2	NULL
3	15.0000	3	NULL
4	55.0000	1	2
5	20.0000	14	2
6	60.0000	1	3
7	25.0000	14	3


Это не то, что я искал. Я пытался вставить новую строку со следующей информацией в ac tble
ac_id   cost      a_id    c_id
8       15      from a table   1

Заранее спасибо!

Что я уже пробовал:

Моя дилемма я новичок в SQL Server хранимые процедуры, и я пытаюсь вставить мой новый 'основные достижения и итоговые документы" и " Ас.стоимость вместе с a_name и a_description. Итак, если вы можете провести меня через объяснение . Это будет здорово.
После выполнения приведенного ниже кода мой

3 Ответов

Рейтинг:
22

RossMW

Попробуй

CREATE PROCEDURE AProduct (@name char(30), @description varchar(255), @C_id numeric(18,0), @Cost as int)) as
    BEGIN
    	DECLARE @A_id INT
  		UPDATE A SET a_description=@Description WHERE a_name = @name  -- Update the description field only. Not sure if required
		Select @A_id = a_id from A where a_name = @name                 -- Retrieve id of the row with the name equal to the parameter inserted. Could use scope identity but for simplicity I have not.
    	 Insert into AC (cost, a_id, c_id)  values(@Cost, @A_id, @C_id) -- Insert into AC table parameter cost and C_id and the A_id from line above.
   -- 	 Insert into AC (cost, a_id, c_id) output inserted.ac_id values(@Cost, @A_ID, @C_id) -- If required
     END


Я не проверял это, но надеюсь, что это то, что вы пытаетесь сделать.


Member 13542464

Росс благодарит за усилия. Хорошей новостью является то, что значения вставляются в таблицу A, которая является A_NAME и A_description. Однако. это не вставка в таблицу AC, где мне нужно вставить свою стоимость и a_id. Пожалуйста, смотрите выше код под названием "Новый обновленный код"

RossMW

Попробуйте просто запустить в sql, чтобы увидеть, что это за ошибки.. например

Declare @name char(30) = 'что-то'
Declare @description varchar(255) = 'что-то'
Declare @C_id numeric(18,0) = 1
Объявите @Cost как int = 55
Объявить @A_id INT
Обновите набор a_description=@Description, где a_name = @name
Выберите @распределения a_id = распределения a_id от куда a_name = @имя
Вставить в переменного тока (стоимости, распределения a_id, основные достижения и итоговые документы) значения(@стоимости, @распределения a_id, @основные достижения и итоговые документы)

Это базовые команды sql, поэтому, как только они работают в прямом sql, их можно поместить в хранимую процедуру по мере необходимости.

Member 13542464

Росс см. ниже код: все в порядке. Но is вставляет значения два раза вместо 1. Какая может быть причина ? Я хотел бы понять, что стол-это мой стол Произведения1, с моей таблицы поставщиков и переменного тока мой мост стол

DDeclare @name1 varchar(30) = 'черная шляпа'
Declare @description1 varchar(255) = 'sKKK'
Объявить @основные достижения и итоговые документы ИНТ = 1
Объявить @Cost1 int = 55
Объявить @A_id INT
Обновление ПРОИЗВЕДЕНИЯ1 набор характеристика намечаемой к выпуску=@описание1 где название = @ФИО1
Выберите @распределения a_id = Кодтовара от ПРОИЗВЕДЕНИЯ1 где название = @ФИО1
Вставить в VendorProduct(стоимость, Кодтовара, столбец vendorid) значения(@Затраты1, @распределения a_id, @основные достижения и итоговые документы)

Рейтинг:
2

RossMW

Если вы хотите добавить дополнительные параметры в хранимую процедуру, то просто добавьте их следующим образом

CREATE PROCEDURE AProduct (@name char(30), @description varchar(255), @C_id numeric(18,0), @Cost as int)) as
    BEGIN
    	DECLARE @PCount INT
    	DECLARE @vid as int
        SELECT @PCount = Count(A_ID) FROM A
    		WHERE a_Name= @name
    	IF @PCount=1
    	BEGIN
    		UPDATE A 
    		SET @name=A_Name,@description=A_Description
    		WHERE A_ID=1
    	END
    	Begin
    	 Update AC SET C_id=@C_ID,cost=@Cost WHERE AC_ID=1
    	END
    	Return SCOPE_IDENTITY()
    END


Затем вы можете использовать эти переменные в зависимости от того, что вы пытаетесь сделать в хранимой процедуре. Вам также нужно будет удалить объявление @C_id, так как оно уже определено в параметрах. Также в инструкции Update переменного тока изменяется таким образом, поля обновляются значения параметров.


Member 13542464

Привет, я попробовал выше код . В первый раз, когда он выполнялся, он затронул 3 строки, когда я попробовал во второй раз, он говорит: "процедура попыталась вернуть статус NULL, который не разрешен. Вместо этого будет возвращен статус 0". В чем может быть проблема ?
Заранее спасибо!

RossMW

Команда Return SCOPE_IDENTITY() возвращает идентификатор вставленной строки. Ваша процедура магазина пытается просто делать обновления. Поскольку я точно не знаю, чего вы пытаетесь достичь, я не могу прокомментировать, почему это было там в первую очередь. Попробуйте удалить его.

След и ошибка-ваш друг, если это не производственные данные.....

Member 13542464

Спасибо Росс, пожалуйста, смотрите мой обновленный вопрос для получения дополнительной информации.
Заранее спасибо!

RossMW

Какова связь таблицы с с другими таблицами? По-видимому, это не имеет никакой ценности.

Member 13542464

AC-это Мостовая таблица между A и C. Таким образом, A содержит информацию о продукте. C содержит информацию о поставщике, который продает продукты, и AC действует как мост, который включает стоимость продукта (проданного поставщиками, которые находятся в c)

Рейтинг:
0

Member 13542464

Ross Thanks for your effort and time. Actually I was bit confused, why would SQL INSERT values twice. Now It make sense. Because SQL is UPDATING/INSERTING values in A table then, It will insert produced a_id into AC table. So 2 rows will be affected.
Thanks again for help! I used below code:

<pre lang="SQL">CREATE PROCEDURE Test2 (@name varchar(30),@description varchar(255),@venid int,@cost int)
AS
BEGIN
DECLARE @bid int
INSERT INTO A (A_Name,A_Description) VALUES (@name,@description)
SET @bid =SCOPE_IDENTITY()
INSERT INTO AC(COST,C_ID,A_ID)
VALUES(@cost,@venid,@bid)