Fügen Sie MS Excel-Daten in SQL Server ein


71

Ich habe eine Reihe von Zeilen in Excel, die ich in eine neue Tabelle in MS SQL einfügen möchte. Gibt es einen einfachen Weg?


1
Dies scheint nicht mit der Programmierung zu tun zu haben. Versuchen Sie dies mit VBA oder so?
Warren

1
Nein, nur große Datenmengen kommen adhoc als Excel oder einfach, "exzellent" an
Bajji

1
Diese dotnetstories.wordpress.com/2008/05/24/… hat für mich gearbeitet
Jaco Briers

Antworten:


38

Ich habe diese Technik in der Vergangenheit erfolgreich eingesetzt:

Verwenden von Excel zum Generieren von Einfügungen für SQL Server

(...) Überspringen Sie eine Spalte (oder verwenden Sie sie für Notizen) und geben Sie dann die folgende Formel ein:

="insert into tblyourtablename (yourkeyID_pk, intmine, strval) values ("&A4&", "&B4&", N'"&C4&"')"

Jetzt haben Sie Ihre Einfügeanweisung für eine Tabelle mit Ihrem Primärschlüssel (PK), einer Ganzzahl und einer Unicode-Zeichenfolge. (...)


3
Die Antwort von bzlm ist für die Frage besser geeignet. Dies ist eine nette kleine Entdeckung, aber in den meisten Fällen klicken Sie mit der rechten Maustaste auf bzlm und kopieren Sie frühere Werke!
ThinkCode

1
Dies ist schneller und einfacher: mssqltips.com/sqlservertip/1430/…
Ricky Helgesson

2
Das Kopieren und Einfügen funktionierte bei mir nicht und der OPENROWSETBefehl auch nicht. Der einzige Weg war Galwegians Antwort!
Dan Rayson

1
Damit das Kopieren und Einfügen funktioniert, müssen Sie sicherstellen, dass Sie nicht in eine der Feldzellen in SQL Server Management Studio geklickt haben. Klicken Sie stattdessen auf einen der grauen Ränder.
Rich

74

Wenn Sie über SQL Server Management Studio verfügen, können Sie einfach aus Excel kopieren und mit der Maus in die Tabelle in Management Studio einfügen. Gerade

  1. Gehen Sie zu der Tabelle, in die Sie einfügen möchten.
  2. Wählen Sie "Top 200 Zeilen bearbeiten".
  3. Klicken Sie mit der rechten Maustaste auf eine beliebige Stelle und wählen Sie Einfügen.

Zuvor müssen Sie die Spalten zwischen Excel und Management Studio abgleichen. Außerdem müssen Sie nicht bearbeitbare Spalten mit dem Tabellen-Designer in Management Studio zuletzt (ganz rechts) platzieren.

Die gesamte Prozedur dauert Sekunden (zum Einrichten und Starten - nicht unbedingt zum Ausführen) und erfordert keine SQL-Anweisungen.

In Bezug auf leere Datenbanktabellen und SSMS v18.1 + .


4
+1, aber Sie müssen nicht die Option "Top 1000 Zeilen bearbeiten" auswählen (wo ist diese Option in SSMS 2005?). Sie müssen nur eine Tabelle öffnen und in eine leere Zeile einfügen. Übrigens ist es einfach und funktioniert, wenn die Spaltennamen übereinstimmen, aber es dauert 45 Minuten (und nicht Sekunden), um mit dieser Methode 40.000 Zeilen auf meinem Server einzufügen (mit aktivem Einfügetrigger). Daher ist es einfach, aber nicht flexibel und schnell.
Tim Schmelter


7
Nur ein Hinweis für alle, die dies in SSMS 2005 tun: Sie müssen mit der rechten Maustaste auf das leere Zeilen-Tag links und nicht auf die Zelle selbst klicken und Einfügen auswählen, da sonst der letzte Wert in die aktuelle Zeile eingefügt wird.
Oli Stockman

2
Zumindest 2012 müssen Sie mit der rechten Maustaste speziell auf einen der leeren, grauen "Kopfzeilen" -Bereiche links von der ersten Spalte in einer leeren Zeile klicken. Wenn Sie mit der rechten Maustaste in eine Zelle klicken, wird versucht, in diese eine Zelle zu kopieren. Wenn Sie mit der rechten Maustaste auf den leeren, grauen "Kopf" -Block in der oberen linken Ecke kurz vor Zeilen oder Spalten klicken, können Sie diese nicht einfügen. Ich bin mir zwar technisch nicht sicher, was passieren wird, wenn Sie auf einen Kopfbereich klicken, der einer Spalte zugeordnet ist, aber nicht einer Zeile.
Panzercrisis

4
Wenn die erste Spalte eine Identitätsspalte ist, stellen Sie sicher, dass Ihre erste Spalte in Excel eine leere Spalte ist, und schließen Sie dies auch ein, wenn Sie aus Excel kopieren. (Sie müssen es nicht bis zum Ende verschieben oder so) Und wie andere bereits betont haben, stellen Sie in Management Studio sicher, dass Sie die "neue Zeile" auswählen, indem Sie auf die Auswahl klicken.
Magnus

25

Excel

  1. Markieren und kopieren Sie in Excel die Daten, die Sie in SQL einfügen möchten.

SQL

  1. Erstellen Sie die Tabelle mit den gewünschten Spaltennamen und geben Sie der Tabelle einen Namen. * Stellen Sie sicher Identity Specification, dass Ja vorhanden ist, damit Ihre Identitätsspalte automatisch erhöht wird.
  2. Suchen Sie Ihre Tabelle, klicken Sie mit der rechten Maustaste darauf und wählen Sie Edit Top 200 Rowsim Dialogfeld aus.
  3. Klicken Sie mit der rechten Maustaste auf die leere Zeile mit dem Zeichen * und wählen Sie Einfügen aus dem Dialogfeld

Geben Sie hier die Bildbeschreibung ein


18

Für zukünftige Referenzen:

Sie können Daten von en excel-sheet in eine SQL-Tabelle kopieren und einfügen, indem Sie Folgendes tun:

Wählen Sie die Daten in Excel aus und drücken Sie Strg + C.

  1. Wählen Sie die Daten in Excel aus und drücken Sie Strg + C.
  2. Klicken Sie in SQL Server Management Studio mit der rechten Maustaste auf die Tabelle und wählen Sie Top 200 Zeilen bearbeiten
  3. Scrollen Sie nach unten und wählen Sie die gesamte leere Zeile aus, indem Sie auf die Zeilenüberschrift klicken
  4. Fügen Sie die Daten ein, indem Sie Strg + V drücken

Hinweis: Oft haben Tabellen eine erste Spalte, die eine ID-Spalte mit einer automatisch generierten / inkrementierten ID ist. Wenn Sie Ihre Daten einfügen, wird die am weitesten links ausgewählte Spalte in Excel in die am weitesten links stehende Spalte in SSMS eingefügt, wodurch Daten in die ID-Spalte eingefügt werden. Um dies zu vermeiden, halten Sie eine leere Spalte ganz links in Ihrer Auswahl, um diese Spalte in SSMS zu überspringen. Dies führt dazu, dass SSMS die Standarddaten einfügt, bei denen es sich um die automatisch generierte ID handelt. Darüber hinaus können Sie andere Spalten überspringen, indem Sie leere Spalten an denselben Ordnungspositionen in der Excel-Tabellenauswahl haben wie die zu überspringenden Spalten. Dadurch fügt SSMS den Standardwert ein (oder NULL, wenn kein Standardwert angegeben ist).


2
Ich darf das nur eine Reihe nach der anderen machen. In dem Moment, in dem ich mehr als eine Zeile in Excel auswähle, bewirkt das Einfügen in SSMS genau ... nichts. Ich habe versucht, Strg + V, ich habe versucht, mit der rechten Maustaste + Einfügen zu klicken, ich habe versucht, es zuerst in den Editor einzufügen und die zusätzliche leere Zeile am Ende zu löschen, ich habe versucht, am Anfang eine leere Spalte einzufügen ( wie früher in Enterprise Manager) ... nichts funktioniert.
Martha

Viele Antworten vergessen, Schritt 3 zu erwähnen, wenn Sie einer Tabelle, die bereits Daten enthält, Zeilen hinzufügen.
10.

3

Am einfachsten ist es, eine berechnete Spalte in XLS zu erstellen, die die Syntax der insert-Anweisung generiert. Kopieren Sie diese Einfügung in eine Textdatei und führen Sie sie dann in SQL aus. Die anderen Alternativen sind der Kauf von Datenbankkonnektivitäts-Add-Ons für Excel und das Schreiben von VBA-Code, um dies zu erreichen.


3

Ich habe ein Excel VBA-Makro entwickelt, mit dem Sie eine Auswahl aus Excel ausschneiden und in SQL Server einfügen und eine neue Tabelle erstellen können. Das Makro eignet sich hervorragend für schnelle und schmutzige Tabellenerstellungen mit bis zu einigen tausend Zeilen und mehreren Spalten (es kann theoretisch bis zu 200 Spalten verwalten). Das Makro versucht, Headernamen automatisch zu erkennen und jeder Spalte den am besten geeigneten Datentyp zuzuweisen (es verarbeitet Varchar-Spalten mit bis zu 1000 Zeichen).

Empfohlenes Setup-Verfahren:

  1. Stellen Sie sicher, dass Excel zum Ausführen von Makros aktiviert ist. (Datei-> Optionen-> Vertrauensstellungscenter-> Vertrauensstellungscenter-Einstellungen-> Makroeinstellungen-> Alle Makros aktivieren ..)
  2. Kopieren Sie den folgenden VBA-Code in das Modul, das Ihrer persönlichen Arbeitsmappe zugeordnet ist (damit das Makro für alle Arbeitsblätter verfügbar ist).
  3. Weisen Sie dem Makro einen geeigneten Tastenanschlag zu (ich habe Strg-Umschalttaste X zugewiesen).
  4. Speichern Sie Ihre persönliche Arbeitsmappe

Verwendung von Makro

  1. Wählen Sie die Zellen in Excel (einschließlich der Spaltenüberschriften, falls vorhanden) aus, die an SQL übertragen werden sollen
  2. Drücken Sie auf die zugewiesene Schlüsselwortkombination, die Sie zum Ausführen des Makros zugewiesen haben
  3. Befolgen Sie die Anweisungen. (Standardtabellenname ist ## Tabelle)
  4. Fügen Sie den Inhalt der Zwischenablage in ein SSMS-Fenster ein und führen Sie den generierten SQL-Code aus. BriFri 238

VBA-Code:

Sub TransferToSQL()
'
' TransferToSQL Macro
' This macro prepares data for pasting into SQL Server and posts it to the clipboard for inserting into SSMS
' It attempts to automatically detect header rows and does a basic analysis of the first 15 rows to determine the most appropriate datatype to use handling text entries upto 1000 chars.
'
' Max Number of Columns: 200
'
' Keyboard Shortcut: Ctrl+Shift+X
'
' ver   Date    Reason
' ===   ====    ======

' 1.6   06/2012 Fixed bug that prevented auto exit if no selection made / auto exit if blank Tablename entered or 'cancel' button pressed
' 1.5   02/2012 made use of function fn_ColLetter to retrieve the Column Letter for a specified column
' 1.4   02/2012 Replaces any Tabs in text data to spaces to prevent Double quotes being output in final results
' 1.3   02/2012 Place the 'drop table if already exists' code into a separate batch to prevent errors when inserting new table with same name but different shape and > 100 rows
' 1.2   01/2012 If null dates encountered code to cast it as Null rather than '00-Jan-1900'
' 1.1   10/2011 Code to drop the table if already exists
' 1.0   03/2011 Created

Dim intLastRow As Long
Dim intlastColumn As Integer
Dim intRow As Long
Dim intDataStartRow As Long
Dim intColumn As Integer
Dim strKeyWord As String
Dim intPos As Integer
Dim strDataTypeLevel(4) As String
Dim strColumnHeader(200) As String
Dim strDataType(200) As String
Dim intRowCheck As Integer
Dim strFormula(20) As String
Dim intHasHeaderRow As Integer
Dim strCellRef As String
Dim intFormulaCount As Integer
Dim strSQLTableName As String
Dim strSQLTableName_Encap As String
Dim intdataTypelevel As Integer
Const strConstHeaderKeyword As String = "ID,URN,name,Title,Job,Company,Contact,Address,Post,Town,Email,Tele,phone,Area,Region,Business,Total,Month,Week,Year,"
Const intConstMaxBatchSize As Integer = 100
    Const intConstNumberRowsToAnalyse As Integer = 100
intHasHeaderRow = 0

strDataTypeLevel(1) = "VARCHAR(1000)"
strDataTypeLevel(2) = "FLOAT"
strDataTypeLevel(3) = "INTEGER"
strDataTypeLevel(4) = "DATETIME"



' Use current selection and paste to new temp worksheet

    Selection.Copy
    Workbooks.Add       ' add temp 'Working' Workbook
    ' Paste "Values Only" back into new temp workbook
    Range("A3").Select  ' Goto 3rd Row
    Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False ' Copy Format of Selection
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False  ' Copy Values of Selection
    ActiveCell.SpecialCells(xlLastCell).Select  ' Goto last cell
    intLastRow = ActiveCell.Row
    intlastColumn = ActiveCell.Column


' Check to make sure that there are cells which are selected
If intLastRow = 3 And intlastColumn = 1 Then
    Application.DisplayAlerts = False       ' Temporarily switch off Display Alerts
    ActiveWindow.Close                      ' Delete newly created worksheet
    Application.DisplayAlerts = True        ' Switch display alerts back on
    MsgBox "*** Please Make selection before running macro - Terminating ***", vbOKOnly, "Transfer Data to SQL Server"
    Exit Sub
End If

' Prompt user for Name of SQL Server table
strSQLTableName = InputBox("SQL Server Table Name?", "Transfer Excel Data To SQL", "##Table")

' if blank table name entered or 'Cancel' selected then exit
If strSQLTableName = "" Then
    Application.DisplayAlerts = False       ' Temporarily switch off Display Alerts
    ActiveWindow.Close                      ' Delete newly created worksheet
    Application.DisplayAlerts = True        ' Switch display alerts back on
    Exit Sub
End If



' encapsulate tablename with square brackets if user has not already done so
strSQLTableName_Encap = Replace(Replace(Replace("[" & Replace(strSQLTableName, ".", "].[") & "]", "[]", ""), "[[", "["), "]]", "]")

' Try to determine if the First Row is a header row or contains data and if a header load names of Columns
Range("A3").Select
For intColumn = 1 To intlastColumn
    ' first check to see if the first row contains any pure numbers or pure dates
    If IsNumeric(ActiveCell.Value) Or IsDate(ActiveCell.Value) Then
    intHasHeaderRow = vbNo
    intDataStartRow = 3
    Exit For
    Else
    strColumnHeader(intColumn) = ActiveCell.Value
    ActiveCell.Offset(1, 0).Range("A1").Select  ' go to the row below
    If IsNumeric(ActiveCell.Value) Or IsDate(ActiveCell.Value) Then
        intHasHeaderRow = vbYes
        intDataStartRow = 4
    End If
    ActiveCell.Offset(-1, 0).Range("A1").Select  ' go back up to the first row
    If intHasHeaderRow = 0 Then     ' if still not determined if header exists: Look for header using keywords
        intPos = 1
        While intPos < Len(strConstHeaderKeyword) And intHasHeaderRow = 0
        strKeyWord = Mid$(strConstHeaderKeyword, intPos, InStr(intPos, strConstHeaderKeyword, ",") - intPos)
        If InStr(1, ActiveCell.Value, strKeyWord) > 0 Then
            intHasHeaderRow = vbYes
            intDataStartRow = 4
        End If
        intPos = InStr(intPos, strConstHeaderKeyword, ",") + 1
        Wend
    End If
    End If
    ActiveCell.Offset(0, 1).Range("A1").Select  ' Goto next column
Next intColumn

' If auto header row detection has failed ask the user to manually select
If intHasHeaderRow = 0 Then
    intHasHeaderRow = MsgBox("Does current selection have a header row?", vbYesNo, "Auto header row detection failure")
    If intHasHeaderRow = vbYes Then
    intDataStartRow = 4
    Else
    intDataStartRow = 3
    End If

End If




' *** Determine the Data Type of each Column ***

' Go thru each Column to find Data types
If intLastRow < intConstNumberRowsToAnalyse  Then             ' Check the first intConstNumberRowsToAnalyse  rows or to end of selection whichever is less
    intRowCheck = intLastRow
Else
    intRowCheck = intConstNumberRowsToAnalyse 
End If

For intColumn = 1 To intlastColumn
    intdataTypelevel = 5

    For intRow = intDataStartRow To intRowCheck
    Application.Goto Reference:="R" & CStr(intRow) & "C" & CStr(intColumn)
    If ActiveCell.Value = "" Then   ' ignore blank (null) values
    ElseIf IsDate(ActiveCell.Value) = True And Len(ActiveCell.Value) >= 8 Then
        If intdataTypelevel > 4 Then intdataTypelevel = 4
    ElseIf IsNumeric(ActiveCell.Value) = True And InStr(1, CStr(ActiveCell.Value), ".") = 0 And (Left(CStr(ActiveCell.Value), 1) <> "0" Or ActiveCell.Value = "0") And Len(ActiveCell.Value) < 10 Then
        If intdataTypelevel > 3 Then intdataTypelevel = 3
    ElseIf IsNumeric(ActiveCell.Value) = True And InStr(1, CStr(ActiveCell.Value), ".") >= 1 Then
        If intdataTypelevel > 2 Then intdataTypelevel = 2
    Else
        intdataTypelevel = 1
        Exit For
    End If
    Next intRow
    If intdataTypelevel = 5 Then intdataTypelevel = 1
    strDataType(intColumn) = strDataTypeLevel(intdataTypelevel)
Next intColumn


' *** Build up the SQL
intFormulaCount = 1
If intHasHeaderRow = vbYes Then     ' *** Header Row ***
    Application.Goto Reference:="R4" & "C" & CStr(intlastColumn + 1)    ' Goto next column in first data row of selection
    strFormula(intFormulaCount) = "= ""SELECT "
    For intColumn = 1 To intlastColumn
    If strDataType(intColumn) = "DATETIME" Then         ' Code to take Excel Dates back to text
        strCellRef = "Text(" & fn_ColLetter(intColumn) & "4,""dd-mmm-yyyy hh:mm:ss"")"
    ElseIf strDataType(intColumn) = "VARCHAR(1000)" Then
        strCellRef = "SUBSTITUTE(" & fn_ColLetter(intColumn) & "4,""'"",""''"")" ' Convert any single ' to double ''
    Else
        strCellRef = fn_ColLetter(intColumn) & "4"
    End If


    strFormula(intFormulaCount) = strFormula(intFormulaCount) & "CAST('""& " & strCellRef & " & ""' AS " & strDataType(intColumn) & ") AS [" & strColumnHeader(intColumn) & "]"
    If intColumn < intlastColumn Then
        strFormula(intFormulaCount) = strFormula(intFormulaCount) + ", "
    Else
        strFormula(intFormulaCount) = strFormula(intFormulaCount) + " UNION ALL """
    End If
    ' since each cell can only hold a maximum no. of chars if Formula string gets too big continue formula in adjacent cell
    If Len(strFormula(intFormulaCount)) > 700 And intColumn < intlastColumn Then
        strFormula(intFormulaCount) = strFormula(intFormulaCount) + """"
        intFormulaCount = intFormulaCount + 1
        strFormula(intFormulaCount) = "= """
    End If
    Next intColumn

 ' Assign the formula to the cell(s) just right of the selection
    For intColumn = 1 To intFormulaCount
    ActiveCell.Value = strFormula(intColumn)
    If intColumn < intFormulaCount Then ActiveCell.Offset(0, 1).Range("A1").Select  ' Goto next column
    Next intColumn


 ' Auto Fill the formula for the full length of the selection
    ActiveCell.Offset(0, -intFormulaCount + 1).Range("A1:" & fn_ColLetter(intFormulaCount) & "1").Select
    If intLastRow > 4 Then Selection.AutoFill Destination:=Range(fn_ColLetter(intlastColumn + 1) & "4:" & fn_ColLetter(intlastColumn + intFormulaCount) & CStr(intLastRow)), Type:=xlFillDefault

 ' Go to start row of data selection to add 'Select into' code
   ActiveCell.Value = "SELECT * INTO " & strSQLTableName_Encap & " FROM (" & ActiveCell.Value

 ' Go to cells above data to insert code for deleting old table with the same name in separate SQL batch
   ActiveCell.Offset(-1, 0).Range("A1").Select  ' go to the row above
   ActiveCell.Value = "GO"
   ActiveCell.Offset(-1, 0).Range("A1").Select  ' go to the row above
   If Left(strSQLTableName, 1) = "#" Then      ' temp table
       ActiveCell.Value = "IF OBJECT_ID('tempdb.." & strSQLTableName & "') IS NOT NULL DROP TABLE " & strSQLTableName_Encap
   Else
       ActiveCell.Value = "IF OBJECT_ID('" & strSQLTableName & "') IS NOT NULL DROP TABLE " & strSQLTableName_Encap
   End If



' For Big selections (i.e. several 100 or 1000 rows) SQL Server takes a very long time to do a multiple union - Split up the table creation into many inserts
    intRow = intConstMaxBatchSize + 4   ' add 4 to make sure 1st batch = Max Batch Size
    While intRow < intLastRow
    Application.Goto Reference:="R" & CStr(intRow - 1) & "C" & CStr(intlastColumn + intFormulaCount)  ' Goto Row before intRow and the last column in formula selection
    ActiveCell.Value = Replace(ActiveCell.Value, " UNION ALL ", " ) a") ' Remove last 'UNION ALL'

    Application.Goto Reference:="R" & CStr(intRow) & "C" & CStr(intlastColumn + 1)    ' Goto intRow and the first column in formula selection
    ActiveCell.Value = "INSERT " & strSQLTableName_Encap & " SELECT * FROM (" & ActiveCell.Value
    intRow = intRow + intConstMaxBatchSize   ' increment intRow by intConstMaxBatchSize
    Wend


    ' Delete the last 'UNION AlL' replacing it with brackets to mark the end of the last insert
    Application.Goto Reference:="R" & CStr(intLastRow) & "C" & CStr(intlastColumn + intFormulaCount)
    ActiveCell.Value = Replace(ActiveCell.Value, " UNION ALL ", " ) a")

    ' Select all the formula cells
    ActiveCell.Offset(-intLastRow + 2, 1 - intFormulaCount).Range("A1:" & fn_ColLetter(intFormulaCount + 1) & CStr(intLastRow - 1)).Select
Else    ' *** No Header Row ***
    Application.Goto Reference:="R3" & "C" & CStr(intlastColumn + 1)    ' Goto next column in first data row of selection
    strFormula(intFormulaCount) = "= ""SELECT "

    For intColumn = 1 To intlastColumn
    If strDataType(intColumn) = "DATETIME" Then
        strCellRef = "Text(" & fn_ColLetter(intColumn) & "3,""dd-mmm-yyyy hh:mm:ss"")"   ' Format Excel dates into a text Date format that SQL will pick up
    ElseIf strDataType(intColumn) = "VARCHAR(1000)" Then
        strCellRef = "SUBSTITUTE(" & fn_ColLetter(intColumn) & "3,""'"",""''"")"         ' Change all single ' to double ''
    Else
        strCellRef = fn_ColLetter(intColumn) & "3"
    End If

    ' Since no column headers: Name each column "Column001",Column002"..
    strFormula(intFormulaCount) = strFormula(intFormulaCount) & "CAST('""& " & strCellRef & " & ""' AS " & strDataType(intColumn) & ") AS [Column" & CStr(intColumn) & "]"
    If intColumn < intlastColumn Then
        strFormula(intFormulaCount) = strFormula(intFormulaCount) + ", "
    Else
        strFormula(intFormulaCount) = strFormula(intFormulaCount) + " UNION ALL """
    End If

    ' since each cell can only hold a maximum no. of chars if Formula string gets too big continue formula in adjacent cell
    If Len(strFormula(intFormulaCount)) > 700 And intColumn < intlastColumn Then
        strFormula(intFormulaCount) = strFormula(intFormulaCount) + """"
        intFormulaCount = intFormulaCount + 1
        strFormula(intFormulaCount) = "= """
    End If
    Next intColumn

    ' Assign the formula to the cell(s) just right of the selection
    For intColumn = 1 To intFormulaCount
    ActiveCell.Value = strFormula(intColumn)
    If intColumn < intFormulaCount Then ActiveCell.Offset(0, 1).Range("A1").Select  ' Goto next column
    Next intColumn

 ' Auto Fill the formula for the full length of the selection
    ActiveCell.Offset(0, -intFormulaCount + 1).Range("A1:" & fn_ColLetter(intFormulaCount) & "1").Select
    If intLastRow > 4 Then Selection.AutoFill Destination:=Range(fn_ColLetter(intlastColumn + 1) & "3:" & fn_ColLetter(intlastColumn + intFormulaCount) & CStr(intLastRow)), Type:=xlFillDefault

 ' Go to start row of data selection to add 'Select into' code
   ActiveCell.Value = "SELECT * INTO " & strSQLTableName_Encap & " FROM (" & ActiveCell.Value

 ' Go to cells above data to insert code for deleting old table with the same name in separate SQL batch
   ActiveCell.Offset(-1, 0).Range("A1").Select  ' go to the row above
   ActiveCell.Value = "GO"
   ActiveCell.Offset(-1, 0).Range("A1").Select  ' go to the row above
   If Left(strSQLTableName, 1) = "#" Then      ' temp table
       ActiveCell.Value = "IF OBJECT_ID('tempdb.." & strSQLTableName & "') IS NOT NULL DROP TABLE " & strSQLTableName_Encap
   Else
       ActiveCell.Value = "IF OBJECT_ID('" & strSQLTableName & "') IS NOT NULL DROP TABLE " & strSQLTableName_Encap
   End If

  ' For Big selections (i.e. serveral 100 or 1000 rows) SQL Server takes a very long time to do a multiple union - Split up the table creation into many inserts
   intRow = intConstMaxBatchSize + 3        ' add 3 to make sure 1st batch = Max Batch Size
    While intRow < intLastRow
    Application.Goto Reference:="R" & CStr(intRow - 1) & "C" & CStr(intlastColumn + intFormulaCount)  ' Goto Row before intRow and the last column in formula selection
    ActiveCell.Value = Replace(ActiveCell.Value, " UNION ALL ", " ) a") ' Remove last 'UNION ALL'

    Application.Goto Reference:="R" & CStr(intRow) & "C" & CStr(intlastColumn + 1)    ' Goto intRow and the first column in formula selection
    ActiveCell.Value = "INSERT " & strSQLTableName_Encap & " SELECT * FROM (" & ActiveCell.Value
    intRow = intRow + intConstMaxBatchSize   ' increment intRow by intConstMaxBatchSize
    Wend

    ' Delete the last 'UNION AlL'
    Application.Goto Reference:="R" & CStr(intLastRow) & "C" & CStr(intlastColumn + intFormulaCount)
    ActiveCell.Value = Replace(ActiveCell.Value, " UNION ALL ", " ) a")

    ' Select all the formula cells
    ActiveCell.Offset(-intLastRow + 1, 1 - intFormulaCount).Range("A1:" & fn_ColLetter(intFormulaCount + 1) & CStr(intLastRow)).Select
End If


' Final Selection to clipboard and Cleaning of data
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False              ' Repaste "Values Only" back into cells
Selection.Replace What:="CAST('' AS", Replacement:="CAST(NULL AS", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False  ' convert all blank cells to NULL
Selection.Replace What:="'00-Jan-1900 00:00:00'", Replacement:="NULL", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False  ' convert all blank Date cells to NULL
Selection.Replace What:="'NULL'", Replacement:="NULL", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False  ' convert all 'NULL' cells to NULL
Selection.Replace What:=vbTab, Replacement:=" ", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False        ' Replace all Tabs in cells to Space to prevent Double Quotes occuring in the final paste text
Selection.Copy


MsgBox "SQL Code has been added to clipboard - Please Paste into SSMS window", vbOKOnly, "Transfer to SQL"

Application.DisplayAlerts = False       ' Temporarily switch off Display Alerts
ActiveWindow.Close                      ' Delete newly created worksheet
Application.DisplayAlerts = True        ' Switch display alerts back on



End Sub




Function fn_ColLetter(Col As Integer) As String

Dim strColLetter As String

If Col > 26 Then
    ' double letter columns
    strColLetter = Chr(Int((Col - 1) / 26) + 64) & _
        Chr(((Col - 1) Mod 26) + 65)
Else
    ' single letter columns
    strColLetter = Chr(Col + 64)
End If
fn_ColLetter = strColLetter
End Function

1
Dies ist die Art von Lösung, nach der ich gesucht habe. Dadurch werden SQL Insert-Anweisungen generiert, die viel schneller ausgeführt werden als das Einfügen in das Raster "Top 200 Zeilen bearbeiten". Diese Funktion setzt voraus, dass Sie eine neue Tabelle erstellen. Ich möchte, dass es EINFÜGT, indem die Spalten explizit benannt werden, was bei Verwendung SET IDENTITY_INSERT [tablename] ON;einer vorhandenen Tabelle erforderlich ist . Wenn Sie ein Update davon haben, teilen Sie es mir bitte mit oder senden Sie mir eine PM.
Ben

2

Ich würde denken, dass einige Datenbanken Daten aus CSV-Dateien (Comma Separated Values) importieren können, die Sie aus Excel exportieren können. Zumindest ist es ganz einfach, einen CSV-Parser (finden Sie einen für Ihre Sprache, versuchen Sie nicht, einen selbst zu erstellen - es ist schwieriger als es aussieht), um ihn in die Datenbank zu importieren.

Ich bin mit MS SQL nicht vertraut, aber es würde mich nicht überraschen, wenn es direkt unterstützt wird.

In jedem Fall denke ich, dass die Anforderung sein muss, dass die Struktur im Exel-Blatt und in der Datenbanktabelle ähnlich ist.


0

Wenn die Benutzeroberfläche so funktioniert, wie sie zuletzt verwendet wurde, können Sie die Region in Excel auswählen, kopieren, SQL Server öffnen und die Daten wie bei Access in die Tabelle einfügen.

Oder Sie können eine ODBC-Verbindung zwischen Excel und SQL Server einrichten.



-2

Können Sie nicht VBA-Code verwenden, um die Kopie von Excel zu erstellen und in SSMS-Vorgänge einzufügen?


Dies ist keine Antwort und lediglich ein Kommentar. Antworten sollten Antworten sein, keine andere Frage.
Ashveli
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.