有谁知道如何在将这些记录插入到 mssql 中的另一个表后逐行更新数据?
示例:我有下表(tableA)
ID Name is_Feeded
1 Alvin 0
2 Ben 0
3 Lee 1
4 David 0
我想将这些表从 tableA 插入到 tableB 然后通过循环将 tableA 中的列 is_Feeded 更新为 1?
任何人都知道我怎么能在 mssql 中做到这一点?
有谁知道如何在将这些记录插入到 mssql 中的另一个表后逐行更新数据?
示例:我有下表(tableA)
ID Name is_Feeded
1 Alvin 0
2 Ben 0
3 Lee 1
4 David 0
我想将这些表从 tableA 插入到 tableB 然后通过循环将 tableA 中的列 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
;
tableB
对我来说,根据更新插入到tableA
比tableA
响应插入到更新更自然tableB
。
我会为tableB写一个触发器。在那里插入一行后,触发器可以更新 tableA 中的特定值
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
向 TABLEB 插入数据时,应直接添加更新字段 is_feeded。
首先将数据从tableA复制到tableB
INSERT INTO tableB
SELECT Name, id FROM tableA;
然后 set 被喂食:
UPDATE tableA SET is_feeded = true
最后,您应该在一个事务中执行此操作(语法取决于您的数据库系统,例如 MySQL:http ://dev.mysql.com/doc/refman/5.0/en/commit.html )