Powershell:将表行转换为字符串值

时间:2015-03-29 21:42:58

标签: sql-server powershell

在Powershell脚本中,我有以下代码。我试图从SQL枚举数据库表的列表,然后使用该列表执行后续命令。

$q = "SELECT name FROM master..sysdatabases 
      WHERE name NOT IN ('tempdb', 'model', 'msdb')"

$ListOfDatabases = Invoke-Sqlcmd -ServerInstance $s.ServerName 
                                 -Username $s.Username 
                                 -Password $s.Pass 
                                 -Query $q 

foreach ($db in $ListOfDatabases) {

         #If I just print $db Like so...
             $db
         # yields 
         #       name
         #       -------
         #       table1
         #       table2

         #But If I Try to use that value I get an error
             $Q = "EXECUTE SOME_PROC($db)"
             $Q   
         #   yields 
         #    EXECUTE SOME_PROC([System.Data.DataRow])
         #    EXECUTE SOME_PROC([System.Data.DataRow])
         #    EXECUTE SOME_PROC([System.Data.DataRow])
         #     etc... for each table

那我在哪里错了?我试图为所有表提取字符串值table1和表2等,并在另一个SQL命令中使用它。而且因为SO编辑对我大喊大叫,告诉我我的帖子主要是代码,所以我要添加这个额外的句子来帮助说服'它让我提交这个问题。 - 给我的大部分"解释"在代码的注释中完成。

2 个答案:

答案 0 :(得分:3)

$db是一个具有name属性的数据行对象。尝试使用子表达式来提取name-property的值:

$Q = "EXECUTE SOME_PROC($($db.Name))"

答案 1 :(得分:0)

您可以做的是扩展变量以获取名称而不是具有name属性的对象,并仅使用值调用存储过程。

$q = "SELECT name FROM master..sysdatabases 
      WHERE name NOT IN ('tempdb', 'model', 'msdb')"

$ListOfDatabases = Invoke-Sqlcmd -ServerInstance $s.ServerName 
                                 -Username $s.Username 
                                 -Password $s.Pass 
                                 -Query $q 

foreach ($db in $ListOfDatabases) {

    #If I just print $db Like so...
    #    $db
    # yields 
    #       name
    #       -------
    #       table1
    #       table2

    # So we need to delve into each name separately like so
    ForEach ($dbName in $db.Name)
    {
        # This will call the proc with each name in $db
        $Q = "EXECUTE SOME_PROC($dbName)"
        $Q   
    }
}