Write-SqlTableData

SQL データベースのテーブルにデータを書き込みます。

構文

Write-SqlTableData
     [-Force]
     -InputData <PSObject>
     [-Passthru]
     [-Timeout <Int32>]
     [[-Path] <String[]>]
     [-AccessToken <PSObject>]
     [-TrustServerCertificate]
     [-HostNameInCertificate <String>]
     [-Encrypt <String>]
     [-ProgressAction <ActionPreference>]
     [<CommonParameters>]
Write-SqlTableData
     [-DatabaseName <String>]
     [-SchemaName <String>]
     [-TableName <String>]
     [-IgnoreProviderContext]
     [-SuppressProviderContextWarning]
     [-Force]
     -InputData <PSObject>
     [-Passthru]
     [-Timeout <Int32>]
     [-ConnectToDatabase]
     [[-ServerInstance] <String[]>]
     [-Credential <PSCredential>]
     [-ConnectionTimeout <Int32>]
     [-AccessToken <PSObject>]
     [-TrustServerCertificate]
     [-HostNameInCertificate <String>]
     [-Encrypt <String>]
     [-ProgressAction <ActionPreference>]
     [<CommonParameters>]
Write-SqlTableData
     [-Force]
     -InputData <PSObject>
     [-Passthru]
     [-Timeout <Int32>]
     [-InputObject] <Table[]>
     [-AccessToken <PSObject>]
     [-TrustServerCertificate]
     [-HostNameInCertificate <String>]
     [-Encrypt <String>]
     [-ProgressAction <ActionPreference>]
     [<CommonParameters>]

説明

Write-SqlTableData コマンドレットは、SQL データベースのテーブルにデータを挿入します。 このコマンドレットは、次の出力形式の入力型を受け入れます。

  • System.Data.DataSet
  • System.Data.DataTable
  • System.Data.DateRow オブジェクト
  • オブジェクトのコレクション

DataSetを指定すると、データセット内の最初のテーブルのみがデータベースに書き込まれます。

このコマンドレットは、Windows PowerShell SQL プロバイダーで使用できます。

このコマンドレットは、サーバー、データベース、スキーマ、テーブルなどの情報を現在のパスから推論できます。

このコマンドレットは、テーブルが存在することを想定しています。 既定では、コマンドレットはそのテーブルにデータを追加します。

Force パラメーターを指定すると、データベース、テーブル スキーマ、およびテーブル自体を含む、不足しているオブジェクトがコマンドレットによって生成されます。 この使用法により、データベースへのデータの迅速な転送が可能になります。 このコマンドレットは、データからテーブルのスキーマを推論します。 結果が最適でない可能性があります。 たとえば、文字列は NVARCHAR(MAX) にマップされます。

例 1: テーブルにプロセスに関する情報を書き込む

PS C:\> (Get-Process | Select-Object -Property Id,ProcessName,StartTime,UserProcessorTime,WorkingSet,Description) |
         Write-SqlTableData -ServerInstance "MyServer\MyInstance" -DatabaseName "MyDatabase" -SchemaName "dbo" -TableName "TaskManagerDump" -Force

この例では、システムで実行されるプロセスに関する情報を取得し、テーブルに書き込みます。

現在のコマンドレットは、MyServer\MyInstanceMyDatabase.dbo.TaskManagerDump にデータを書き込みます。 Force パラメーターを指定するため、データベース、スキーマ、テーブルが存在しない場合は、このコマンドレットによって作成されます。

例 2: テーブルにデータを書き込む

PS C:\> cd SQLSERVER:\SQL\MyServer\MyInstance\Databases\MyDatabase\Tables
PS SQLSERVER:\SQL\MyServer\MyInstance\Databases\MyDatabase\Tables> $Table = Write-SqlTableData -TableName "KeyValuePairs" -SchemaName "dbo" -InputData @{ cca=10; cac='Hello'; aac=1.2 } -PassThru
PS SQLSERVER:\SQL\MyServer\MyInstance\Databases\MyDatabase\Tables> Read-SqlTableData -InputObject $Table

WARNING: Using provider context. Server = MyServer\MyInstance, Database = [MyDatabase]. 

Key Value
--- -----
aac   1.2
cac Hello
cca    10

最初のコマンドは、SQLSERVER プロバイダー内の場所に場所を変更します。 コマンド プロンプトには、新しい場所が反映されます。 詳細については、「Get-Help about_Providers」と入力します。

最後のコマンドは、Read-SqlTableData コマンドレットを使用して、$Table 変数の内容を表示します。

例 3: ファイルからテーブルにデータをインポートする

PS C:\> ,(Import-Csv -Path ".\a.csv" -Header "Id","Name","Amount") | Write-SqlTableData -ServerInstance "MyServer\MyInstance" -DatabaseName "MyDatabase" -SchemaName "dbo" -TableName "CSVTable" -Force
PS C:\> Read-SqlTableData -ServerInstance "MyServer\MyInstance" -DatabaseName "MyDatabase" -SchemaName "dbo" -TableName "CSVTable"

Id Name  Amount
-- ----  ------
10 AAAA  -1.2
11 BBBB   1.2
12 CCCC  -1.0

The first command imports the contents of a file by using the Import-Csv cmdlet. The file contains the following content:
    
10,AAAA,-1.2
11,BBBB,1.2
12,CCCC,-1.0

この例は、ファイル プロンプトから完全に実行されます。 コンテキスト情報を使用できません。 そのため、関連するすべてのパラメーターを指定する必要があります。

行の前にある "," の使用に注意してください。これは、PowerShell がファイルの内容全体を Write-SqlTableData コマンドレットに直接渡すように強制するためです。これにより、一括挿入を実行できます (これは行ごとに挿入するよりもパフォーマンスが高くなります)。

例 4: あるインスタンスからデータを取得し、別のインスタンス上のデータベースのテーブルにプッシュする

PS C:\> (Invoke-Sqlcmd -query "SELECT @@SERVERNAME AS 'ServerName', DB_NAME(dbid) AS 'Database',
                              name, CONVERT(BIGINT, size) * 8 AS 'size_in_kb', filename
                              FROM master..sysaltfiles" `
   -ServerInstance MyServer\MyInstance -database master -OutputAs DataTables) |
   Write-SqlTableData -ServerInstance MyServer\MyOtherInstance -Database ServerStats -SchemaName dbo -TableName DatabasesSizes -Force

この例では、Invoke-SqlCmd コマンドレットを使用して 1 つのインスタンスからデータベース ファイルのサイズに関する情報を取得し、結果の行を SQL Server の別のインスタンス上のデータベースに挿入します。 この例では、同じコンピューター上の SQL Server のインスタンス間でデータを移動しますが、インスタンスは完全に異なる 2 つのサーバー上にある可能性があることに注意してください。

例 5: Azure SQL Database の既存のテーブル (または SQL 認証を使用する任意のデータベース) にデータを書き込む

Import-Module SqlServer

# Set your connection string to Azure SQL DB.
# If your server is not in Azure, just tweak the 'Data Source' field to point to your server.
# Warning: putting clear text passwords in your scripts is highly discoraged, so instead
# of using "User ID" and "Password" in the connection string, we prompt for the credentials.
$cred = Get-Credential -Message "Enter your SQL Auth credentials"
$cred.Password.MakeReadOnly()

# Get access to the SMO Server object.
$srv = Get-SqlInstance -ServerInstance "<your_server_name>.database.windows.net" -Credential $cred

# Get access to table 'MyTable1' on database 'MyDB'.
# Note: both objects are assumed to exists already.
$db = $srv.Databases["MyDB"]
$table = $db.Tables["MyTable1"]

# Write the first 4 integers into the table.
# Note: 'MyTable1' has a column 'Col1' of type 'int'
Write-SqlTableData -InputData (1..4) -InputObject $table

# Now, we read the data back to verify all went ok.
Read-SqlTableData -InputObject $table

# Output:
#
# Col1
# ----
#   1
#   2
#   3
#   4

この例では、SQL 認証で Write-SqlTableData コマンドレットを使用する方法を示します。 ほとんどのコードは、-InputOject パラメーターを使用してコマンドレットに渡される必要なオブジェクト (ターゲット テーブルを表す SMO Table オブジェクト) を作成するために必要な ADO.Net と SMO 定型句です。

例 6: Azure VM のマネージド ID を使用して、Azure SQL Database の既存のテーブルにデータを書き込む (読み取る) 。

Import-Module Az.Accounts,SQLServer

# Change these 3 variables to match your configuration.
# The example assumes you have a SQL Azure DB with the AdventureWorksLT sample DB on server sql-240627023957.
$Server = 'sql-240627023957.database.windows.net'
$Database = 'AdventureWorksLT'

# Connect to Azure using the system managed identify of the Azure VM this script is running on...
Add-AzAccount -Identity

# ... and fetch an access token to get to the DB.
$AccessToken = (Get-AzAccessToken -ResourceUrl 'https://database.windows.net').Token

# The assumption here is that the Microsoft Entra Admin on the server granted access
# to the managed identity of the VM by running something like:
#   CREATE USER [<Name of the VM>] FROM EXTERNAL PROVIDER
#   ALTER ROLE db_owner ADD MEMBER [<Name of the VM>]
# on the database ($Database).

# Insert a new record into the SalesLT.ProductDescription table
# Note that we are using -ConnectToDatabase to connect directly to the database, since it is unlikely for the
# managed identity of the VM to have access to anything but such database.
Write-SqlTableData -ServerInstance $Server -Database $Database -AccessToken $AccessToken -SchemaName SalesLT -TableName ProductDescription -InputData @{ Description = 'Hello SQLServer' } -ConnectToDatabase

# Confirm that the new record was successfully added
# Note that -ConnectToDatabase it not necessary in this case, as the connection if done directly to the database.
Read-SqlTableData -ServerInstance $Server -Database $Database -AccessToken $AccessToken -SchemaName SalesLT -TableName ProductDescription -OrderBy ModifiedDate -TopN 1 -ColumnOrderType DESC

# Output:
#
# ProductDescriptionID Description     rowguid                              ModifiedDate
# -------------------- -----------     -------                              ------------
#                 2011 Hello SQLServer f5f43821-aacd-4748-9d14-4a525c6a036b 6/30/2024 10:19:26 AM
#

パラメーター

-AccessToken

ユーザー/パスワードまたは Windows 認証の代わりに、SQL Server に対する認証に使用されるアクセス トークン。

これは、たとえば、Service Principal または Managed Identityを使用して SQL Azure DBSQL Azure Managed Instance に接続するために使用できます。

使用するパラメーターには、トークンを表す文字列、または Get-AzAccessToken -ResourceUrl https://database.windows.netを実行して返される PSAccessToken オブジェクトを指定できます。

このパラメーターは、モジュールの v22 の新機能です。

型:PSObject
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-ConnectionTimeout

タイムアウトエラーが発生するまでのサーバー接続を待機する秒数を指定します。 タイムアウト値は、0 から 65534 までの整数である必要があります。 0 を指定した場合、接続試行はタイムアウトになりません。

型:Int32
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-ConnectToDatabase

接続を確立するときに、渡されたデータベース (-DatabaseName) を初期カタログとして使用するようにコマンドレットに強制します。 このパラメーターは、低い特権を持つユーザーが書き込み操作のために既存のデータベースに接続できるようにする場合に役立ちます。 データベースの作成時 使用しないでください。

型:SwitchParameter
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-Credential

SQL Server への接続の PSCredential オブジェクトを指定します。 資格情報オブジェクトを取得するには、Get-Credential コマンドレットを使用します。 詳細については、「Get-Credential」Get-Help 入力します。

型:PSCredential
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-DatabaseName

テーブルを含むデータベースの名前を指定します。

このコマンドレットでは、値の引用符を使用できます。 特殊文字を引用符で囲んだりエスケープしたりする必要はありません。

型:String
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-Encrypt

SQL Server に接続するときに使用する暗号化の種類。

この値は、Microsoft.Data.SqlClient ドライバーの SqlConnection オブジェクトの Encrypt プロパティ SqlConnectionEncryptOption にマップされます。

モジュールの v22 では、既定値は Optional です (v21 との互換性のため)。 モジュールの v23 以降では、既定値は "必須" になり、既存のスクリプトに重大な変更が生じる可能性があります。

このパラメーターは、モジュールの v22 の新機能です。

型:String
指定可能な値:Mandatory, Optional, Strict
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-Force

このコマンドレットによって、不足している SQL Server オブジェクトが作成されることを示します。 これには、データベース、スキーマ、テーブルが含まれます。 これらのオブジェクトを作成するには、適切な資格情報が必要です。

不足しているオブジェクトに対してこのパラメーターを指定しない場合、コマンドレットはエラーを返します。

型:SwitchParameter
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-HostNameInCertificate

SQL Server TLS/SSL 証明書の検証に使用するホスト名。 SQL Server インスタンスで Force Encryption が有効になっていて、ホスト名/短縮名を使用してインスタンスに接続する場合は、このパラメーターを渡す必要があります。 このパラメーターを省略した場合、強制暗号化が有効になっている SQL Server インスタンスに接続するには、完全修飾ドメイン名 (FQDN) を -ServerInstance に渡す必要があります。

このパラメーターは、モジュールの v22 の新機能です。

型:String
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-IgnoreProviderContext

このコマンドレットは、現在のコンテキストを使用して、ServerInstanceDatabaseNameSchemaName、および TableName パラメーターの値 オーバーライドしないことを示します。 このパラメーターを指定しない場合、コマンドレットは、コマンドレットを実行するコンテキストを優先して、可能であれば、これらのパラメーターの値を無視します。

型:SwitchParameter
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-InputData

データベースに書き込むデータを指定します。

一般的な入力データは、System.Data.DataTableですが、System.Data.Data.DataSet 指定することも、System.Data.DateRow* オブジェクト することもできます。

型:PSObject
配置:Named
規定値:None
必須:True
パイプライン入力を受け取る:True
ワイルドカード文字を受け取る:False

-InputObject

このコマンドレットが書き込むテーブルを表す SQL Server 管理オブジェクト (SMO) オブジェクトの配列を指定します。

型:Table[]
配置:1
規定値:None
必須:True
パイプライン入力を受け取る:True
ワイルドカード文字を受け取る:False

-Passthru

このコマンドレットが SMO を返したことを示します。テーブル オブジェクト。 このオブジェクトは、追加されたデータを含むテーブルを表します。 書き込み操作後にテーブルを操作できます。

型:SwitchParameter
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-Path

このコマンドレットがデータを書き込むテーブルの SQL プロバイダーのコンテキストで、完全なパスを指定します。

型:String[]
配置:1
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-ProgressAction

スクリプト、コマンドレット、またはプロバイダーによって生成された進行状況の更新 (Write-Progress コマンドレットによって生成された進行状況バーなど) に対する PowerShell の応答方法を決定します。 Write-Progress コマンドレットは、コマンドの状態を示す進行状況バーを作成します。

型:ActionPreference
Aliases:proga
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-SchemaName

テーブルのスキーマの名前を指定します。

データベースまたはデータベースの子項目のコンテキストでこのコマンドレットを実行すると、このパラメーター値は無視されます。 コマンドレットの IgnoreProviderContext パラメーターを指定して、SchemaName パラメーターの値を使用します。

このコマンドレットでは、値の引用符を使用できます。 特殊文字を引用符で囲んだりエスケープしたりする必要はありません。

型:String
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-ServerInstance

SQL Server のインスタンスの名前を指定します。 既定のインスタンスには、コンピューター名を指定します。 名前付きインスタンスの場合は、ComputerName\InstanceName形式を使用します。

データベースまたはデータベースの子項目のコンテキストでこのコマンドレットを実行すると、このパラメーター値は無視されます。 コマンドレットの IgnoreProviderContext パラメーターを指定して、ServerInstance パラメーターの値を使用します。

型:String[]
配置:1
規定値:None
必須:False
パイプライン入力を受け取る:True
ワイルドカード文字を受け取る:False

-SuppressProviderContextWarning

このコマンドレットが、プロバイダー コンテキストを使用することを示す警告メッセージを抑制することを示します。

型:SwitchParameter
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-TableName

このコマンドレットが読み取るテーブルの名前を指定します。

データベースまたはデータベースの子項目のコンテキストでこのコマンドレットを実行すると、このパラメーター値は無視されます。 コマンドレットの IgnoreProviderContext パラメーターを指定して、TableName パラメーターの値を使用します。

このコマンドレットでは、値の引用符を使用できます。 特殊文字を引用符で囲んだりエスケープしたりする必要はありません。

型:String
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-Timeout

書き込み操作のタイムアウト値を秒単位で指定します。 値を指定しない場合、コマンドレットは既定値 (通常は 30 秒) を使用します。 タイムアウトを回避するには、0 を渡します。 タイムアウトは、0 ~ 65535 の整数値である必要があります。

型:Int32
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-TrustServerCertificate

信頼を検証するために証明書チェーンのウォークをバイパスしながらチャネルを暗号化するかどうかを示します。

モジュールの v22 では、既定値は $true です (v21 との互換性のため)。 モジュールの v23 以降では、既定値は "$false" になり、既存のスクリプトに重大な変更が生じる可能性があります。

このパラメーターは、モジュールの v22 の新機能です。

型:SwitchParameter
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

入力

System.Management.Automation.PSObject

System.String[]

Microsoft.SqlServer.Management.Smo.Table[]