0

それらのレコードを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でそれを行う方法を知っている人はいますか?

4

5 に答える 5

2

SQL Server 2005 以降であれば、これを 1 つのステートメントで実行できます。

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の更新に基づいてに挿入する方が自然です。tableAtableAtableB

于 2013-09-16T05:48:22.850 に答える
1

tableB のトリガーを作成します。そこに行を挿入した後、トリガーは tableA の特定の値を更新できます

于 2013-09-16T05:43:49.093 に答える
0

最初に tableA から tableB にデータをコピーします

INSERT INTO tableB
  SELECT Name, id FROM tableA;

次に、セットが供給されます:

UPDATE tableA SET is_feeded = true

最後に、これを 1 つのトランザクションで行う必要があります (構文は DB システムによって異なります。たとえば、MySQL: http://dev.mysql.com/doc/refman/5.0/en/commit.html ) 。

于 2013-09-16T05:44:51.347 に答える
0

TABLEB にデータを挿入するときは、更新フィールド is_feeded を直接追加する必要があります。

于 2013-09-16T05:47:09.623 に答える
0
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
于 2013-09-16T06:22:43.270 に答える