0

我正在创建一个简单地创建行副本但更改一些值的过程。

在新创建的记录(这是现有记录的副本)中,我需要其中一个字段是新创建记录的 recordID(自动生成的 IDENTITY 列)的字符串表示形式。

CREATE PROC sp @RecordID int
AS
BEGIN
    INSERT INTO TheTable([RecordName], ...)
    SELECT CAST(@RecordID as nvarchar(500)), ...
    FROM TheTable
    WHERE [RecordID] = @RecordID
END

我的代码是错误的,因为它将 RecordName 设置为要复制的记录的 RecordID。我需要 RecordName 与正在创建的记录的 RecordID 相同。

谢谢您的帮助

4

2 回答 2

2

我认为您描述的内容是不可能的——在语句完成之前身份值不可用——但有一个简单的解决方法:

CREATE PROC sp @RecordID int
AS
BEGIN
    INSERT INTO TheTable([RecordName], ...)
    SELECT 'temporary dummy value', ...
    FROM TheTable
    WHERE [RecordID] = @RecordID
    ;

    UPDATE TheTable
    SET [RecordName] = CAST(@@IDENTITY as nvarchar(500))
    WHERE [RecordID] = @@IDENTITY
    ;
END

(请参阅文档@@IDENTITY。)

于 2012-09-12T14:51:45.740 回答
1

听起来您需要分两步执行此操作 - 将新数据插入表中,然后使用新的 recordID 更新记录

例如(假设 Sql Server),

declare @myNewID int    

INSERT INTO TheTable([RecordName], ...)
SELECT CAST(@RecordID as nvarchar(500)), ...
FROM TheTable
WHERE [RecordID] = @RecordID

set @myNewID = SCOPE_IDENTITY()

UPDATE TheTable
    set [RecordName] = CAST(@myNewID as nvarchar(500))
WHERE [RecordID] = @myNewID
于 2012-09-12T14:52:29.090 回答