it-swarm-id.com

Bagaimana cara saya memanggil prosedur tersimpan SQL Server dari PowerShell?

Saya memiliki file CSV yang besar dan saya ingin menjalankan prosedur tersimpan untuk setiap baris.

Apa cara terbaik untuk menjalankan prosedur tersimpan dari PowerShell?

37
Andrew Jones

Jawaban ini ditarik dari http://www.databasejournal.com/features/mssql/article.php/3683181

Contoh yang sama ini dapat digunakan untuk pertanyaan adhoc. Mari kita jalankan prosedur tersimpan "sp_helpdb" seperti yang ditunjukkan di bawah ini.

$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

Berikut adalah fungsi yang saya gunakan (sedikit dihapus). Ini memungkinkan input dan output parameter. Saya hanya menerapkan jenis pengenal unik dan varchar, tetapi jenis lainnya mudah ditambahkan. Jika Anda menggunakan prosedur tersimpan berparameterisasi (atau hanya sql berparameter ... kode ini mudah disesuaikan dengan itu), ini akan membuat hidup Anda jauh lebih mudah.

Untuk memanggil fungsi, Anda memerlukan koneksi ke server SQL (katakanlah $ conn), 

$ res = exec -impanprocedure -storedProcName 'stp_myProc' -parameters @ {Param1 = "Hello"; Param2 = 50} -outparams @ {ID = "uniqueidentifier"} $ conn

mengambil output proc dari objek yang dikembalikan

$ res.data #dataset yang berisi data yang dikembalikan oleh selects

$ res.outputparams.ID #output parameter ID (uniqueidentifier)

Fungsi:

function exec-storedprocedure($storedProcName,  
        [hashtable] $par[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

Berikut adalah fungsi yang saya gunakan untuk menjalankan perintah sql. Anda hanya perlu mengubah $ sqlCommand.CommandText dengan nama sproc Anda dan $ SqlCommand.CommandType ke CommandType.StoredProcedure.

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

Gunakan sqlcmd bukan osql jika itu adalah database 2005

3
Galwegian

Pertimbangkan memanggil osql.exe (alat baris perintah untuk SQL Server) lewat sebagai parameter file teks yang ditulis untuk setiap baris dengan panggilan ke prosedur tersimpan.

SQL Server menyediakan beberapa majelis yang bisa digunakan dengan nama SMO yang memiliki integrasi tanpa batas dengan PowerShell. Ini artikel tentang itu.

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

Ada metode API untuk menjalankan prosedur tersimpan yang menurut saya layak untuk diselidiki. Berikut contoh startup:

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

2
Jorge Ferreira

Saya menyertakan invoke-sqlcmd2.ps1 dan write-datatable.ps1 dari http://blogs.technet.com/b/heyscriptingguy/archive/2010/11/01/use-powershell-to-collect-server-data-and-write-to-sql. aspx . Panggilan untuk menjalankan perintah SQL berupa: 
Invoke-sqlcmd2 -ServerInstance "<sql-server>" -Database <DB> -Query "truncate table <table>" 
Contoh penulisan konten variabel DataTable ke tabel SQL terlihat seperti: 
$logs = (get-item SQLSERVER:\sql\<server_path>).ReadErrorLog() Write-DataTable -ServerInstance "<sql-server>" -Database "<DB>" -TableName "<table>" -Data $logs
Saya menemukan ini berguna ketika melakukan skrip PowerShell terkait database SQL Server karena skrip yang dihasilkan bersih dan dapat dibaca.

0
Ken