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 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 将数据写入 MyServer\MyInstance上的 MyDatabase.dbo.TaskManagerDump。 由于指定 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:将数据写入 Azure SQL 数据库的现有表(或使用 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。

示例 6:使用 Azure VM 的托管标识将数据写入 Azure SQL 数据库的现有表(和读取)。

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

用于向 SQL Server 进行身份验证的访问令牌,作为用户/密码或 Windows 身份验证的替代方法。

例如,这可用于使用 Service PrincipalManaged Identity连接到 SQL Azure DBSQL Azure Managed Instance

要使用的参数可以是表示令牌的字符串,也可以是运行 Get-AzAccessToken -ResourceUrl https://database.windows.net返回的 PSAccessToken 对象。

此参数是模块 v22 中的新增参数。

类型:PSObject
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-ConnectionTimeout

指定在超时失败之前等待服务器连接的秒数。 超时值必须是介于 0 和 65534 之间的整数。 如果指定了 0,则连接尝试不会超时。

类型:Int32
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-ConnectToDatabase

建立连接时,强制 cmdlet 使用传入的数据库(-DatabaseName)作为初始目录。 此参数对于允许低特权用户连接到现有数据库进行写入操作可能很有用。 在需要创建数据库时不要 使用。

类型:SwitchParameter
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-Credential

指定连接到 SQL Server 的 PSCredential 对象。 若要获取凭据对象,请使用 Get-Credential cmdlet。 有关详细信息,请键入 Get-Help Get-Credential。

类型:PSCredential
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-DatabaseName

指定包含表的数据库的名称。

该 cmdlet 支持引用该值。 无需引号或转义特殊字符。

类型:String
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-Encrypt

连接到 SQL Server 时要使用的加密类型。

此值映射到 Microsoft.Data.SqlClient 驱动程序的 SqlConnection 对象的 Encrypt 属性 SqlConnectionEncryptOption

在模块的 v22 中,默认为 Optional(为了与 v21 兼容)。 在模块的 v23+ 中,默认值为“必需”,这可能会为现有脚本创建中断性变更。

此参数是模块 v22 中的新增参数。

类型:String
接受的值:Mandatory, Optional, Strict
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-Force

指示此 cmdlet 创建缺少的 SQL Server 对象。 其中包括数据库、架构和表。 必须具有适当的凭据才能创建这些对象。

如果未为缺少的对象指定此参数,cmdlet 将返回错误。

类型:SwitchParameter
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-HostNameInCertificate

用于验证 SQL Server TLS/SSL 证书的主机名。 如果为强制加密启用了 SQL Server 实例,并且想要使用主机名/shortname 连接到实例,则必须传递此参数。 如果省略此参数,则必须将完全限定域名(FQDN)传递给 -ServerInstance 才能连接到为强制加密启用的 SQL Server 实例。

此参数是模块 v22 中的新增参数。

类型:String
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-IgnoreProviderContext

指示此 cmdlet 不使用当前上下文替代 ServerInstanceDatabaseNameSchemaNameTableName 参数的值。 如果未指定此参数,cmdlet 将忽略这些参数的值(如果可能),而忽略运行 cmdlet 的上下文。

类型:SwitchParameter
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-InputData

指定要写入数据库的数据。

典型的输入数据是 System.Data.DataTable,但你可以指定 System.Data.DataSetSystem.Data.DateRow* 对象。

类型:PSObject
Position:Named
默认值:None
必需:True
接受管道输入:True
接受通配符:False

-InputObject

指定一个由 SQL Server 管理对象(SMO)对象构成的数组,这些对象表示此 cmdlet 写入到的表。

类型:Table[]
Position:1
默认值:None
必需:True
接受管道输入:True
接受通配符:False

-Passthru

指示此 cmdlet 返回 SMO。表 对象。 此对象表示包含已添加数据的表。 可以在写入操作后对表进行操作。

类型:SwitchParameter
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-Path

指定此 cmdlet 写入数据的表的 SQL 提供程序上下文中的完整路径。

类型:String[]
Position:1
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-ProgressAction

确定 PowerShell 如何响应脚本、cmdlet 或提供程序生成的进度更新,例如由 Write-Progress cmdlet 生成的进度栏。 Write-Progress cmdlet 创建显示命令状态的进度栏。

类型:ActionPreference
别名:proga
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-SchemaName

指定表的架构的名称。

如果在数据库或数据库的子项上下文中运行此 cmdlet,则 cmdlet 将忽略此参数值。 请为 cmdlet 指定 IgnoreProviderContext 参数,以无论如何使用 SchemaName 参数的值。

该 cmdlet 支持引用该值。 无需引号或转义特殊字符。

类型:String
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-ServerInstance

指定 SQL Server 实例的名称。 对于默认实例,请指定计算机名称。 对于命名实例,请使用 ComputerName\InstanceName格式。

如果在数据库或数据库的子项上下文中运行此 cmdlet,则 cmdlet 将忽略此参数值。 为 cmdlet 指定 IgnoreProviderContext 参数,以无论如何使用 ServerInstance 参数的值。

类型:String[]
Position:1
默认值:None
必需:False
接受管道输入:True
接受通配符:False

-SuppressProviderContextWarning

指示此 cmdlet 禁止显示指示该 cmdlet 使用提供程序上下文的警告消息。

类型:SwitchParameter
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-TableName

指定此 cmdlet 从中读取的表的名称。

如果在数据库或数据库的子项上下文中运行此 cmdlet,则 cmdlet 将忽略此参数值。 为 cmdlet 指定 IgnoreProviderContext 参数,以无论如何使用 TableName 参数的值。

该 cmdlet 支持引用该值。 无需引号或转义特殊字符。

类型:String
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-Timeout

指定写入操作的超时值(以秒为单位)。 如果未指定值,则 cmdlet 使用默认值(通常为 30s)。 为了避免超时,请传递 0。 超时必须是介于 0 和 65535 之间的整数值。

类型:Int32
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-TrustServerCertificate

指示通道是否在绕过证书链以验证信任的同时进行加密。

在模块的 v22 中,默认为 $true(为了与 v21 兼容)。 在模块的 v23+ 中,默认值将为“$false”,这可能会为现有脚本创建中断性变更。

此参数是模块 v22 中的新增参数。

类型:SwitchParameter
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

输入

System.Management.Automation.PSObject

System.String[]

Microsoft.SqlServer.Management.Smo.Table[]