【问题标题】:Using Powershell get Values from sql table使用 Powershell 从 sql 表中获取值
【发布时间】:2015-08-13 03:18:21
【问题描述】:

我们知道我们可以使用 sql 查询窗口从数据库中获取值,例如“select * from....”。有没有办法通过powershell方式获得价值。我找到了数据库表本身而不是值的方法..

例如:

Set-location SQLserver:\sql\default\localhost\databases\database\tables
Get-childitem 

上面的命令给了我数据库中的表,但是我如何从中获取值。

【问题讨论】:

    标签: sql-server windows powershell


    【解决方案1】:

    你可以用这个

    $connectionString = “Server=$dataSource;uid=$user; pwd=$pwd;Database=$database;Integrated Security=False;”
    
    $connection = New-Object System.Data.SqlClient.SqlConnection
    $connection.ConnectionString = $connectionString
    
    $connection.Open()
    $query = “SELECT * FROM Tab”
    
    $command = $connection.CreateCommand()
    $command.CommandText = $query
    
    $result = $command.ExecuteReader()
    

    【讨论】:

    • 但这是 sql server 方式。为此,我需要使用 sql 命令(select * from)。我的问题是如何以 powershell 方式(使用 pwershell 命令)查询表,例如 get-childitem 或 get-itemproperty ....
    【解决方案2】:

    最简洁直接的选项是Invoke-SqlCommand

    $results = Invoke-Sqlcmd -ServerInstance "mySqlServer" -Database "myDatabase" -Query "SELECT * FROM MyTable"
    

    【讨论】:

    【解决方案3】:

    SQL Server Powershell 提供程序使用 SMO 公开数据库对象层次结构。一旦获得 SMO 子项,就可以在对象上调用相应的 SMO 方法。

    SMO 数据库的 ExecuteQueryWithResults 方法可用于在给定数据库的上下文中执行查询。获取所需的数据库项并调用此方法以返回包含结果的 DataSet 对象。然后根据需要从 DataSet 中检索数据。

    以下是从 SMO 参考 ((https://msdn.microsoft.com/en-us/library/ms205775.aspx) 中收集的示例,该示例可以从数据库节点的上下文中运行:

    $db = Get-Item SomeDatabase
    $dt = $db.ExecuteWithResults("SELECT * FROM sys.objects;")
    $dt.Tables[0] | Format-Table
    

    【讨论】:

    • SomeDatabase 到底是什么?本例中如何获取数据库?
    • @Alex, "SomeDatabase" 是您要对其运行查询的现有数据库的名称。例如,指定“tempdb”以列出该数据库中的对象。
    • 这给了我“找不到路径 'C:\xxx\xxx...\MyDatabase”,因为它不存在。我们使用的是同一个 Get-Item 吗?
    • @Alex,相同的命令但不同的上下文。一种方法是来自 SSMS。在 SSMS 资源管理器中右键单击服务器,然后选择启动 PowerShell。然后运行设置位置命令。本地主机示例:Set-location SQLSERVER:\SQL\localhost\DEFAULT\Databases
    【解决方案4】:

    你的意思是像下面这样的powershell命令:

    $MyVar = New-Object Microsoft.SqlServer.Management.SMO.Table
    $MyVar | Get-Member -Type Properties
    

    欲了解更多信息,您可以访问https://technet.microsoft.com/en-us/library/cc281939(v=sql.105).aspx

    如果要获取table的值,

    //Connect to the local, default instance of SQL Server. 
    { 
    Server srv = default(Server); 
    srv = new Server(); 
    //Call the EnumCollations method and return collation information to DataTable variable. 
    DataTable d = default(DataTable); 
    //Select the returned data into an array of DataRow. 
    d = srv.EnumCollations; 
    //Iterate through the rows and display collation details for the instance of SQL Server. 
    DataRow r = default(DataRow); 
    DataColumn c = default(DataColumn); 
    foreach ( r in d.Rows) { 
      Console.WriteLine("====================================="); 
      foreach ( c in r.Table.Columns) { 
        Console.WriteLine(c.ColumnName + " = " + r(c).ToString); 
      } 
    } 
    } 
    

    以上是如何通过 C# 完成这项工作,但如何在 powershell 中完成这项工作:您已经获得了 $MyVar 值,并且您运行“$MyVar |Get-Member”是为了显示所有方法的所有方法可用于 $ MyVar,我相信应该有一些方法可以让你迭代表的所有行或列。 powerShell 甚至可以调用 C# 方法,但这是最后的选择。

    【讨论】:

    • 这里我只得到了表的属性,没有值
    • @ultimatejegan 查看我的答案,如果找不到方法,请将结果打印给我。
    【解决方案5】:

    现在有一个 sqlserver 模块 available 用于 powershell

    您现在可以使用以下两个附加命令和选项

    Read-SqlTableData [[-ServerInstance] <String[]> ] [-ColumnName <String[]> ] [-ColumnOrder <String[]> ] [-ColumnOrderType <OrderType[]> ] [-ConnectionTimeout <Int32> ] [-Credential <PSCredential> ] [-DatabaseName <String> ] [-IgnoreProviderContext] [-OutputAs <OutputTypeSingleTable> {DataSet | DataTable | DataRows} ] [-SchemaName <String> ] [-SuppressProviderContextWarning] [-TableName <String> ] [-TopN <Int64> ] [ <CommonParameters>]
    
    Write-SqlTableData [[-ServerInstance] <String[]> ] -InputData <PSObject> [-ConnectionTimeout <Int32> ] [-Credential <PSCredential> ] [-DatabaseName <String> ] [-Force] [-IgnoreProviderContext] [-Passthru] [-SchemaName <String> ] [-SuppressProviderContextWarning] [-TableName <String> ] [-Timeout <Int32> ] [ <CommonParameters>
    

    【讨论】:

      【解决方案6】:

      您可以在 SQLPSX (SQLPSX.codeplex.com) 中使用 AdoLib 模块。

      这样,您可以使用 cmdlet 并执行以下操作:

      invoke-sqlquery -sql "select * from tab" -server SQLServer01 -database MyDatabase
      

      【讨论】:

        猜你喜欢
        • 2019-06-27
        • 2021-02-17
        • 1970-01-01
        • 2020-08-10
        • 2021-07-09
        • 2023-04-09
        • 1970-01-01
        • 2021-08-09
        • 1970-01-01
        相关资源
        最近更新 更多