08. marts 2013 - 10:05 Der er 8 kommentarer og
1 løsning

Hjælp til lille stored procedure

Jeg har denne lille batch sql til sletning af data. Er der en, som kan lave et CREATE script til oprettelse af en stored procedure til mig..

Parameter1: @TableName (tekst)
Parameter2: @LogTime (dato)



DECLARE @BatchSize INT
SET @BatchSize = 10000

WHILE @BatchSize <> 0
BEGIN
    DELETE TOP (@BatchSize)
    FROM @TableName
      WHERE LogTime < @LogTime
    SET @BatchSize = @@rowcount
END
Avatar billede Syska Mester
08. marts 2013 - 11:06 #1
Ikke testet ... problemet er dit dynamiske opbygning af dine query der ikke virker :-)

Sagt på en anden måde ... jeg antager hvad du har lavet der ikke virker :-)

Du burde kunne gøre sådan her:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE Batch
    @TableName varchar(250),
    @LogTime datetime
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @BatchSize INT

    DECLARE @SQL varchar(500);
    SET @BatchSize = 10000


    WHILE @BatchSize <> 0
    BEGIN
        SET @SQL = 'DELETE TOP ' + @BatchSize + ' FROM ' + @TableName + ' WHERE LogTime < ' + @LogTime;
       
        EXEC @SQL;
       
        SET @BatchSize = @@rowcount
    END
END
GO
08. marts 2013 - 12:33 #2
Tester
08. marts 2013 - 12:36 #3
Jeg får følgende fejl:
Msg 245, Level 16, State 1, Procedure sp_batch_test, Line 16
Conversion failed when converting the varchar value 'DELETE TOP ' to data type int.
08. marts 2013 - 12:37 #4
Følgende kald gav fejlen:
exec sp_batch_test 'tbl_data', '2012-12-11'
Avatar billede Syska Mester
08. marts 2013 - 12:48 #5
Kig på dette ... http://www.mssqltips.com/sqlservertip/1160/execute-dynamic-sql-commands-in-sql-server/

Så kan du angive parameters hvilket nok vil gøre det nemmere og mere sikkert mod sql injections.

Eventuelt kan du måske også ... TAGER INTET ANSVAR. Husk backup, test i dev og ikke i prod.

SET @SQL = 'DELETE TOP ' + CAST(@BatchSize AS VARCHAR) + ' FROM ' + @TableName + ' WHERE LogTime < ''' + CAST(@LogTime AS VARCHAR) + '''';

Sammen med overstående link, burde det kunne laves rimelig dejligt.

Hvis du ikke kan finde ud af det, så kan jeg måske kigge igen på det senere .... arbejdet kalder.
08. marts 2013 - 13:09 #6
Takker - jeg leger videre :)
08. marts 2013 - 13:56 #7
Det ser ud til at følgende virker rimeligt
SET @SQL = 'DELETE TOP (' + CAST(@BatchSize AS VARCHAR) + ') FROM ' + @TableName + ' WHERE LogTime < ''' + convert(nvarchar, @LogTime, 121) + '''';


Nu får jeg en anden fejl end konvtertering...
Msg 2812, Level 16, State 62, Procedure sp_batch, Line 20
Could not find stored procedure 'DELETE TOP (10000) FROM tbl_data WHERE LogTime < '2012-12-12 00:00:00.000''.
18. marts 2013 - 13:30 #8
Sådan - ny lykkedes det - smid et svar

EXEC @SQL;
skulle ændres til
EXEC sp_executesql @SQL;
Avatar billede Syska Mester
19. marts 2013 - 00:40 #9
Ahh, det jeg havde glemt.

Svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester