我在。net应用程序工作。这里在我的aspx页面,我有3个标签(即)标签1,标签2,标签3。第一个选项卡包含一些文本框控件,第二个选项卡包含一些组合框控件,第三个选项卡包含一些控件。我想保存所有这三个选项卡控件在SQL数据库三个不同的表。为此只应使用一个存储过程。第一个表的PRIMARY键应该保存在第二个和第三个表中。(比如,引用插入)。这是我的SP.
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主键不会被保存在其他表中。
用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
我将使用scope_identity超过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()返回对象的标识SQL语句或存储过程中最近添加的行。"
试一下,看看是否能解决你的问题。
编辑:我想说的是,我认为你需要设置不同的变量。
SET @TableOnePrimaryKey = (SELECT SCOPE_IDENTITY())
SELECT CAST(@TableOnePrimaryKey AS INT)
等等