Write-SqlTableData

將數據寫入 SQL 資料庫的數據表。

Syntax

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>]

Description

Write-SqlTableData Cmdlet 會將數據插入 SQL 資料庫的數據表。 此 Cmdlet 接受下列輸入類型,並採用下列輸出格式:

  • System.Data.DataSet
  • System.Data.DataTable
  • System.Data.DateRow 物件
  • 物件的集合

如果您提供 DataSet,則只會將數據集中的第一個數據表寫入資料庫。

您可以將此 Cmdlet 與 Windows PowerShell SQL 提供者搭配使用。

此 Cmdlet 可以從其目前路徑推斷伺服器、資料庫、架構和數據表等資訊。

此 Cmdlet 預期數據表存在。 根據預設,Cmdlet 會將數據附加至該數據表。

如果您指定 Force 參數,Cmdlet 會產生遺漏的物件,其中包括資料庫、數據表架構和數據表本身。 此用法可讓您將數據快速傳輸到資料庫。 Cmdlet 會從數據推斷數據表的架構。 結果可能不是最佳結果。 例如,字串會對應至 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

此範例會取得在系統上執行之進程的相關信息,並將它寫入數據表。

目前的 Cmdlet 會將資料 MyDatabase.dbo.TaskManagerDump 寫入至 上的 MyServer\MyInstance。 因為您指定 Force 參數,如果資料庫、架構和數據表不存在,這個 Cmdlet 會建立它們。

範例 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 Cmdlet 顯示變數的內容$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 Cmdlet,接著可以執行大量插入 (,這比逐列插入的數據列更有效能)

範例 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 Cmdlet 從一個實例取得資料庫檔案大小的相關信息,並將產生的數據列插入至不同實例上的資料庫 SQL Server。 請注意,雖然此範例會在相同計算機上的 SQL Server 實例之間移動數據,但實例可能位於兩個完全不同的伺服器上。

範例 5:使用 SQL 驗證) ,將數據寫入 Azure 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

此範例示範如何使用 Write-SqlTableData Cmdlet 搭配 SQL 驗證。 大部分的程式代碼只是 ADO.Net,而且需要 SMO 重複使用才能建立必要的物件, SMO Table (代表目標數據表的物件,) 透過 參數傳遞至 Cmdlet -InputOject

參數

-AccessToken

用來驗證 SQL Server 的存取令牌,作為使用者/密碼或 Windows 驗證的替代方案。

例如,這可用來連線至 SQL Azure DB 或使用 或使用 SQL Azure Managed InstanceService PrincipalManaged Identity

要使用的參數可以是表示令牌的字串,或是 PSAccessToken 執行 Get-AzAccessToken -ResourceUrl https://database.windows.net所傳回的物件。

這個參數是模組 v22 中的新功能。

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

-ConnectionTimeout

指定在逾時失敗之前等候伺服器連線的秒數。 逾時值必須是介於 0 到 65534 之間的整數。 如果指定了 0,連線嘗試就不會逾時。

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

-Credential

指定連接 SQL Server 的 PSCredential 物件。 若要取得認證物件,請使用 Get-Credential Cmdlet。 如需詳細資訊,請輸入 Get-Help Get-Credential。

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

-DatabaseName

指定包含數據表的資料庫名稱。

Cmdlet 支援引號值。 您不需要加上引號或逸出特殊字元。

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

表示此 Cmdlet 會建立遺漏 SQL Server 物件。 其中包括資料庫、架構和數據表。 您必須具備適當的認證,才能建立這些物件。

如果您未指定遺漏物件的此參數,Cmdlet 會傳回錯誤。

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

-HostNameInCertificate

用於驗證 SQL Server TLS/SSL 憑證的主機名稱。 如果您的 SQL Server 實例已啟用強制加密,而且您想要使用主機名/shortname 連線到實例,則必須傳遞此參數。 如果省略此參數,則必須將完整域名 (FQDN) 傳遞至 -ServerInstance,才能連線到啟用強制加密的 SQL Server 實例。

這個參數是模組 v22 中的新功能。

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

-IgnoreProviderContext

表示此 Cmdlet 不會使用目前的內容來覆寫 ServerInstanceDatabaseNameSchemaNameTableName 參數的值。 如果您未指定此參數,Cmdlet 會盡可能忽略這些參數的值,而會優先使用您執行 Cmdlet 的內容。

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

-InputData

指定要寫入資料庫的數據。

一般輸入數據是 System.Data.DataTable,但您可以指定 System.Data.DataSetSystem.Data.DateRow* 物件。

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

-InputObject

指定 SQL Server 管理物件陣列, (SMO) 物件,這些物件代表這個 Cmdlet 寫入的數據表。

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

-Passthru

表示此 Cmdlet 會傳回 SMO。Table 物件。 這個物件代表包含已加入數據的數據表。 您可以在寫入作業之後對資料表進行操作。

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

-Path

指定此 Cmdlet 寫入資料之資料表之 SQL 提供者內容中的完整路徑。

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

-SchemaName

指定數據表的架構名稱。

如果您在資料庫或資料庫的子項目內容中執行此 Cmdlet,Cmdlet 會忽略此參數值。 請為 Cmdlet 指定 IgnoreProviderContext 參數,以使用 SchemaName 參數的值。

Cmdlet 支援引號值。 您不需要加上引號或逸出特殊字元。

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

-ServerInstance

指定 SQL Server 實例的名稱。 針對預設實例,指定計算機名稱。 針對具名實例,請使用 格式 ComputerName\InstanceName

如果您在資料庫或資料庫的子項目內容中執行此 Cmdlet,Cmdlet 會忽略此參數值。 指定 Cmdlet 的 IgnoreProviderContext 參數,以使用 ServerInstance 參數的值。

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

-SuppressProviderContextWarning

指出此 Cmdlet 會隱藏指出 Cmdlet 使用提供者內容的警告訊息。

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

-TableName

指定這個 Cmdlet 從中讀取的數據表名稱。

如果您在資料庫或資料庫的子項目內容中執行此 Cmdlet,Cmdlet 會忽略此參數值。 請為 Cmdlet 指定 IgnoreProviderContext 參數,以使用 TableName 參數的值。

Cmdlet 支援引號值。 您不需要加上引號或逸出特殊字元。

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

-Timeout

指定寫入作業的逾時值,以秒為單位。 如果您未指定值,Cmdlet 通常會使用預設值 (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[]