2009-07-09 19 views
60

Wie kann ich die Anzahl der von einer UPDATE-Abfrage betroffenen Zeilen in einer Stored Procedure (SQL Server 2005) als Ergebnismenge ermitteln? z.B.Gibt die Anzahl der von UPDATE-Anweisungen betroffenen Zeilen zurück

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 

dann zurück:

Table1 Table2 Table3 Table4 
32  45  0   3 

Antwort

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

Sie können die Statistiken sammeln müssen, wie Sie gehen, aber @@ROWCOUNT fängt dies:

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

Dies ist genau das, was die OUTPUT Klausel ab SQL Server 2005 ist hervorragend für.

Beispiel

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' 

Ergebnisse in der

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 

In Ihrem speziellen Fall zurückgegeben folgenden werden, da Sie keine Aggregatfunktionen mit OUTPUT verwenden können, können Sie die Ausgabe von INSERTED.* in einer Tabelle erfassen müssen Variable oder temporäre Tabelle und zählen Sie die Datensätze. Beispiel:

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. *)' Ursachen 'Falsche Syntax nahe '*'.'. –

+0

@SteveTaylor Sie haben Recht. Ich werde jetzt aktualisieren –

1

Stellen Sie sicher, dass der Spaltentyp den Wert unterstützt, den Sie an ihn übergeben möchten! Hatte das gleiche Problem, weil ich versuchte, eine 13 (INT) Feldbreite eine 13-stellige Wertnummer zu aktualisieren.

Verwandte Themen