none
SQL Server soll PowerShell ausführen RRS feed

  • Frage

  • hallo an alle, ich suche eine Möglichkeit eine Datei an Hand des "letzte Änderung" zu überprüfen ob eventuelle Tätigkeiten gemacht werden sollen. Nach langer Recherche bin ich auf PowerShell in Zusammenhang mit SQL Server gestoßen (Ok letzteres stand ja schon so gut wie fest *g*).

    nun möchte ich das ein Skript schau ob die Datei in einem Ordner mehr als das höchste Datum in der einer Spate einer Tabelle ist.

    ein erster Anfang für die Identifikation ist dieses nachfolgende Skript! Das funzt unter der Powershell Konsole bestens.

    $path="c:\Video"
    
    
    [datetime]$test = "12.20.2014"
    
    $DateiAlter=$test  # Zuweisung, die benutzt wird
    
    
    Foreach ($item in (dir –recurse $path))
    { 
    If (!( $item.PSIsContainer))         
    {              
                    If ($item.LastWriteTime –lt $DateiAlter)  
                    {             
                     Write-output "$($item.FullName)"#, $($item.LastWriteTime), $($item.Length)" 
    
                    }
    }
    }
     


    Aber wie bekomme ich das nun im SQL Server zum laufen?

    XP_CMDSHELL wurde aktiviert und folgendes funktioniert.

    EXECUTEmaster..XP_CMDSHELL'ECHO ICH BIN EIN TEST'

    Jedoch funktioniert dies nicht.

    EXECUTEmaster..XP_CMDSHELL'GET-DATE'

    Kann mir jemand auf die Sprünge helfen was ich verkehrt mache?

    Dienstag, 14. April 2015 20:36

Antworten

  • Aber das sollte doch eigentlich richtig sein.

    Wenn Du VB.NET nutzen würdest, wäre es halbwegs richtig; ich nehme an das hast Du auch von einem VB Beispiel.

    Du sprichst die Variable "User::FilePath" über einen sogenannten Indexer an, in C# geht das aber über die eckigen Klammer [ ], nicht über die runden ( ) =>

    Dts.Variables["User::FilePath"].Value.ToString()
    Und "Value" müsste AFAIK auch groß geschrieben warden.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Montag, 20. April 2015 07:18

Alle Antworten

  • Der SQL Server Agent unterstützt Powershell nativ als Auftragsschritt-Typ.

    (Ausführen von Windows PowerShell-Schritten in SQL Server-Agent)

    Die xp_cmdshell kann und sollte man dafür weiterhin abgeschaltet lassen.


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform, MCM, MVP
    www.SarpedonQualityLab.com | www.SQL-Server-Master-Class.com

    Dienstag, 14. April 2015 21:08
  • Oh Entschuldigung mein Fehler! Das läuft doch nur unter SQL Server 2012 und höher oder? Ich arbeite an einem SQL Server 2008

    Mittwoch, 15. April 2015 06:24
  • Mittwoch, 15. April 2015 06:27
  • Ah sehr gut dort hatte ich noch garnicht geschaut danke Olaf. Aber kann ich nicht auch irgendwie direkt mit dem Management Studio Abfragen machen die auch Powershell beinhalten? Genau diese Kombination benötige ich.

    Einfache Abfragen funktionieren ja wie EXECUTEmaster..XP_CMDSHELL'ECHO ICH BIN EIN TEST'

    Mittwoch, 15. April 2015 07:48
  • Nicht über T-SQL Abfragen, aber Du kannst PowerShell direkt über SSMS starten: Ausführen von Windows PowerShell über SQL Server Management Studio, wobei dann SqlPs = SQL Server-PowerShell gestartet wird, das zusätzliche SQL CmdLets zur Verfügung stellt.

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 15. April 2015 07:59
  • Aber das schafft mein SQL 2008 nicht oder? ich lese immer nur das dies erst ab 2012 möglich sei! deswegen habe ich nun mal quer zu diesem Thema geschaut ob das SSIS das kann. Jedoch auch hier Fehlanzeige! ich habe keinen Powershell Task.

    Wichtig wäre eben für mich meinen Wunschziel mit Powershell näher zu kommen.

    Mittwoch, 15. April 2015 08:35
  • Hier sind zwei Artikel zu dem Thema und SQL Server 2008 R2:
    https://technet.microsoft.com/de-de/library/cc281954(v=sql.105).aspx
    Übersicht über SQL Server PowerShell

    https://technet.microsoft.com/de-de/library/cc281962(v=sql.105).aspx
    Ausführen von SQL Server PowerShell
     HTH!

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu

    Mittwoch, 15. April 2015 08:49
    Beantworter
  • Aber das schafft mein SQL 2008 nicht oder? ich lese immer nur das dies erst ab 2012 möglich sei! deswegen habe ich nun mal quer zu diesem Thema geschaut ob das SSIS das kann. Jedoch auch hier Fehlanzeige! ich habe keinen Powershell Task.

    Wichtig wäre eben für mich meinen Wunschziel mit Powershell näher zu kommen.

    Also laut Doku ist PS bereits in SQL Server 2008 als Job-Typ verfügbar.

    https://technet.microsoft.com/de-de/library/cc281962%28v=sql.100%29?f=255&MSPPError=-2147217396

    Ich habe keinen 2008er mehr zum testen, aber auf 2008 R2 habe ich es verifizieren können.

    Zeig mir doch bitte mal das Ergebnis der folgenden Abfrage:

    SELECT subsystem FROM msdb.dbo.syssubsystems


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform, MCM, MVP
    www.SarpedonQualityLab.com | www.SQL-Server-Master-Class.com


    Mittwoch, 15. April 2015 09:02
  • Ich glaube ich habe gerade das SQL PS gefunden. Zumindestens kann ich dort Powershell absetzen und bekomme eine Ausgabe! Das ist sehr schön!

    Ich glaube das Skript von Andreas Wolter bestätigt dies auch (siehe Eintrag Powershell)

    ActiveScripting
    ANALYSISCOMMAND
    ANALYSISQUERY
    CmdExec
    Distribution
    LogReader
    Merge
    PowerShell
    QueueReader
    Snapshot
    SSIS
    TSQL

    Die Verwirrung kam zu Stand da ich in den Links stets den SQL Server 2008 auswählen wollte (unter Version) und dort der SQL 2008 nicht mehr aufgeführt war.

    Ok Thema Powershell geht auf SQL Server nicht abgehakt! Gibt es aber auch irgendwo eine Seite wie man Variablen aus T-SQL in Powershell nutzen kann und anders herum.

    Gibt es auch noch eine Möglichkeit den Powershell Task meinen BI-Studio (SSIS) beizubringen? kann man das irgendwie nachinstallieren im BI-Studio? 

    Mittwoch, 15. April 2015 09:27
  • Ok Thema Powershell geht auf SQL Server nicht abgehakt!

    Vielleicht beschreibst Du einfach mal, was genau Du machen willst. Du kannst aus PowerShell problemlos auf den SQL Server zugreifen und T-SQL Statements ausführen, über SMO (Server Management Object) kannst Du sogar objektorientiert arbeiten statt mit Plain T-SQL. Machbar ist mit PS so ziemlich alles.

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 15. April 2015 13:46
  • ...

    Ok Thema Powershell geht auf SQL Server nicht abgehakt! Gibt es aber auch irgendwo eine Seite wie man Variablen aus T-SQL in Powershell nutzen kann und anders herum.

    Gibt es auch noch eine Möglichkeit den Powershell Task meinen BI-Studio (SSIS) beizubringen? kann man das irgendwie nachinstallieren im BI-Studio? 

    wunderbar, dann sind wir ja auf der Zielgeraden.

    Zum Thema Variablen-Austausch schau Dir mal den folgenden Thread an: http://stackoverflow.com/questions/22811357/how-to-pass-parameters-to-sql-script-via-powershell

    BIDS selber ist ja nur eine Art Visual-Studio. SSIS kann man mittels PowerShell ansprechen bzw programmatisch ansprechen. Aber ob es das ist, was Du brauchst, weiss ich nicht. Sieh Dir mal folgende Threads an dazu:

    http://blogs.msdn.com/b/mattm/archive/2011/11/17/ssis-and-powershell-in-sql-server-2012.aspx

    http://www.databasejournal.com/features/mssql/ssis-2012-using-powershell-to-configure-package-execution-parameters.html

    Im Projekt/Paket selber gibt es das meines Wissens nicht.


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform, MCM, MVP
    www.SarpedonQualityLab.com | www.SQL-Server-Master-Class.com

    Mittwoch, 15. April 2015 14:06
  • zum Hintergrund vielleicht noch mal etwas weiter ausgeholt. Ziel ist es das Änderungsdatum mit Powershell besser zu nutzen.

    Wenn das Änderungsdatum einer Datei größer ist als der Zeitstempel in einer Tabelle auf dem MS-SQL Server dann soll ein DTSX Paket gestartet werden. Das ganze soll aber über die Jobverwaltung des SQL Servers laufen!

    Nun habe ich aber zwei Probleme zu beheben. Erstes Problem mein Wissensstand *g* daran lässt sich arbeiten. Zweitens mein BI Studio kenn nicht Powershell! Eine Testumgebung bei mir zu Hause schon! Deswegen weiß ich auch schon das es gehen könnte. 

    Das andere Problem das Powershell nicht auf meinen SQL Server 2008 geht konnte ich ja dank euer Hilfe revidieren.

    Ein ganz anderer Ansatz könnte auch noch sein: Das Tool was die Daten anzeigt ist Excel man könnte über ein Makro auch eine Verbindung zum SQL Server aufbauen lassen und so könnten die Daten direkt vor Ort geändert werden. Aber bei der Lösung bin ich komplett raus da ich absolut keine Ahnung von VB habe.

    Mittwoch, 15. April 2015 14:38
  • Okay

    und was fehlt jetzt noch?

    Das Handwerkszeug ist ja vorhanden:

    Der Auftragsschritt kann ja den Zeitstempel prüfen und dann entweder einen Fehler erzeigen, oder Erfolg vermelden und dann basierend darauf den nächsten Schritt starten oder halt nicht. Das BIDS hat damit mE nach Nichts zu tun.

    Alternative:

    In SSIS selber gibt es natürlich auch Tasks, die Dateiattribute prüfen können. Dann kann man sich den Powershell-Step sparen und einfach das Paket alle X Minuten/Stunden starten und das Paket prüft dann mit dem Dateisystem-Task, ob eine Weiterverarbeitung Sinn macht.

    Ich hoffe, ich habe das Thema richtig erfasst.


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform, MCM, MVP
    www.SarpedonQualityLab.com | www.SQL-Server-Master-Class.com


    Mittwoch, 15. April 2015 14:56
  • Hallo Andreas,

    ich kann mit SSIS das Dateiatribut wie letztes Änderungsdatum überprüfen? Könntest du mir hier ein Beispiel geben? Geht das mit allen Dateitypen? Bevorzugt XLSX (Excel)

    Mir wäre das viel lieber wenn ich alles mit einer Lösung machen könnte.

    Mittwoch, 15. April 2015 20:50
  • Hallo

    hier findet sich ein umfangreiches Beispiel, wie das Datum der letzten Änderung mittels Script-Task ermittelt.

    Get file properties with SSIS

    - Also nicht mit dem Dateisystem-Task, da hab ich mich falsch erinnert. Mit dem kann man nur grob gesagt Dateien kopieren etc und Attribute ändern.

    Der Dateityp ist bei einer so simplen Prüfung so oder so egal. :)


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform, MCM, MVP
    www.SarpedonQualityLab.com | www.SQL-Server-Master-Class.com

    Mittwoch, 15. April 2015 21:43
  • Hallo Andreas,

    genau solche eine Lösung habe ich gesucht. Das ist ja sozusagen das gleiche was ich mit PS vor hatte nun aber in C.

    Aber das mit der Messagebox bekomme ich nicht hin.

    using System;
    using System.Data;
    using Microsoft.SqlServer.Dts.Runtime;
    using System.Windows.Forms;
    
    
    namespace ST_ddad702c97574a84a9ef32a3a5117ce2.csproj
    {
        [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
        public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
        {
            
            #region VSTA generated code
            enum ScriptResults
            {
                Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
                Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
    
            };
            #endregion
    
            public void Main()
            {
                // TODO: Add your code here
                
    
                Dts.TaskResult = (int)ScriptResults.Success;
                Messagebox.Show(Dts.Variables("User::FilePath").value.ToString());
               
    
            }
        }
    }

    in dem Comments steht das man include System.Windows.Forms nutzen soll. Aber ich wüsste nicht warum ich das includieren soll?! Er nutzt doch schon using System.Windows.Forms und wenn ich einfach nach den using Bereich im Skript mit dem include komme läuft er trotzdem auf Fehler.

    Kannst du mir sagen wo mein Fehler liegt?

    Donnerstag, 16. April 2015 09:29
  • Hallo

    meine .Net Skills, sind leider nicht so ausgeprägt.

    Aber: warum würde man aus einem Background task heraus eine Message-Box erzeiugen wollen?

    Zum Debuggen kann ich es mir ja gerade noch vorstellen. Aber dann müsste es eh wieder raus. Ich würde mir also da keine Mühe mit geben sondern einfach das Debug-Window mit den Variablen verwenden. Das ist ja genau dafür da. Ich spare mir jetzt mal einen Link, da google da gleich massig zu auswirft. :)


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform, MCM, MVP
    www.SarpedonQualityLab.com | www.SQL-Server-Master-Class.com

    Donnerstag, 16. April 2015 10:00
  • Hallo Andreas,

    danke noch mal für das Skript. Bis jetzt läuft es erst mal aber! mit Einschränkungen. Da ich mit dem V-Studio nicht so ganz Klarkomme nutze ich das was ich weiß. Ich lass mir einfach den Inhalt der Variablen per Mail schicken. Nun habe ich aber das Problem das die Variable

    Value = fileInfo.LastWriteTime; 

    // steht für

    vars["User::FileLastModifiedDate"]

    nicht

    Das zeigt aber nicht das oder macht nicht das was es soll.

    Denn das Änderungsdatum steht auf 16.4.2015 16:23 Uhr (ist eine TXT-Datei) jedoch wird das  Datum 16.4.2015 8:39 Uhr übermittelt. Noch besser ist daran, das das Erstellungsdatum auf 16.4.2015  9:37 Uhr steht.

    Schön zu sehen ganz unten bei dem Bild ist der Inhalt der Variablen.

    Freitag, 17. April 2015 06:03
  • Aber das mit der Messagebox bekomme ich nicht hin.

    ....
                Messagebox.Show(Dts.Variables("User::FilePath").value.ToString());
    


    C# (und nicht C) ist Case Sensitive und richtig heisst es MessageBox Class, also mit einem großem B bei Box. Am besten sich immer von IntelliSense unterstützen lassen.

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Freitag, 17. April 2015 10:25
  • Hallo Olaf,

    danke für deinen Tipp! IntelliSense ist an und meckert nun auch fleißig. Irgendwie kommt er noch nicht mit "Variables" zu recht. Aber das sollte doch eigentlich richtig sein. Mein V-Studio läuft in Deutsch aber der Source ändert sich ja dadurch nicht.

    Montag, 20. April 2015 06:56
  • Aber das sollte doch eigentlich richtig sein.

    Wenn Du VB.NET nutzen würdest, wäre es halbwegs richtig; ich nehme an das hast Du auch von einem VB Beispiel.

    Du sprichst die Variable "User::FilePath" über einen sogenannten Indexer an, in C# geht das aber über die eckigen Klammer [ ], nicht über die runden ( ) =>

    Dts.Variables["User::FilePath"].Value.ToString()
    Und "Value" müsste AFAIK auch groß geschrieben warden.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Montag, 20. April 2015 07:18