none
Wie kann man mit T.SQL Update-Änderungen zählen und ausgeben? RRS feed

  • Frage

  • Hallo zusammen,

    ich habe folgende Tabelle:

    CREATE TABLE [dbo].[TableDup](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[Name1] [nvarchar](50) NULL,
    	[Name2] [nvarchar](50) NULL,
    	[Datum] [datetime] NULL,
    	[InFz] [bit] NULL,
    	[IsDup] [bit] NULL,
    	[DatenSatzNr] [int] NULL
    ) ON [PRIMARY]
    GO
    SET IDENTITY_INSERT [dbo].[TableDup] ON 
    
    INSERT [dbo].[TableDup] ([ID], [Name1], [Name2], [Datum], [InFz], [IsDup], [DatenSatzNr]) VALUES (1, N'A', N'B', CAST(N'2018-12-01T12:00:00.000' AS DateTime), 1, NULL, 1)
    INSERT [dbo].[TableDup] ([ID], [Name1], [Name2], [Datum], [InFz], [IsDup], [DatenSatzNr]) VALUES (2, N'B', NULL, CAST(N'2018-12-02T11:00:00.000' AS DateTime), 0, NULL, 2)
    INSERT [dbo].[TableDup] ([ID], [Name1], [Name2], [Datum], [InFz], [IsDup], [DatenSatzNr]) VALUES (3, N'A', N'B', CAST(N'2018-12-01T12:00:00.000' AS DateTime), 0, NULL, 3)
    INSERT [dbo].[TableDup] ([ID], [Name1], [Name2], [Datum], [InFz], [IsDup], [DatenSatzNr]) VALUES (4, N'A', N'B', CAST(N'2018-12-01T12:00:00.000' AS DateTime), 1, Null, 4)
    INSERT [dbo].[TableDup] ([ID], [Name1], [Name2], [Datum], [InFz], [IsDup], [DatenSatzNr]) VALUES (5, N'C', N'D', CAST(N'2018-12-10T11:00:00.000' AS DateTime), 0, NULL, 5)
    INSERT [dbo].[TableDup] ([ID], [Name1], [Name2], [Datum], [InFz], [IsDup], [DatenSatzNr]) VALUES (6, N'A', N'B', CAST(N'2018-12-01T12:00:00.000' AS DateTime), 1, Null, 6)
    SET IDENTITY_INSERT [dbo].[TableDup] OFF
    


    Nun ermittele ich in der Tabelle die Duplikate mit:

    Update [TestDB].[dbo].[TableDup]
    SET [IsDup] = 1
    WHERE [ID] NOT IN
    (
    	SELECT MIN(x.[ID]) AS [kein Dup]
    	FROM [TestDB].[dbo].[TableDup] AS x
    	GROUP BY x.Name1, x.Name2, x.Datum, x.InFz
    )
     

    Jetzt möchte ich die Anzahl der geänderten Datensätze (IsDup = 1) zählen und die Gesamtzahl ausgeben, da ich diese Update-Query später in eine SP einbauen möchte und als Result die Gesamtzahl der geänderten Datensätze zurückgeben möchte.

    Kann mir hier einer auf die Sprünge helfen, wie ich dieses umsetzen kann?

    Gruß

    Jürgen

    Freitag, 7. Dezember 2018 12:27

Antworten

  • Hallo Jürgen,

    Rückgabewerte solltest Du in einer SP als OUTPUT Parameter übermittelnm nicht über den Return Value der SP selbst. Der ist eigentlich für einen Returncode gedacht, der bspw. aussagt "Hat geklappt", "Hat nicht geklappt", "..."

    CREATE PROCEDURE usp_UpdateTableX
    (
        @AffectedRows INT OUTPUT
    )
    AS
    BEGIN
    
        SET NOCOUNT ON;
    
        UPDATE <Table>
        SET    <Column> = GETDATE()
        WHERE  <Field> = 123
    
        SET @AffectedRows = @@ROWCOUNT;
    
        RETURN;
    
    END

    Der Aufruf geht dann bspw. so:

    DECLARE @AffectedRows INT;
    
    EXEC usp_UpdateTableX @AffectedRows = @AffectedRows OUTPUT;
    
    PRINT @AffectedRows


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort markiert Jürgen Sch Sonntag, 9. Dezember 2018 10:52
    Samstag, 8. Dezember 2018 13:53
    Moderator

Alle Antworten

  • Hallo Jürgen,

    das geht mit der @@ROWCOUNT (Transact-SQL) Funktion


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Freitag, 7. Dezember 2018 12:57
  • Hallo Olaf,

    danke für die Antwort.

    Könntest du @@ROWCOUNT anhand meiner Query mal beispielhaft einbauen?

    Gruß Jürgen

    Freitag, 7. Dezember 2018 14:47
  • Hallo Jürgen,

    UPDATE Tabelle
    SET    Feld = Wert
    WHERE  Spalte = 123
    
    PRINT @@ROWCOUNT



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Freitag, 7. Dezember 2018 14:58
    Moderator
  • Hallo zusammen,

    ja, ihr habt recht, mit PRINT @@ROWCOUNT wird die Anzahl angezeigt.

    Wenn ich nun die Query als SP generiere und dann die SP in der Management-Konsole ausführe wird folgendes erzeugt:

    USE [TestDB]
    GO
    
    DECLARE @return_value int
    
    EXEC @return_value = [dbo].[QuerySearchDup]
    
    SELECT 'Return Value' = @return_value
    
    GO

    und als Ausgabe: Return Value = 0

    Wie kann ich dann @@ROWCOUNT an den @return_value Parameter übergeben???

    Gruß

    Jürgen

    Samstag, 8. Dezember 2018 13:38
  • Hallo Jürgen,

    Rückgabewerte solltest Du in einer SP als OUTPUT Parameter übermittelnm nicht über den Return Value der SP selbst. Der ist eigentlich für einen Returncode gedacht, der bspw. aussagt "Hat geklappt", "Hat nicht geklappt", "..."

    CREATE PROCEDURE usp_UpdateTableX
    (
        @AffectedRows INT OUTPUT
    )
    AS
    BEGIN
    
        SET NOCOUNT ON;
    
        UPDATE <Table>
        SET    <Column> = GETDATE()
        WHERE  <Field> = 123
    
        SET @AffectedRows = @@ROWCOUNT;
    
        RETURN;
    
    END

    Der Aufruf geht dann bspw. so:

    DECLARE @AffectedRows INT;
    
    EXEC usp_UpdateTableX @AffectedRows = @AffectedRows OUTPUT;
    
    PRINT @AffectedRows


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort markiert Jürgen Sch Sonntag, 9. Dezember 2018 10:52
    Samstag, 8. Dezember 2018 13:53
    Moderator
  • Hallo Stefan,

    danke für deine Hilfe. Das ist, was ich brauche. Das Managementstudio wirft zwar nach dem Aufruf der SP über "Ausführen" noch einen Fehler raus, ansonsten wird der Resultwert richtig ausgegeben. (s. Image)

    Gruß Jürgen

    Sonntag, 9. Dezember 2018 11:42
  • Hallo Jürgen,

    das liegt aller Wahrscheinlichkeit nach nur am Intellisense Cache, der im SSMS nicht automatisch aktualisiert wird. Daher kennt der Editor die neu erzeugte SP noch nicht.

    Drück mal Strg+Shift+R im Editor, dann wird der Cache nach kurzer Zeit (max. ein, zwei Sekunden in der Regel) aktualisiert.

    Wenn das nicht hilft, geht mal mit der Maus über den rot unterlegten Wert, dann sollte da auch stehen, was falsch ist.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Montag, 10. Dezember 2018 08:23
    Moderator
  • Hallo Stefan,

    danke für den Hinweis. Ich werde die SP jetzt erstmal in unsere Application einbauen und die Ausgabe in einem UnitTest testen.

    Gruß

    Jürgen

    Montag, 10. Dezember 2018 09:47