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 cmdlet 将数据插入 SQL 数据库的表中。 此 cmdlet 接受以下输出格式的以下输入类型:
- System.Data.DataSet
- System.Data.DataTable
- System.Data.DateRow 对象
- 对象的集合
如果提供 数据集,则只会将数据集中的第一个表写入数据库。
可以将此 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
对象,) 通过 -InputOject
参数传递给 cmdlet。
参数
-AccessToken
用于对SQL Server进行身份验证的访问令牌,作为用户/密码或 Windows 身份验证的替代方法。
例如,这可用于连接到 SQL Azure DB
和使用 SQL Azure Managed Instance
Service Principal
或 Managed 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 不使用当前上下文替代 ServerInstance、 DatabaseName、 SchemaName 和 TableName 参数的值。 如果未指定此参数,则 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.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) 表示此 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 使用默认值 (通常为 30) 。 为了避免超时,请传递 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[]