Hvordan ringe en SQL Server Lagret prosedyre fra Excel VBA

Data på en server kan endres ved å undersøke postene "klientsiden" i Excel VBA, endre dem etter behov og lagre dem tilbake til serveren.
En mer effektiv måte å gjøre dette på, spesielt hvis databasen er på et eksternt sted og det er mye trafikk involvert, er å gjøre jobben "server-side". Denne øvelsen kaller en lagret prosedyre fra Excel for å kategorisere ansatte i aldersgrupper i henhold til deres fødselsdato (dvs. 18-25 år, 26-35 år, osv.), uten rikelig utveksling av data mellom serveren og Excel.

Denne artikkelen forutsetter at leseren har utviklerbåndet vist og er kjent med VBA Editor. Hvis ikke, vennligst Google "Excel Developer Tab" eller "Excel Code Window".

Det er tre elementer i øvelsen:

  • En datatabell tblAnsatte i en database TestDB;
  • En lagret prosedyre spAgeRange;
  • En Excel xlsm, som vi kaller xlsm. Du kan finne et eksempel på en Excel-fil her.

data~~POS=TRUNC

Lag en database i SQL Server som heter DBTest.

Sett opp følgende kolonner for en tabell tblAnsatte.

Sett opp kolonnene for et bord tblPersonal

Kopier følgende inn i tabellen:

2017/05/25 1 brun J 1946/12/02 M
2017/05/25 2 Smart A 1976/03/26 F
2017/05/25 3 cruise T 1962/07/03 M
2017/05/25 4 Lohan L 1986/07/02 F
2017/05/25 5 Fredricksen F 1964/03/15 M
2017/05/25 6 Snyder L 1968/07/05 F
2017/05/25 7 Lipnicki J 1983/11/25 M
2017/05/25 8 Hoover S 2002/12/08 F
2017/05/25 9 Watson E 1990/04/15 F

Lagret prosedyre.

Kjør dette skriptet mot TestDB for å lage den lagrede prosedyren:

USE [TestDB]
GO
/****** Object: StoredProcedure [dbo].[spAgeRange] Script Date: 2017/05/10 12:16:28 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[spAgeRange]

    @PayrollDate varchar(50)
 
AS
BEGIN

    SET NOCOUNT ON;
    UPDATE tblStaff SET Age = CONVERT(int, DATEDIFF(day, DateOfBirth, GETDATE()) / 365.25, 0) 
    WHERE tblStaff.PayrollDate = @PayrollDate
 
    Update tblStaff set AgeRange = '>56' where Age >= 56 and PayrollDate = @PayrollDate

    Update tblStaff set AgeRange = '46 to 55' where Age >= 46 and Age < 56 and PayrollDate = PayrollDate 
 
    Update tblStaff set AgeRange = '39 to 45' where Age >= 39 and Age < 46 and PayrollDate = @PayrollDate 
 
    Update tblStaff set AgeRange = '31 to 38' where Age >= 30 and Age < 39 and PayrollDate = @PayrollDate 
 
    Update tblStaff set AgeRange = '25 to 30' where Age >= 25 and Age < 30 and PayrollDate = @PayrollDate 
 
    Update tblStaff set AgeRange = '18 to 24' where Age >= 18 and Age < 25 and PayrollDate = @PayrollDate 
 
    Update tblStaff set AgeRange = '<18' where Age < 18 and PayrollDate = @PayrollDate

END

Den lagrede prosedyren vil lagres under "Programmerbarhet" i databasen.

Excel VBA

Alt som gjenstår er å kalle opp den lagrede prosedyren fra Excel, og gi Lønnsdato parameter "2017/05/25". Du vil merke at jeg ganske enkelt har skrevet inn data  Lønnsdato som en streng i stedet for å kjempe med varierende datoformater. Det er enkelt nok å konvertere en streng til en dato ved å bruke Konverter funksjon hvis Lønnsdato skal brukes til aritmetiske formål.

Opprett en ny arbeidsbok. Åpne VBA-kodevinduet og sett inn en modul.

Fra kodevinduets Verktøy-meny, referer til det aktuelle Active X 2.nn library for å lette bruken av dataobjekter.Referanse The Appropriate Active X 2.nn Library For å lette bruken av dataobjekter

Lim inn følgende kode i kodevinduet. Når denne er aktivert, kobles den til SQL Server, i henhold til ConnectDatabase-underprosedyren

'All "public" in case the code is spread over several modules.
Public connDB As New ADODB.Connection
Public rs As New ADODB.Recordset
Public strSQL As String
Public strConnectionstring As String
Public strServer As String
Public strDBase As String
Public strUser As String
Public strPwd As String
Public PayrollDate As String

Sub WriteStoredProcedure()
     PayrollDate = "2017/05/25"
     Call ConnectDatabase
     On Error GoTo errSP
     strSQL = "EXEC spAgeRange '" & PayrollDate & "'"
     connDB.Execute (strSQL)
     Exit Sub
errSP:
MsgBox Err.Description
End Sub

Sub ConnectDatabase()
     If connDB.State = 1 Then connDB.Close
     On Error GoTo ErrConnect
     strServer = "SERVERNAME" ‘The name or IP Address of the SQL Server
     strDBase = "TestDB"
     strUser = "" 'leave this blank for Windows authentication
     strPwd = ""

     If strPwd > "" Then
         strConnectionstring = "DRIVER={SQL Server};Server=" & strServer & ";Database=" & strDBase & ";Uid=" & strUser & ";Pwd=" & strPwd & ";Connection Timeout=30;"
     Else
         strConnectionstring = "DRIVER={SQL Server};SERVER=" & strServer & ";Trusted_Connection=yes;DATABASE=" &    strDBase 'Windows authentication
     End If
     connDB.ConnectionTimeout = 30
     connDB.Open strConnectionstring
Exit Sub
ErrConnect:
     MsgBox Err.Description
End Sub

Legg til en knapp i Ark1 og tilordne den til underprosedyre "WriteLagret prosedyre"

Resultatene

Trykk på knappen, og undersøk deretter tblStaff, som bør oppdateres med aldre og aldersgrupper. Behandlingen har foregått på serversiden.

Gjenoppretting av ødelagte arbeidsbøker

Skulle Excel krasjer kan det godt ta den eneste kopien av arbeidsboken ned med den. En god prosentandel av tiden Excel er ofte ikke i stand til å gjenopprette skadede arbeidsbøker; i et slikt tilfelle kan alt arbeidet som er gjort siden opprettelsen av arbeidsboken være irrevocably lost, med mindre du har et verktøy for å reparere Excel xlsx- eller xlsm-filer.

Forfatterintroduksjon:

Felix Hooker er en datagjenopprettingsekspert innen DataNumen, Inc., som er verdensledende innen datagjenopprettingsteknologier, inkludert rar reparasjon og sql-programvareprodukter. For mer informasjon besøk www.datanumen. Med

Kommentarer er stengt.