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 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 使用默认值 (通常为 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[]