Ссылочная вставка - хранимая процедура - SQL Server 2008 - PullRequest
0 голосов
/ 21 ноября 2011

Я работаю в .Net Application. Здесь, на моей странице aspx, у меня есть 3 вкладки (т.е. вкладка 1, вкладка 2, вкладка 3. Первая вкладка содержит некоторые элементы управления Textbox, вторая вкладка содержит некоторые элементы управления поля со списком и такая же, как третья вкладка содержит некоторые элементы управления. Я хочу сохранить все эти три элемента управления вкладками в ТРИ разных таблицах в базе данных SQL. Для этого должна использоваться только одна хранимая процедура. ПЕРВИЧНЫЙ КЛЮЧ ПЕРВОЙ таблицы должен быть сохранен во ВТОРОЙ и ТРЕТЬЕЙ таблице. (Как, ссылочная вставка). Вот мой ИП ...

ALTER PROCEDURE [dbo].[Insert]
(@Name NVARCHAR(50))        
 AS
BEGIN
SET NOCOUNT ON
DECLARE @TableOnePrimaryKey INT

BEGIN

INSERT INTO TABLEONE(Name)
VALUES (@Name)               

SELECT @TableOnePrimaryKey=@@IDENTITY
SELECT CAST(@@IDENTITY AS INT)

INSERT INTO TABLETWO(TableTwoIDColumn)
VALUES (@TableOnePrimaryKey) 

SELECT @TableOnePrimaryKey=@@IDENTITY
SELECT CAST(@@IDENTITY AS INT)

INSERT INTO TABLETHREE(TableThreeIDColumn)
VALUES (@TableOnePrimaryKey)               

SELECT @TableOnePrimaryKey=@@IDENTITY
SELECT CAST(@@IDENTITY AS INT)

INSERT INTO TABLEFOUR(TableFourIDColumn)
VALUES (@TableOnePrimaryKey)  

END

Но его первичный ключ TABLE ONE не сохраняется в других таблицах. Как это исправить ..

Ответы [ 2 ]

0 голосов
/ 21 ноября 2011

Используйте scope_identity() вместо @@identity.И вам не следует присваивать значение @TableOnePrimaryKey более одного раза.Если в других таблицах есть столбец идентификаторов, вы теряете идентификатор, полученный при первой вставке.

ALTER PROCEDURE [dbo].[Insert]
(@Name NVARCHAR(50))        
 AS
BEGIN
  SET NOCOUNT ON
  DECLARE @TableOnePrimaryKey INT

  INSERT INTO TABLEONE(Name)
  VALUES (@Name)               

  SET @TableOnePrimaryKey=SCOPE_IDENTITY()

  INSERT INTO TABLETWO(TableTwoIDColumn)
  VALUES (@TableOnePrimaryKey) 

  INSERT INTO TABLETHREE(TableThreeIDColumn)
  VALUES (@TableOnePrimaryKey)               

  INSERT INTO TABLEFOUR(TableFourIDColumn)
  VALUES (@TableOnePrimaryKey)  

END
0 голосов
/ 21 ноября 2011

Я бы использовал scope_identity вместо идентичности.

С http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

"Чтобы избежать потенциальных проблем, связанных с добавлением триггера позже, всегда используйте SCOPE_IDENTITY (), чтобы вернуть идентификатор недавно добавленной строкив вашем выражении T SQL или хранимой процедуре. "

Попробуйте и посмотрите, решит ли это вашу проблему.

Редактировать: Я хотел упомянуть, что думаювам нужно установить переменную по-другому.Попробуйте следующее:

SET @TableOnePrimaryKey = (SELECT SCOPE_IDENTITY())
SELECT CAST(@TableOnePrimaryKey AS INT)

и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...