>有谁知道将这些记录插入 mssql 中的另一个表后如何通过循环逐行更新数据?
例:我有下表(表A)
ID Name is_Feeded
1 Alvin 0
2 Ben 0
3 Lee 1
4 David 0
我想将这些表从表 A 插入到表 B,然后通过循环将表 A 中的列is_Feeded更新为 1?
有人知道我如何在 mssql 中做到这一点吗?
假设 SQL Server 2005 或更高版本,您可以在单个语句中执行此操作。
UPDATE A
OUTPUT
inserted.ID,
inserted.Name
INTO
dbo.TableB (ID, Name)
SET
A.is_Feeded = 1 -- is fed?
FROM
dbo.tableA A
WHERE
A.is_Feeded = 0
;
触发器也是可能的,但如果可以避免,我不建议使用触发器。如果必须使用触发器(例如,可能无法控制对tableA
的更新),则:
CREATE TRIGGER TableA_U ON dbo.TableA FOR UPDATE
AS
INSERT dbo.tableB (ID, Name)
SELECT
I.ID,
I.Name
FROM
inserted I
;
对我来说,根据对tableA
的更新插入tableB
比更新tableA
以响应插入tableB
更自然。
我会为tableB编写一个触发器。在其中插入一行后,触发器可以更新表 A 中的特定值
首先将数据从表 A 复制到表 B
INSERT INTO tableB
SELECT Name, id FROM tableA;
然后设置被馈送:
UPDATE tableA SET is_feeded = true
最后,您应该在一个事务中执行此操作(语法取决于您的数据库系统,例如MySQL:http://dev.mysql.com/doc/refman/5.0/en/commit.html)
插入 TABLEB 时,您应该直接添加更新字段is_feeded。
CREATE PROCEDURE xxxxx
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON ;
DECLARE @iOK INT ;
SET @iOK = 0 ;
BEGIN TRY
BEGIN TRANSACTION -- Start the transaction
--start Inserting --
INSERT INTO tableB
SELECT Name ,
id
FROM tableA ;
UPDATE tableA
SET is_feeded = true
-- If we reach here, success!
COMMIT
SET @iOK = 1 ;
END TRY
BEGIN CATCH
-- Whoops, there was an error
IF @@TRANCOUNT > 0
ROLLBACK
-- Raise an error with the details of the exception
DECLARE @ErrMsg NVARCHAR(4000) ,
@ErrSeverity INT
SELECT @ErrMsg = ERROR_MESSAGE() ,
@ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
SELECT @iOK ;
END