0

J'ai une base de données SQL Server 2008 R2 Express avec une table. Windows XP.Comment créer un événement/une fonction dans une base de données SQL Server 2008 R2 au lieu de Macros VBA?

J'ai écrit cette macro pour demander la taille de la table et supprimer des lignes si la table est plus grande que nécessaire, j'appelle VBA de SCADA toutes les heures.

Option Explicit 
Dim strConn As String 
Dim strSQL As String 
Dim objConn As Object 
Dim objRecSet As Object 
Dim Command As Object 
Dim objRecSetValue as Double 

On Error Resume Next 
Err.Number = 0 
strConn = "Provider=SQLOLEDB;Data Source=……….." 

Set objConn = CreateObject("ADODB.Connection") 
objConn.ConnectionString = strConn 
objConn.CursorLocation = 3 
objConn.Open 

Set objRecSet = CreateObject("ADODB.Recordset") 
Set Command = CreateObject("ADODB.Command") 
Command.CommandType = 1 
Set Command.ActiveConnection = objConn 

strSQL = "SELECT SUM(a.total_pages) * 8/1024 AS TotalSpaceMB FROM sys.tables t " 
strSQL = strSQL & "INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id " 
strSQL = strSQL & "INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id " 
strSQL = strSQL & "INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id " 
strSQL = strSQL & "WHERE t.NAME LIKE 'Statistic' AND i.index_id <= 1 GROUP BY t.NAME " 

Command.CommandText = strSQL 
Set objRecSet = Command.Execute 

objRecSet.MoveFirst 
objRecSetValue = objRecSet.Fields(0).Value 
objRecSet.Close 

If objRecSetValue> 5000 then 
    strSQL = "delete from dbo.statistic where dateandtime BETWEEN (SELECT MIN(dateandtime) FROM dbo.statistic) AND (SELECT MIN(dateandtime) FROM dbo.statistic) + 1" 
Command.CommandText = strSQL 
Set objRecSet = Command.Execute 
End if 

objConn.Close 

ErrorHandler1: 
Set Command = Nothing 
Set objConn = Nothing 
Set objRecSet = Nothing 

Maintenant, je veux éviter VBA et créer la procédure/fonction dans SQL Server Management Studio (SSMS), appelez avec Windows Sheduler et SQLCMD toutes les 1 heure, mais je ne sais pas T-SQL et la procédure/fonctionne bien. Quelqu'un pourrait-il m'aider à faire le même code en T-SQL? Merci.

+1

Vous avez écrit tout le code SQL. Avec quoi vous battez-vous? Voici un lien sur la façon de créer une procédure (exemples en bas): https://docs.microsoft.com/en-us/sql/relational-databases/stored-procedures/create-a-stored-procedure; Voici un lien sur la façon d'écrire une déclaration «IF»: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/if-else-transact-sql – Alex

Répondre

1

Voici le code de procédure

CREATE PROCEDURE proPurgeTableData 
AS 
BEGIN TRY 
    --variable for storing tablesize 
    DECLARE @tablesizeMB INT 

    --setting size to variable 
    SELECT 
     @tablesizeMB = SUM(a.total_pages) * 8/1024 
    FROM 
     sys.tables t 
     INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id 
     INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
     INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id 
    WHERE 
     t.NAME LIKE 'Statistic' AND i.index_id <= 1 
    GROUP BY 
     t.NAME 

    --if size greater than 5000 delete from table 
    IF (ISNULL(@tablesizeMB,0)>5000) 
    BEGIN 
     BEGIN TRAN 
      DELETE FROM dbo.statistic 
      WHERE dateandtime BETWEEN (SELECT MIN(dateandtime) FROM dbo.statistic) AND (SELECT MIN(dateandtime) FROM dbo.statistic) + 1 
     COMMIT TRAN 
    END 
END TRY 
BEGIN CATCH 
    IF @@TRANCOUNT>0 ROLLBACK TRAN 
END CATCH 

Vous pouvez l'exécuter comme EXEC proPurgeTableData, il suffit d'ajouter ceci dans le travail sql.

+0

Brilliant !!! : '-) MS SQL Express n'a pas SQL Agent, mais je vais utiliser sqlcmd et scheduler –