it-swarm-tr.com

SQL Server saklı yordamını PowerShell'den nasıl çağırırım?

CSV dosyam büyük ve her satır için saklı yordam yürütmek istiyorum.

PowerShell'den saklı bir prosedürü uygulamanın en iyi yolu nedir?

37
Andrew Jones

Bu cevap http://www.databasejournal.com/features/mssql/article.php/3683181 adresinden alınmıştır.

Bu aynı örnek, herhangi bir geçici sorgu için kullanılabilir. “Sp_helpdb” saklı yordamını aşağıda gösterildiği gibi uygulayalım.

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=HOME\SQLEXPRESS;Database=master;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "sp_helpdb"
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables[0]
57
Mark Schill

İşte kullandığım bir fonksiyon (biraz düzeltilmiş). Giriş ve çıkış parametrelerine izin verir. Yalnızca benzersiz tanımlayıcı ve varchar türlerini uyguladık, ancak diğer türlerin eklenmesi de kolay. Parametreli saklı yordamlar kullanırsanız (veya sadece sql ... parametreleştirilmişse bu kod kolayca uyarlanabilir), bu sizin hayatınızı çok daha kolaylaştıracaktır.

Fonksiyonu çağırmak için, SQL sunucusuyla bağlantıya ihtiyacınız vardır ($ conn), 

$ res = exec-depolanmışprocedure -storedProcName 'stp_myProc' -parametre @ {Param1 = "Merhaba"; Param2 = 50} -outparams @ {ID = "uniqueidentifier"} $ conn

döndürülen nesneden proc çıktısını al

$ res.data #dataset, select tarafından döndürülen veri tablolarını içerir

$ res.outputparams.ID #output parametre kimliği (benzersiz tanımlayıcı)

İşlev:

function exec-storedprocedure($storedProcName,  
        [hashtable] [email protected]{},
        [hashtable] [email protected]{},
        $conn,[switch]$help){ 

        function put-outputparameters($cmd, $outparams){
            foreach($outp in $outparams.Keys){
                $cmd.Parameters.Add("@$outp", (get-paramtype $outparams[$outp])).Direction=[System.Data.ParameterDirection]::Output
            }
        }
        function get-outputparameters($cmd,$outparams){
            foreach($p in $cmd.Parameters){
                if ($p.Direction -eq [System.Data.ParameterDirection]::Output){
                $outparams[$p.ParameterName.Replace("@","")]=$p.Value
                }
            }
        }

        function get-paramtype($typename,[switch]$help){
            switch ($typename){
                'uniqueidentifier' {[System.Data.SqlDbType]::UniqueIdentifier}
                'int' {[System.Data.SqlDbType]::Int}
                'xml' {[System.Data.SqlDbType]::Xml}
                'nvarchar' {[System.Data.SqlDbType]::NVarchar}
                default {[System.Data.SqlDbType]::Varchar}
            }
        }
        if ($help){
            $msg = @"
    Execute a sql statement.  Parameters are allowed.  
    Input parameters should be a dictionary of parameter names and values.
    Output parameters should be a dictionary of parameter names and types.
    Return value will usually be a list of datarows. 

    Usage: exec-query sql [inputparameters] [outputparameters] [conn] [-help]
    "@
            Write-Host $msg
            return
        }
        $close=($conn.State -eq [System.Data.ConnectionState]'Closed')
        if ($close) {
           $conn.Open()
        }

        $cmd=new-object system.Data.SqlClient.SqlCommand($sql,$conn)
        $cmd.CommandType=[System.Data.CommandType]'StoredProcedure'
        $cmd.CommandText=$storedProcName
        foreach($p in $parameters.Keys){
            $cmd.Parameters.AddWithValue("@$p",[string]$parameters[$p]).Direction=
                  [System.Data.ParameterDirection]::Input
        }

        put-outputparameters $cmd $outparams
        $ds=New-Object system.Data.DataSet
        $da=New-Object system.Data.SqlClient.SqlDataAdapter($cmd)
        [Void]$da.fill($ds)
        if ($close) {
           $conn.Close()
        }
        get-outputparameters $cmd $outparams

        return @{data=$ds;outputparams=$outparams}
    }
8
Mike Shepard

İşte sql komutlarını çalıştırmak için kullandığım bir fonksiyon. Sadece $ sqlCommand.CommandText'i sproc isminizle ve $ SqlCommand.CommandType'ı CommandType.StoredProcedure olarak değiştirmelisiniz.

function execute-Sql{
    param($server, $db, $sql )
    $sqlConnection = new-object System.Data.SqlClient.SqlConnection
    $sqlConnection.ConnectionString = 'server=' + $server + ';integrated security=TRUE;database=' + $db 
    $sqlConnection.Open()
    $sqlCommand = new-object System.Data.SqlClient.SqlCommand
    $sqlCommand.CommandTimeout = 120
    $sqlCommand.Connection = $sqlConnection
    $sqlCommand.CommandText= $sql
    $text = $sql.Substring(0, 50)
    Write-Progress -Activity "Executing SQL" -Status "Executing SQL => $text..."
    Write-Host "Executing SQL => $text..."
    $result = $sqlCommand.ExecuteNonQuery()
    $sqlConnection.Close()
}
6
Santiago Cepas

2005 veritabanı ise osql yerine sqlcmd kullanın.

3
Galwegian

Osql.exe (SQL Server için komut satırı aracı) çağırmayı, her satır için yazılan bir metin dosyasını saklı yordamın çağrısıyla değiştirerek düşünün.

SQL Server, PowerShell ile kesintisiz entegrasyona sahip SMO adıyla kullanılabilecek bazı montajlar sağlar. İşte bu konuda bir yazı.

http://www.databasejournal.com/features/mssql/article.php/3696731

Araştırılmaya değer olduğunu düşündüğüm saklı yordamları uygulamak için API yöntemleri var. İşte bir başlangıç ​​örneği:

http://www.eggheadcafe.com/software/aspnet/29974894/smo-running-a-stored-pro.aspx

2
Jorge Ferreira

http://blogs.technet.com/b/heyscriptingguy/archive/2010/11/01/use-powershell-to-collect-server-data-and-write-to-sql adresindeki invoke-sqlcmd2.ps1 ve write-datatable.ps1 öğelerini içerir. aspx . SQL komutlarını çalıştırmak için yapılan çağrılar şu şekildedir: 
Invoke-sqlcmd2 -ServerInstance "<sql-server>" -Database <DB> -Query "truncate table <table>" 
DataTable değişkenlerinin içeriğini bir SQL tablosuna yazma örneği şuna benzer: 
$logs = (get-item SQLSERVER:\sql\<server_path>).ReadErrorLog() Write-DataTable -ServerInstance "<sql-server>" -Database "<DB>" -TableName "<table>" -Data $logs
Elde edilen komut dosyaları temiz ve okunabilir olduklarından, SQL Server veritabanıyla ilişkili PowerShell komut dosyaları yaparken bunları faydalı buluyorum.

0
Ken