【问题标题】:Export from SQL Server to json text file using PowerShell使用 PowerShell 从 SQL Server 导出到 json 文本文件
【发布时间】:2019-04-30 23:19:53
【问题描述】:

您应该阅读以下内容:您正在尝试了解如何将 SQL Server 数据转换为 JSON 并将其放入文本 .json 文件中

问题:

谁能告诉我这段代码有什么问题?我的目标是从 SQL Server 表中读取数据,将其转换为 JSON,然后将结果保存为 JSON 文本文件。代码运行,但生成的 .json 文件只有:

{
        "FieldCount":  11
    },
    {

一遍又一遍地重复,仅此而已。

我的代码:

$instance = "localhost\SQLEXPRESS"
$connectionString = "Server=$Instance; Database=myDB;Integrated Security=True;"
$query = "Select  * from myTable"
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()
$command = $connection.CreateCommand()
$command.CommandText = $query
$result = $command.ExecuteReader()
$result | ConvertTo-Json | Out-File "file.json"

$connection.Close()

更新

在技术上他/她回答了我最初的问题时,将把答案奖励给 postanote(尽管我会警告说我没有尝试过)。

但是,我会推荐 Mike 的答案或我最终使用 BCP 的答案:

bcp "select * from myTable FOR JSON AUTO" queryout "C:\filepath\testsml.json"  -c -S ".\SQLEXPRESS" -d myDBName -T

【问题讨论】:

  • executeReader 正在返回一个阅读器对象,它不是一个数据数组。您需要做一些额外的工作才能从那里提取数据

标签: json powershell powershell-4.0


【解决方案1】:

试试这样的……

### Exporting SQL Server table to JSON

Clear-Host

#--Establishing connection to SQL Server --# 

$InstanceName = "."
$connectionString = "Server=$InstanceName;Database=msdb;Integrated Security=True;"

#--Main Query --# 

$query = "SELECT * FROM sysjobs"

$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString

$connection.Open()
$command = $connection.CreateCommand()
$command.CommandText = $query

$result = $command.ExecuteReader()

$table = new-object "System.Data.DataTable"

$table.Load($result)

#--Exporting data to the screen --# 

$table | select $table.Columns.ColumnName | ConvertTo-Json

$connection.Close()

# Results

{
    "job_id":  "5126aca3-1003-481c-ab36-60b45a7ee757",
    "originating_server_id":  0,
    "name":  "syspolicy_purge_history",
    "enabled":  1,
    "description":  "No description available.",
    "start_step_id":  1,
    "category_id":  0,
    "owner_sid":  [
                      1
                  ],
    "notify_level_eventlog":  0,
    "notify_level_email":  0,
    "notify_level_netsend":  0,
    "notify_level_page":  0,
    "notify_email_operator_id":  0,
    "notify_netsend_operator_id":  0,
    "notify_page_operator_id":  0,
    "delete_level":  0,
    "date_created":  "\/Date(1542859767703)\/",
    "date_modified":  "\/Date(1542859767870)\/",
    "version_number":  5
}

【讨论】:

    【解决方案2】:

    如果您使用的是 sql server express 2016 或更高版本,您应该能够使用 FOR JSON 子句在数据库端执行此操作。尝试类似

    $instance = "localhost\SQLEXPRESS"
    $connectionString = "Server=$Instance; Database=myDB;Integrated Security=True;"
    $query = "Select  * from myTable FOR JSON AUTO"
    $connection = New-Object System.Data.SqlClient.SqlConnection
    $connection.ConnectionString = $connectionString
    $connection.Open()
    $command = $connection.CreateCommand()
    $command.CommandText = $query
    $command.ExecuteScalar() | Out-File "file.json"
    

    【讨论】:

    • 最佳答案,此时(2019 年),对于 JSON 输出,您应该让数据库处理 JSON,并且只处理将输出写入文件。
    【解决方案3】:

    这里的“麻烦”是 SQL 命令FOR JSON AUTO 即使使用执行标量,也会截断 JSON 输出,而使用VARCHAR(max) 输出到变量仍然会截断。如果重要,请使用与 Visual Studio 捆绑的 SQL 2016 LocalDB。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 2014-05-26
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      相关资源
      最近更新 更多