Kan MS SQL automatiskt skanna, läsa och importera .csv filer?

Trädvy Permalänk
Medlem
Plats
Örnsköldsvik
Registrerad
Jun 2008

Kan MS SQL automatiskt skanna, läsa och importera .csv filer?

Hej!

Jag är helt ny när det kommer till SQL. Normalt brukar jag använda C# när jag importerar till SQL databaser då jag arbetar i en windowsmiljö.

Min fråga till er är om det fungerar att skapa ett SQL skript i Microsoft SQL för att skanna av .csv filer i en mapp, läsa av dessa filer och importera dessa i en databas?

Är detta möjligt?
När jag menar SQL skript så menar jag inte ett skript + en .bat fil med en MS-dos ruta som "loopar" igenom en oändlig whileloop. Jag menar mer en inställning i Microsoft SQL för att köra detta skript för varje 30:e minut.

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Avstängd
Registrerad
Jul 2017

Du kan köra tasks i SQL Server Agent förutsatt att den är installerad annars får du köra ett script med Task Scheduler i Windows.

Tror det är BULK INSERT du letar efter.
https://docs.microsoft.com/en-us/sql/t-sql/statements/bulk-in...

Trädvy Permalänk
Medlem
Registrerad
Jul 2013

Som ovanstående nämner, ett schemalagt sql server agent job är nog snyggaste lösningen.

Ett annat alternativ är ju att schemalägga ett powershell-script.

Ex http://www.sqlteam.com/article/fast-csv-import-in-powershell-...

Trädvy Permalänk
Medlem
Plats
Örnsköldsvik
Registrerad
Jun 2008
Skrivet av sickhouse:

Som ovanstående nämner, ett schemalagt sql server agent job är nog snyggaste lösningen.

Ett annat alternativ är ju att schemalägga ett powershell-script.

Ex http://www.sqlteam.com/article/fast-csv-import-in-powershell-...

Så vad rekommenderas för mig om jag vill snabbt komma igång?

Själva SQL databasen ska någon annan skapa åt mig. Så det viktigaste för mig är att skapa en funktion som hanterar filer endast.

Då är powershell som är schemalagt den bästa lösningen ?

Hur många kolumner kan MS SQL 2012 ha? Eller är det antal totala tecken på en rad som räknas ?

Skickades från m.sweclockers.com

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2010

Bulk insert är ju den klassiska metoden (dock inte lika klassisk som BCP) och är enkel och hyfsat stabil men annars finns det ju SSIS-paket som du kan skapa i SSMS, schemalägga osv. Kolla exempelvis: http://sqlknowledgebank.blogspot.se/2013/05/ssis-dynamic-flat...

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2010
Skrivet av heretic16:

Så vad rekommenderas för mig om jag vill snabbt komma igång?

Själva SQL databasen ska någon annan skapa åt mig. Så det viktigaste för mig är att skapa en funktion som hanterar filer endast.

Då är powershell som är schemalagt den bästa lösningen ?

Hur många kolumner kan MS SQL 2012 ha? Eller är det antal totala tecken på en rad som räknas ?

Skickades från m.sweclockers.com

Vad vi gjorde på mitt förra jobb där vi hanterade oerhörda mängder av filimporter till SQL Server var att först importera allt till en staging-tabell (med BCP, Bulk import eller SSIS) och sen, i exempelvis en stored procedure, separera det enligt diverse regler beroende på hur filerna såg ut in till en eller flera tabeller.

Trädvy Permalänk
Medlem
Plats
Örnsköldsvik
Registrerad
Jun 2008
Skrivet av snajk:

Vad vi gjorde på mitt förra jobb där vi hanterade oerhörda mängder av filimporter till SQL Server var att först importera allt till en staging-tabell (med BCP, Bulk import eller SSIS) och sen, i exempelvis en stored procedure, separera det enligt diverse regler beroende på hur filerna såg ut in till en eller flera tabeller.

Kan SSIS, BCP och bulkimport skanna csv filer i en mapp och sedan läsa dem?

Filerna ska raderas sedan.

Skickades från m.sweclockers.com

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2010
Skrivet av heretic16:

Kan SSIS, BCP och bulkimport skanna csv filer i en mapp och sedan läsa dem?

Filerna ska raderas sedan.

Skickades från m.sweclockers.com

Absolut. Har för mig att bcp är deprecated men det kan funka på 2012.

Trädvy Permalänk
Medlem
Plats
Örnsköldsvik
Registrerad
Jun 2008
Skrivet av snajk:

Absolut. Har för mig att bcp är deprecated men det kan funka på 2012.

Okej. Men då tror jag att ett schemalagdt SQL skript är nog min lösning.

Hur många kolumner kan MS SQL ha? Eller är det antal totala antalet tecken som räknas ?

Skickades från m.sweclockers.com

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2010
Skrivet av heretic16:

Okej. Men då tror jag att ett schemalagdt SQL skript är nog min lösning.

Hur många kolumner kan MS SQL ha? Eller är det antal totala antalet tecken som räknas ?

Skickades från m.sweclockers.com

En kolumn varchar kan ha max 8000 tecken tror jag, nvarchar 4000. Antal kolumner vet jag inte men slår du i taket bör du nog fundera på att använda flera tabeller.

Trädvy Permalänk
Medlem
Registrerad
Sep 2017
Skrivet av heretic16:

Så vad rekommenderas för mig om jag vill snabbt komma igång?

Själva SQL databasen ska någon annan skapa åt mig. Så det viktigaste för mig är att skapa en funktion som hanterar filer endast.

Då är powershell som är schemalagt den bästa lösningen ?

Hur många kolumner kan MS SQL 2012 ha? Eller är det antal totala tecken på en rad som räknas ?

Skickades från m.sweclockers.com

Om du brukar jobba med C# så skulle jag lägga ett schemalagt C# program istället för ett skript. Skriptet är ju också program och jobbar på samma sätt så du vinner inget på att göra ett skript. Lägg in det i Task Scheduler i Windows Server helt enkelt.

Frågan är varifrån kommer csv filen. Du kan behöva göra lite formattering i den. Och hur kommer den till servern? Du kanske inte ska importera csv filen var 30:e minut rakt av ifall det råkar vara samma csv fil, dvs den ej blivit uppdaterad.

Ofta behövs det lite mer intelligens än vad man först tänker. T ex vad ska hända ifall det blir fel i importen? Antagligen skulle du behöva någon slags loggfil så du kan kolla att import har skett och när det skett och när det inte har skett. Om importen inte fungerar kanske det ska gå iväg ett mail till admin eller någon annan info. Som sagt det kan bli lite mer omfattande än man tror. Då tycker jag att det är bäst att använda de verktyg som man är mest insatt i och som klarar jobbet.

Trädvy Permalänk
Medlem
Plats
Örnsköldsvik
Registrerad
Jun 2008
Skrivet av niterider:

Om du brukar jobba med C# så skulle jag lägga ett schemalagt C# program istället för ett skript. Skriptet är ju också program och jobbar på samma sätt så du vinner inget på att göra ett skript. Lägg in det i Task Scheduler i Windows Server helt enkelt.

Frågan är varifrån kommer csv filen. Du kan behöva göra lite formattering i den. Och hur kommer den till servern? Du kanske inte ska importera csv filen var 30:e minut rakt av ifall det råkar vara samma csv fil, dvs den ej blivit uppdaterad.

Ofta behövs det lite mer intelligens än vad man först tänker. T ex vad ska hända ifall det blir fel i importen? Antagligen skulle du behöva någon slags loggfil så du kan kolla att import har skett och när det skett och när det inte har skett. Om importen inte fungerar kanske det ska gå iväg ett mail till admin eller någon annan info. Som sagt det kan bli lite mer omfattande än man tror. Då tycker jag att det är bäst att använda de verktyg som man är mest insatt i och som klarar jobbet.

Så om jag gör en .exe fil i C# som anropas av Windows Server så borde det fungera ?

Csv filerna ligger på en FTP server som jag har möjlighet att komma åt. Csv filerna genereras automatiskt av ett knapptryck och alla csv filer har exakt samma rad och kolumnstruktur.

Idag fungerar mitt C# program så här.

1. Logga in på mappen där alla filer är.
2. Skanna alla filer och öppna alla filer som slutar på ".csv".
3. Anslut till databasen.
4. Läs varje csv fil och lägg in i databasen.
5. Spara och stäng databasen.
6. Ta bort filerna som är lästa.
7. Logga ut från mappen.

Självklart har jag try och catch med också. Dock inte något epostmeddelande. Men sådant borde väll vara busenkelt i C# att fixa ?

Skickades från m.sweclockers.com

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Registrerad
Sep 2017
Skrivet av heretic16:

Så om jag gör en .exe fil i C# som anropas av Windows Server så borde det fungera ?

Japp.

I Task Scheduler så anger du vilken mapp programmet ska köras ifrån, hur programmet startas, när/hur ofta det ska köras, hur länge det får köra osv, osv.

Trädvy Permalänk
Medlem
Plats
Örnsköldsvik
Registrerad
Jun 2008
Skrivet av niterider:

Japp.

I Task Scheduler så anger du vilken mapp programmet ska köras ifrån, hur programmet startas, när/hur ofta det ska köras, hur länge det får köra osv, osv.

Vad bra. Då kan jag använda mitt C# program. Detta program är endast en MS-DOS <3 ruta. Tasken kanske kör programmet utan denna MS-DOS <3 ruta ?

Skickades från m.sweclockers.com

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Örnsköldsvik
Registrerad
Jun 2008
Skrivet av snajk:

En kolumn varchar kan ha max 8000 tecken tror jag, nvarchar 4000. Antal kolumner vet jag inte men slår du i taket bör du nog fundera på att använda flera tabeller.

Är det inte 8000 tecken totalt på en rad ? Jag kommer ha 1045 kolumner på en rad. Antal tecken per cell är 3-8 tecken.

Skickades från m.sweclockers.com

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jul 2007
Skrivet av heretic16:

Är det inte 8000 tecken totalt på en rad ? Jag kommer ha 1045 kolumner på en rad. Antal tecken per cell är 3-8 tecken.

Skickades från m.sweclockers.com

1045 kolumner I en tabell??? Vad tusan är det du ska parsa? Hur ska det användas, till vad?

Med rätt konfiguration så syns inte konsolen för din c#app om du kör den genom taskschedulern. Men du kan nog få mer "umpf" om du bygger ett ssis-paket än att hackar egen importkod.

WS: Bärbar workstation, 2 * Dell U2412M
HTPC: Intel NUC, Canton GLE 496, Yamaha RV-A830, Sanyo PLV-Z700
Server: Intel Xeon E3-1240@3.4 GHz, ESXi, 32GB RAM, 8*2TB RAID-Z2 + SSD-cache
Slösurf: MacBook Air 11,6", Samsung S8
Kamera: Canon EOS 5DII + 1DIII, Canon 100/2.8 Macro, Canon 70-200/2.8L, Canon 24-70/2.8L

Trädvy Permalänk
Medlem
Plats
Örnsköldsvik
Registrerad
Jun 2008
Skrivet av zyberzero:

1045 kolumner I en tabell??? Vad tusan är det du ska parsa? Hur ska det användas, till vad?

Med rätt konfiguration så syns inte konsolen för din c#app om du kör den genom taskschedulern. Men du kan nog få mer "umpf" om du bygger ett ssis-paket än att hackar egen importkod.

Det är data på ett en körning av ström och tid. Därför blir det så långt. Men detta borde SQL klara av ?

Skickades från m.sweclockers.com

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Avstängd
Registrerad
Jul 2017
Skrivet av heretic16:

Det är data på ett en körning av ström och tid. Därför blir det så långt. Men detta borde SQL klara av ?

Skickades från m.sweclockers.com

Bara för att varje rad har så många kolumner när du läser in betyder ju inte att du måste spara det så. Om varje kolumn är datum så får det bli en kolumn för datum och tid och en kolumn för själva mätvärdet till exempel.

Är visserligen enkelt att skriva själv men kan tipsa om att det går utmärkt att använda visual basics TextFieldParser även från C#
https://msdn.microsoft.com/en-us/library/microsoft.visualbasi...

Angående antal kolumner blir det väl gränsen för insert query du kommer stöta på isåfall och det verkar vara 4096 kolumner
https://docs.microsoft.com/en-us/sql/sql-server/maximum-capac...

Trädvy Permalänk
Medlem
Plats
Varberg
Registrerad
Aug 2009

Kolla på ssis, för denna typ av saker som det är gjort, du får även med flytt av dokument osv, du kan lägga den att köra varannan minut om du vill, först gör den bara en check om det finns filer av typen.
Sedan kan det vara riktigt bra att kunna på sikt, ssis är en typisk sådan där, jaha, man kan göra detta, men då kan vi ju förenkla detta...

ASUS P9X79 | RX 580 | Corsair DDR3 XMS3 8x8Gb | Intel I7 3820 | 2x Samsung 840 Pro 256Gb + 1 Intel 520 256 + 1 Crucial M500 256Gb
DELL XPS 15 | I7 | 512GB | 16GB ram | 4K EYEFINITY

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2010
Skrivet av heretic16:

Är det inte 8000 tecken totalt på en rad ? Jag kommer ha 1045 kolumner på en rad. Antal tecken per cell är 3-8 tecken.

Skickades från m.sweclockers.com

Det bör inte vara några problem. Sen tror jag att du borde fundera på datatyper i kolumnerna och inte spara allt som strängar då det ju inte är strängar det handlar om egentligen. Spara tid som datetime, decimaltal som decimal eller float exempelvis.

Och jag antar att datan är strukturerad så du alltid får ut samma typer av värden på samma ställen? Då bör du kanske tänka på att använda möjligheten till relationstabeller i relationsdatabasen. Säg att kolumn 1 är tiden för mätningen och alla efterföljande kolumner är mätdata vid denna tid från ett antal olika sensorer. Då skulle du kunna ha en tabell per sensor så att du får 1044 tabeller med två fält varav ett datetime och ett för mätdatan, men det beror förstås på vad det är för data och hur den ska användas.

Sen håller jag med @orig_rejser att SSIS passar ypperligt för en sådan här operation, kanske tillsammans med något steg till som kan vara en stored procedure eller exempelvis en körning av ett konsollprogram som manipulerar eller strukturerar datan, i ett job i SQL Server. Schemaläggning sköts då direkt i SQL Server och loggfiler är enkelt åtkomliga osv. Det går förstås att bygga en applikation som gör det i valfritt språk också men schemaläggning är ju smidigt i SQL Server och man får väldigt mycket på köpet liksom, typ felhantering, loggning och så.

Trädvy Permalänk
Medlem
Plats
Varberg
Registrerad
Aug 2009
Skrivet av snajk:

Sen håller jag med @orig_rejser att SSIS passar ypperligt för en sådan här operation, kanske tillsammans med något steg till som kan vara en stored procedure eller exempelvis en körning av ett konsollprogram som manipulerar eller strukturerar datan, i ett job i SQL Server. Schemaläggning sköts då direkt i SQL Server och loggfiler är enkelt åtkomliga osv. Det går förstås att bygga en applikation som gör det i valfritt språk också men schemaläggning är ju smidigt i SQL Server och man får väldigt mycket på köpet liksom, typ felhantering, loggning och så.

Man kan ju köra c# script i ssis som ett steg om inte den vanliga datamanipulationen räcker till.
SSiS täcker ju verkligen allt med ftp-hämtning, uppladdning, flyttning, data-transformering, enskilda Querys osv osv.
(jag älskar ssis )

ASUS P9X79 | RX 580 | Corsair DDR3 XMS3 8x8Gb | Intel I7 3820 | 2x Samsung 840 Pro 256Gb + 1 Intel 520 256 + 1 Crucial M500 256Gb
DELL XPS 15 | I7 | 512GB | 16GB ram | 4K EYEFINITY

Trädvy Permalänk
Medlem
Registrerad
Sep 2017

Om jag förstår det rätt så vill man använda SSIS (SQL Server Integration Services) så behövs SSDT (SQL Server Data Tools).
https://docs.microsoft.com/en-us/sql/ssdt/download-sql-server...

Läs kommentarerna i länken. Många som har problem.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2010
Skrivet av niterider:

Om jag förstår det rätt så vill man använda SSIS (SQL Server Integration Services) så behövs SSDT (SQL Server Data Tools).
https://docs.microsoft.com/en-us/sql/ssdt/download-sql-server...

Läs kommentarerna i länken. Många som har problem.

Nej, ssis har inget med ssdt att göra. Ssdt har att göra med att ansluta till och deploya databaser från visual studio, ssis kan lika gärna skapas och deployas från ssms. Ssdt är bra på många sätt men kan vara krångligt att sätta upp speciellt om man har ett avancerat databasprojekt, har dock inte testat i 2017.