met sqlcmd data exporteren naar CSV met speciale opties

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Tripwire999
  • Registratie: Januari 2004
  • Laatst online: 10-10 20:19
Ik vroeg mij af of het mogelijk is om via sqlcmd een export te maken van bepaalde data naar CSV, maar dan niet op de normale CSV export methode.

Normale manier (voor zover ik weet)
Afbeeldingslocatie: http://www.mupload.nl/img/d1q8ayzy0wz.png

En nu heb ik een aantal klanten die de CSV op deze manier geformatteerd willen hebben:

Afbeeldingslocatie: http://www.mupload.nl/img/om6j8u9oy9b.png


Ik heb even Excel gebruikt om te laten zien wat ik bedoel, is nogal lastig uit te leggen denk ik.


Ik ben nu dus bezig een programma te schrijven in c# waarin je allerlei van dit soort opties kan kiezen om je CSV te exporteren. De bedoeling is:

C# tool -> Schrijft SQL file weg
C# tool -> Schrijft batch file weg met sqlcmd die SQL file uitvoert
C# tool -> Voegt een recurring task toe aan de Task scheduler van Windows die de batch file aanroept

Eventueel komt hier ook nog het mailen van de CSV bij.

[ Voor 86% gewijzigd door Tripwire999 op 07-10-2015 16:39 ]


Acties:
  • 0 Henk 'm!

  • P-Storm
  • Registratie: September 2006
  • Laatst online: 10:44
Als het telkens om dezelfde tabellen gaat, is het dan geen optie om naar Entity Framework te kijken? Dan hoef je niet een batch file te maken en aan de gang te gaan met sqlcmd.

Mailen in C# is vrij makkelijk, tenzij je ingewikkelde dingen wilt gaan doen. Dan is mogelijk een optie om naar een (betaalde) framework te zoeken.

Het voorbeeld wat je geeft is trouwens getransponeerde data. :)

Acties:
  • 0 Henk 'm!

  • HansvDr
  • Registratie: Augustus 2009
  • Niet online
Waarom niet gewoon een command line tool in C# maken die alles doet?

Gewoon met Ado.

Sqlcmd heb je helemaal niet nodig.

Acties:
  • 0 Henk 'm!

  • Tripwire999
  • Registratie: Januari 2004
  • Laatst online: 10-10 20:19
P-Storm schreef op woensdag 07 oktober 2015 @ 18:36:
Als het telkens om dezelfde tabellen gaat, is het dan geen optie om naar Entity Framework te kijken? Dan hoef je niet een batch file te maken en aan de gang te gaan met sqlcmd.

Mailen in C# is vrij makkelijk, tenzij je ingewikkelde dingen wilt gaan doen. Dan is mogelijk een optie om naar een (betaalde) framework te zoeken.

Het voorbeeld wat je geeft is trouwens getransponeerde data. :)
Entity framework kende ik nog niet ga ik naar kijken thx!

EDIT:
Na een aantal documenten doorgelezen te hebben over het Entity framework, denk ik niet dat het de juiste keuze is. We hebben wel een aantal databases die hetzelfde zijn. Maar eigenlijk moet de tool die ik aan het maken ben op alle MSSQL database structuren toepasbaar zijn. We gebruiken atm 2 / 3 verschillende maar dat kan in de toekomst veranderen.
HansvDr schreef op woensdag 07 oktober 2015 @ 21:48:
Waarom niet gewoon een command line tool in C# maken die alles doet?

Gewoon met Ado.

Sqlcmd heb je helemaal niet nodig.
In eerste instantie omdat het een soort van Wizard moet zijn, het zou inderdaad kunnen dat deze een commandline opdracht maakt. Ook gaat het over nogal veel data (kan bijvoorbeeld zomaar zijn dat het 200000 rows gaat in een maand of iets dergelijks), dus vandaar dat ik bedacht had om het via sqlcmd te doen :)
Maar ik sta altijd open voor suggesties dus mocht iemand een beter idee hebben hoor ik het graag :)

[ Voor 12% gewijzigd door Tripwire999 op 08-10-2015 09:41 ]


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE PROCEDURE spColumnsToRows (@TableName NVARCHAR(500))

AS
 
DECLARE     @ColumnNames  NVARCHAR(MAX) = N'',
            @ColumnValues NVARCHAR(MAX) = N'',
            @sql       NVARCHAR(MAX) = N'';

SELECT   @ColumnNames += ', ' + QUOTENAME(name), @ColumnValues += ', ' + QUOTENAME(name) + ' = CONVERT(VARCHAR(320), ' + QUOTENAME(name) + ')'
FROM sys.columns
WHERE [object_id] = OBJECT_ID(@TableName)

SET @sql = N'SELECT Property, Value
FROM
(
  SELECT ' + RIGHT(@ColumnValues, LEN(@ColumnValues)-1) + '
   FROM ' + @TableName + '
) AS pvt
UNPIVOT
(
  Value FOR Property IN (' + STUFF(@ColumnNames, 1, 1, '') + ')
) AS upvt;';

EXEC sp_executesql @sql;


Deze sp kun je vervolgens aanroepen met spColumnsToRows 'TabelNaam' en je krijgt de gevraagde output. Dat via sqlcmd of een eenvoudig command line tool oid uitvoeren naar csv en gaan zou ik zeggen. Geen garanties over hoe dit performed met grote hoeveelheden.

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • Tripwire999
  • Registratie: Januari 2004
  • Laatst online: 10-10 20:19
P_de_B schreef op donderdag 08 oktober 2015 @ 10:22:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE PROCEDURE spColumnsToRows (@TableName NVARCHAR(500))

AS
 
DECLARE     @ColumnNames  NVARCHAR(MAX) = N'',
            @ColumnValues NVARCHAR(MAX) = N'',
            @sql       NVARCHAR(MAX) = N'';

SELECT   @ColumnNames += ', ' + QUOTENAME(name), @ColumnValues += ', ' + QUOTENAME(name) + ' = CONVERT(VARCHAR(320), ' + QUOTENAME(name) + ')'
FROM sys.columns
WHERE [object_id] = OBJECT_ID(@TableName)

SET @sql = N'SELECT Property, Value
FROM
(
  SELECT ' + RIGHT(@ColumnValues, LEN(@ColumnValues)-1) + '
   FROM ' + @TableName + '
) AS pvt
UNPIVOT
(
  Value FOR Property IN (' + STUFF(@ColumnNames, 1, 1, '') + ')
) AS upvt;';

EXEC sp_executesql @sql;


Deze sp kun je vervolgens aanroepen met spColumnsToRows 'TabelNaam' en je krijgt de gevraagde output. Dat via sqlcmd of een eenvoudig command line tool oid uitvoeren naar csv en gaan zou ik zeggen. Geen garanties over hoe dit performed met grote hoeveelheden.
Thx! Ik denk dat het hiermee wel moet lukken :)
Pagina: 1