2

尝试构建 PowerShell 脚本以连接到 Analysis Services表格模型并提取 DMV 查询的输出(例如:SELECT * FROM $System.DBSchema_Tables)

在下面尝试过,但它失败了,连接字符串或我尝试连接的方式似乎有问题:

$connectionString = "server=TabularServerName;database='ModelName';trusted_connection=true;";
$CubeQuery = "SELECT * FROM $System.DBSchema_Tables";

#SQL Connection - connection to SQL server
$sqlConnection = new-object System.Data.SqlClient.SqlConnection;
$sqlConnection.ConnectionString = $connectionString;

#SQL Command - set up the SQL call
$sqlCommand = New-Object System.Data.SqlClient.SqlCommand;
$sqlCommand.Connection = $sqlConnection;
$sqlCommand.CommandText = $CubeQuery;

#SQL Adapter - get the results using the SQL Command
$sqlAdapter = new-object System.Data.SqlClient.SqlDataAdapter 
$sqlAdapter.SelectCommand = $sqlCommand
$dataSet = new-object System.Data.Dataset
$recordCount = $sqlAdapter.Fill($dataSet)
4

2 回答 2

1

什么你不只是使用 SQLPS 模块或DBA 工具模块

当然,您还可以利用其他模块:

Find-Module -Name '*sql*' | Format-Table -AutoSize
Find-Package -Name '*sql*' | Format-Table -AutoSize

这是我传递给其他使用 SQL 的人的东西。

安装 SQL Server PowerShell 模块

https://docs.microsoft.com/en-us/sql/powershell/download-sql-server-ps-module?view=sql-server-ver15

https://docs.microsoft.com/en-us/powershell/module/sqlps/?view=sqlserver-ps

https://docs.microsoft.com/en-us/sql/powershell/sql-server-powershell?view=sql-server-ver15

然后看:

将 PowerShell 连接到 SQL Server

作为概述,以下是我将在本文中介绍的选项列表:

  • SQL Server PowerShell (SQLPS)
  • SQL Server 管理对象 (SMO)
  • .NET (System.Data.SqlClient)

SQLPS

SQL Server PowerShell SQLPS 是与 SQL Server 2008 一起首次发布的实用程序,您可能会看到以各种方式引用它。它作为 (1) 实用程序和 (2) 作为 PS 模块存在。该实用程序和模块随 SQL Server 2008 及更高版本的 SQL Server 管理工具一起安装。有几种使用此实用程序连接到 SQL Server 的方法,每种方法都有优点和缺点。

SQLPS.exe

这是一个实用程序,您应该可以通过在运行提示符(开始 > 运行)中键入它来打开它。第二个选项,右键单击 SQL Server Management Studio (SSMS) 中对象资源管理器下的节点,然后选择“启动 PowerShell”。SQLPS 实用程序的主要访问点是使用提供程序“SQLSERVER:\”像浏览文件目录一样浏览 SQL Server。这样,根据您打开 SQLPS 的节点,您将位于提供程序的该路径中。在您所在的每个“文件夹”下,提供商提供了要读取或设置的属性,以及一些用于管理的方法。

Get-ChildItem SQLSERVER:\SQL\LOCALHOST\SQL12\Databases | foreach { $_.RecoveryModel = "SIMPLE"; $_.Alter() }

SQLPS 模块

将 SQLPS 模块导入 PS 会话提供了与使用该实用程序相同的访问权限,但允许您在您所操作的操作系统的 PS 版本中进行操作。在 SQL Server 2008 和 2008 R2 中,您将加载 SQLPS 作为管理单元 (Add-PSSnapin),然后使用 SQL Server 2012 及更高版本将其导入 (Import-Module)。

# Loading SMO
Add-Type -AssemblyName "Microsoft.SqlServer.Smo,Version=11.0.0.0,Culture=neutral,PublicKeyToken=89845dcd8080cc91"

# Connecting with SMO
$srv = New-Object Microsoft.SqlServer.Management.Smo.Server “localhost\sql12”
$srv.Databases | select name

# .NET Framework
# Create a connection
$sqlConn = New-Object System.Data.SqlClient.SqlConnection
$sqlConn.ConnectionString = “Server=localhost\sql12;Integrated Security=true;Initial Catalog=master”
$sqlConn.Open()

# Create your command (the T-SQL that will be executed)
$sqlcmd = $sqlConn.CreateCommand()
<# or #>
$sqlcmd = New-Object System.Data.SqlClient.SqlCommand
$sqlcmd.Connection = $sqlConn
$query = “SELECT name, database_id FROM sys.databases”
$sqlcmd.CommandText = $query

# Create your data adapter (if you want to retrieve data)
$adp = New-Object System.Data.SqlClient.SqlDataAdapter $sqlcmd

# Create your dataset (the adapter fills this object)
$data = New-Object System.Data.DataSet
$adp.Fill($data) | Out-Null

# Retrieving Your Data
$data.Tables
<# or #>
$data.Tables[0]

最后:

使用 POWERSHELL 从 2016 TABULAR Cube 获取所有测量值

因此,这里的 PowerShell 脚本将从多维数据集获取度量(更改前三个变量以适应您的环境):

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices.Tabular");

$tab = "YourSSASserver";
$dbId = "ID_or_DB";
$saveas = "C:\YourFolder\{0}.dax" -f $tab.Replace('\', '_');


$as = New-Object Microsoft.AnalysisServices.Tabular.Server;
$as.Connect($tab);
$db = $as.Databases[$dbId];
# in case you want to search by the name of the cube/db:
# $as.Databases.GetByName("DB Name");

$out = "";

foreach($t in $db.Model.Tables) {
  foreach($M in $t.Measures) {
    $out += "// Measure defined in table [" + $t.Name + "] //" + "`n";
    $out += $M.Name + ":=" + $M.Expression + "`n";
  }
}

$as.Disconnect();
$out = $out.Replace("`t","  "); # I prefer spaces over tabs :-)
$out.TrimEnd() | Out-File $saveas; 
于 2020-02-07T23:36:45.123 回答
0

以下是对我有用的

$connectionString =  $connectionString = “Provider=MSOLAP;Data Source=TabularServerName;” 
$CubeQuery = 'SELECT * FROM $System.DBSchema_Tables';

$connection = New-Object -TypeName System.Data.OleDb.OleDbConnection

$connection.ConnectionString = $connectionString
$sqlCommand = $connection.CreateCommand() 

$sqlCommand.CommandText = $CubeQuery;

#SQL Adapter - get the results using the SQL Command
$sqlAdapter = new-object System.Data.SqlClient.SqlDataAdapter 
$sqlAdapter.SelectCommand = $sqlCommand
$dataSet = new-object System.Data.Dataset
$recordCount = $sqlAdapter.Fill($dataSet)```
于 2020-04-17T21:02:42.310 回答