Write-SqlTableData

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

構文

Write-SqlTableData
     [-Force]
     -InputData <PSObject>
     [-Passthru]
     [-Timeout <Int32>]
     [[-Path] <String[]>]
     [-AccessToken <PSObject>]
     [-TrustServerCertificate]
     [-HostNameInCertificate <String>]
     [-Encrypt <String>]
     [<CommonParameters>]
Write-SqlTableData
     [-DatabaseName <String>]
     [-SchemaName <String>]
     [-TableName <String>]
     [-IgnoreProviderContext]
     [-SuppressProviderContextWarning]
     [-Force]
     -InputData <PSObject>
     [-Passthru]
     [-Timeout <Int32>]
     [[-ServerInstance] <String[]>]
     [-Credential <PSCredential>]
     [-ConnectionTimeout <Int32>]
     [-AccessToken <PSObject>]
     [-TrustServerCertificate]
     [-HostNameInCertificate <String>]
     [-Encrypt <String>]
     [<CommonParameters>]
Write-SqlTableData
     [-Force]
     -InputData <PSObject>
     [-Passthru]
     [-Timeout <Int32>]
     [-InputObject] <Table[]>
     [-AccessToken <PSObject>]
     [-TrustServerCertificate]
     [-HostNameInCertificate <String>]
     [-Encrypt <String>]
     [<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\MyInstanceにデータをMyDatabase.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 データベース (または SQL Auth を使用する任意のデータベース) の既存のテーブルにデータを書き込む

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 定型句です。

パラメーター

-AccessToken

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

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

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

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

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ConnectionTimeout

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

Type:Int32
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Credential

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

Type:PSCredential
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-DatabaseName

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

コマンドレットでは、値の引用符がサポートされています。 特殊文字を引用符で囲んだりエスケープしたりする必要はありません。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Encrypt

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

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

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

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

Type:String
Accepted values:Mandatory, Optional, Strict
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Force

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

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

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-HostNameInCertificate

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

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

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-IgnoreProviderContext

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

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputData

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

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

Type:PSObject
Position:Named
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-InputObject

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

Type:Table[]
Position:1
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-Passthru

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

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Path

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

Type:String[]
Position:1
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-SchemaName

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

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

コマンドレットでは、値の引用符がサポートされています。 特殊文字を引用符で囲んだりエスケープしたりする必要はありません。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ServerInstance

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

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

Type:String[]
Position:1
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-SuppressProviderContextWarning

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

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-TableName

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

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

コマンドレットでは、値の引用符がサポートされています。 特殊文字を引用符で囲んだりエスケープしたりする必要はありません。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Timeout

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

Type:Int32
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-TrustServerCertificate

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

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

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

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

入力

System.Management.Automation.PSObject

System.String[]

Microsoft.SqlServer.Management.Smo.Table[]