使用 PowerShell 从 SQL 服务器导出到 json 文本文件
Export from SQL Server to json text file using PowerShell
如果出现以下情况,您应该阅读此内容:您正在尝试了解如何将 SQL 服务器数据转换为 JSON 并将其放入文本中。 json 文件
问题:
有人能告诉我这段代码有什么问题吗?我的目标是从 SQL 服务器 table 读取数据,将其转换为 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,因为技术上 he/she 回答了我最初的问题(尽管我会警告说我没有尝试过)。
但是我会推荐 Mike 的答案或我最终使用 BCP 的答案:
bcp "select * from myTable FOR JSON AUTO" queryout "C:\filepath\testsml.json" -c -S ".\SQLEXPRESS" -d myDBName -T
- 请注意,JSON AUTO 会自动为您提供一个 json 模式,而 JSON 管道允许您对其进行自定义。
- 您必须先安装BCP:
https://docs.microsoft.com/en-us/sql/tools/bcp-utility?view=sql-server-2017
试试这样的……
### 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
}
如果您使用的是 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"
这里的"rub"是SQL命令FOR JSON AUTO
即使有execute scalar,也会截断JSON输出,输出到一个变量VARCHAR(max)
仍然会截断。如果重要的话,使用 SQL 2016 LocalDB 与 Visual Studio 捆绑在一起。
如果出现以下情况,您应该阅读此内容:您正在尝试了解如何将 SQL 服务器数据转换为 JSON 并将其放入文本中。 json 文件
问题:
有人能告诉我这段代码有什么问题吗?我的目标是从 SQL 服务器 table 读取数据,将其转换为 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,因为技术上 he/she 回答了我最初的问题(尽管我会警告说我没有尝试过)。
但是我会推荐 Mike 的答案或我最终使用 BCP 的答案:
bcp "select * from myTable FOR JSON AUTO" queryout "C:\filepath\testsml.json" -c -S ".\SQLEXPRESS" -d myDBName -T
- 请注意,JSON AUTO 会自动为您提供一个 json 模式,而 JSON 管道允许您对其进行自定义。
- 您必须先安装BCP: https://docs.microsoft.com/en-us/sql/tools/bcp-utility?view=sql-server-2017
试试这样的……
### 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
}
如果您使用的是 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"
这里的"rub"是SQL命令FOR JSON AUTO
即使有execute scalar,也会截断JSON输出,输出到一个变量VARCHAR(max)
仍然会截断。如果重要的话,使用 SQL 2016 LocalDB 与 Visual Studio 捆绑在一起。