2009-07-09 23 views
60

結果セットとして、ストアドプロシージャ(SQL Server 2005)でUPDATEクエリの影響を受ける行の数を取得するにはどうすればよいですか。例えばUPDATE文の影響を受ける行数を返します

CREATE PROCEDURE UpdateTables 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    UPDATE Table1 Set Column = 0 WHERE Column IS NULL 
    UPDATE Table2 Set Column = 0 WHERE Column IS NULL 
    UPDATE Table3 Set Column = 0 WHERE Column IS NULL 
    UPDATE Table4 Set Column = 0 WHERE Column IS NULL 
END 

次に返す:

Table1 Table2 Table3 Table4 
32  45  0   3 

答えて

85
CREATE PROCEDURE UpdateTables 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    DECLARE @RowCount1 INTEGER 
    DECLARE @RowCount2 INTEGER 
    DECLARE @RowCount3 INTEGER 
    DECLARE @RowCount4 INTEGER 

    UPDATE Table1 Set Column = 0 WHERE Column IS NULL 
    SELECT @RowCount1 = @@ROWCOUNT 
    UPDATE Table2 Set Column = 0 WHERE Column IS NULL 
    SELECT @RowCount2 = @@ROWCOUNT 
    UPDATE Table3 Set Column = 0 WHERE Column IS NULL 
    SELECT @RowCount3 = @@ROWCOUNT 
    UPDATE Table4 Set Column = 0 WHERE Column IS NULL 
    SELECT @RowCount4 = @@ROWCOUNT 

    SELECT @RowCount1 AS Table1, @RowCount2 AS Table2, @RowCount3 AS Table3, @RowCount4 AS Table4 
END 
8

をあなたが行くように統計情報を収集する必要があるかもしれませんが、@@ROWCOUNTがこれを取り込むのは:

declare @Fish table (
Name varchar(32) 
) 

insert into @Fish values ('Cod') 
insert into @Fish values ('Salmon') 
insert into @Fish values ('Butterfish') 
update @Fish set Name = 'LurpackFish' where Name = 'Butterfish' 
select @@ROWCOUNT --gives 1 

update @Fish set Name = 'Dinner' 
select @@ROWCOUNT -- gives 3 
9

これはまさにOUTPUT句ですSQL Server 2005以降では優れています。

例次はあなたがOUTPUTで集計関数を使用することができないので、あなたがテーブルにINSERTED.*の出力をキャプチャする必要があり、あなたの特定のケースでは

LockId StartTime    EndTime 
------------------------------------------------------- 
4  2011-07-01 00:00:00.000 2009-07-10 00:00:00.000 
5  2011-07-01 00:00:00.000 2009-07-11 00:00:00.000 
6  2011-07-01 00:00:00.000 2009-07-12 00:00:00.000 
7  2011-07-01 00:00:00.000 2009-07-13 00:00:00.000 

を返される中

CREATE TABLE [dbo].[test_table](
    [LockId] [int] IDENTITY(1,1) NOT NULL, 
    [StartTime] [datetime] NULL, 
    [EndTime] [datetime] NULL, 
PRIMARY KEY CLUSTERED 
(
    [LockId] ASC 
) ON [PRIMARY] 
) ON [PRIMARY] 

INSERT INTO test_table(StartTime, EndTime) 
VALUES('2009 JUL 07','2009 JUL 07') 
INSERT INTO test_table(StartTime, EndTime) 
VALUES('2009 JUL 08','2009 JUL 08') 
INSERT INTO test_table(StartTime, EndTime) 
VALUES('2009 JUL 09','2009 JUL 09') 
INSERT INTO test_table(StartTime, EndTime) 
VALUES('2009 JUL 10','2009 JUL 10') 
INSERT INTO test_table(StartTime, EndTime) 
VALUES('2009 JUL 11','2009 JUL 11') 
INSERT INTO test_table(StartTime, EndTime) 
VALUES('2009 JUL 12','2009 JUL 12') 
INSERT INTO test_table(StartTime, EndTime) 
VALUES('2009 JUL 13','2009 JUL 13') 

UPDATE test_table 
    SET StartTime = '2011 JUL 01' 
    OUTPUT INSERTED.* -- INSERTED reflect the value after the UPDATE, INSERT, or MERGE statement is completed 
WHERE 
    StartTime > '2009 JUL 09' 

結果可変または一時テーブルを作成し、レコードを数えます。たとえば、

DECLARE @temp TABLE (
    [LockId] [int], 
    [StartTime] [datetime] NULL, 
    [EndTime] [datetime] NULL 
) 

UPDATE test_table 
    SET StartTime = '2011 JUL 01' 
    OUTPUT INSERTED.* INTO @temp 
WHERE 
    StartTime > '2009 JUL 09' 


-- now get the count of affected records 
SELECT COUNT(*) FROM @temp 
+0

'OUTPUT COUNT(INSERTED。*)'により、 '*'の近くに不正な構文が発生します。 –

+0

@SteveTaylorあなたが正しいです。私は今更新する –

1

あなたが渡そうとしている値をサポートしていることを確認してください。 13(INT)のフィールド幅と13桁の数値を更新しようとしていたため、同じ問題が発生しました。

関連する問題