Compartir a través de


Write-SqlTableData

Escribe datos en una tabla de una base de datos SQL.

Sintaxis

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

Description

El cmdlet Write-SqlTableData inserta datos en una tabla de una base de datos SQL. Este cmdlet acepta los siguientes tipos de entrada los siguientes formatos de salida:

  • System.Data.DataSet
  • System.Data.DataTable
  • Objetos System.Data.DateRow
  • Colección de objetos

Si proporciona una DataSet, solo se escribe la primera tabla del conjunto de datos en la base de datos.

Puede usar este cmdlet con el proveedor de SQL de Windows PowerShell.

Este cmdlet puede deducir información como el servidor, la base de datos, el esquema y la tabla desde su ruta de acceso actual.

Este cmdlet espera que exista la tabla. De forma predeterminada, el cmdlet anexa datos a esa tabla.

Si especifica el parámetro Force, el cmdlet genera objetos que faltan, que incluyen la base de datos, el esquema de tabla y la propia tabla. Este uso permite la transferencia rápida de datos a una base de datos. El cmdlet deduce el esquema de la tabla de los datos. Es posible que el resultado no sea óptimo. Por ejemplo, las cadenas se asignan a NVARCHAR(MAX).

Ejemplos

Ejemplo 1: Escribir información sobre los procesos en una tabla

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

En este ejemplo se obtiene información sobre los procesos que se ejecutan en un sistema y los escribe en una tabla.

El cmdlet actual escribe los datos en MyDatabase.dbo.TaskManagerDump en MyServer\MyInstance. Dado que especifica el parámetro Force, si la base de datos, el esquema y la tabla no existen, este cmdlet los crea.

Ejemplo 2: Escribir datos en una tabla

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

El primer comando cambia la ubicación para que sea una ubicación en el proveedor SQLSERVER. El símbolo del sistema refleja la nueva ubicación. Para obtener más información, escriba Get-Help about_Providers.

El comando final muestra el contenido de la variable $Table mediante el cmdlet Read-SqlTableData.

Ejemplo 3: Importación de datos de un archivo a una tabla

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

En este ejemplo se ejecuta completamente desde el símbolo del sistema de archivos. No puede usar información de contexto. Por lo tanto, debe especificar todos los parámetros pertinentes.

Tenga en cuenta el uso de "," delante de la línea: esto obliga a PowerShell a pasar todo el contenido del archivo directamente al cmdlet Write-SqlTableData, que a su vez puede realizar una inserción masiva (que es mucho más eficaz que una fila por inserción de fila).

Ejemplo 4: Recuperación de datos de una instancia e inserción en la tabla de una base de datos en otra instancia

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

En este ejemplo se obtiene información sobre los tamaños de los archivos de base de datos de una instancia mediante el cmdlet invoke-SqlCmd y se insertan las filas resultantes en una base de datos en una instancia diferente de SQL Server. Tenga en cuenta que, aunque en este ejemplo se mueven datos entre instancias de SQL Server en el mismo equipo, las instancias podrían estar en dos servidores completamente diferentes.

Ejemplo 5: Escritura de datos en una tabla existente de una base de datos de Azure SQL (o cualquier base de datos mediante la autenticación de 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

En este ejemplo se muestra cómo usar el cmdlet Write-SqlTableData con autenticación de SQL. La mayoría del código es simplemente ADO.Net y SMO reutilizable necesario para crear el objeto necesario (el objeto SMO Table que representa la tabla de destino) necesario, que se pasa al cmdlet a través del parámetro -InputOject.

Ejemplo 6: Escritura (y lectura) de datos en una tabla existente de una instancia de Azure SQL Database mediante la identidad administrada de una máquina virtual de Azure.

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
#

Parámetros

-AccessToken

El token de acceso que se usa para autenticarse en SQL Server, como alternativa a la autenticación de usuario o contraseña de Windows.

Esto se puede usar, por ejemplo, para conectarse a SQL Azure DB y SQL Azure Managed Instance mediante un Service Principal o un Managed Identity.

El parámetro que se va a usar puede ser una cadena que representa el token o un objeto PSAccessToken tal como se devuelve mediante la ejecución de Get-AzAccessToken -ResourceUrl https://database.windows.net.

Este parámetro es nuevo en la versión 22 del módulo.

Tipo:PSObject
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-ConnectionTimeout

Especifica el número de segundos que se deben esperar a una conexión de servidor antes de un error de tiempo de espera. El valor de tiempo de espera debe ser un entero entre 0 y 65534. Si se especifica 0, los intentos de conexión no agoten el tiempo de espera.

Tipo:Int32
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-ConnectToDatabase

Al establecer la conexión, obligue al cmdlet a usar la base de datos pasada (-DatabaseName) como catálogo inicial. Este parámetro puede ser útil para permitir que los usuarios con pocos privilegios se conecten a una base de datos existente para la operación de escritura. No usar cuando es necesario crear la base de datos.

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-Credential

Especifica un objeto PSCredential para la conexión a SQL Server. Para obtener un objeto de credencial, use el cmdlet Get-Credential. Para obtener más información, escriba Get-Help Get-Credential.

Tipo:PSCredential
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-DatabaseName

Especifica el nombre de la base de datos que contiene la tabla.

El cmdlet admite entrecomillar el valor. No tiene que comillas ni caracteres especiales de escape.

Tipo:String
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-Encrypt

Tipo de cifrado que se va a usar al conectarse a SQL Server.

Este valor se asigna a la propiedad EncryptSqlConnectionEncryptOption en el objeto SqlConnection del controlador Microsoft.Data.SqlClient.

En la versión 22 del módulo, el valor predeterminado es Optional (por compatibilidad con v21). En la versión 23+ del módulo, el valor predeterminado será "Obligatorio", que puede crear un cambio importante para los scripts existentes.

Este parámetro es nuevo en la versión 22 del módulo.

Tipo:String
Valores aceptados:Mandatory, Optional, Strict
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-Force

Indica que este cmdlet crea objetos de SQL Server que faltan. Estos incluyen la base de datos, el esquema y la tabla. Debe tener las credenciales adecuadas para crear estos objetos.

Si no especifica este parámetro para los objetos que faltan, el cmdlet devuelve un error.

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-HostNameInCertificate

Nombre de host que se va a usar para validar el certificado TLS/SSL de SQL Server. Debe pasar este parámetro si la instancia de SQL Server está habilitada para Forzar cifrado y desea conectarse a una instancia mediante el nombre de host o el nombre corto. Si se omite este parámetro, es necesario pasar el nombre de dominio completo (FQDN) a -ServerInstance es necesario para conectarse a una instancia de SQL Server habilitada para Forzar cifrado.

Este parámetro es nuevo en la versión 22 del módulo.

Tipo:String
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-IgnoreProviderContext

Indica que este cmdlet no usa el contexto actual para invalidar los valores de ServerInstance, DatabaseName, SchemaNamey parámetros tableName. Si no especifica este parámetro, el cmdlet omite los valores de estos parámetros, si es posible, en favor del contexto en el que ejecuta el cmdlet.

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-InputData

Especifica los datos que se van a escribir en la base de datos.

Los datos de entrada típicos son un System.Data.DataTable, pero puede especificar objetos System.Data.DataSet o System.Data.DateRow * .

Tipo:PSObject
Posición:Named
Valor predeterminado:None
Requerido:True
Aceptar entrada de canalización:True
Aceptar caracteres comodín:False

-InputObject

Especifica una matriz de objetos de objetos de administración de SQL Server (SMO) que representan la tabla a la que escribe este cmdlet.

Tipo:Table[]
Posición:1
Valor predeterminado:None
Requerido:True
Aceptar entrada de canalización:True
Aceptar caracteres comodín:False

-Passthru

Indica que este cmdlet devuelve un SMO. Table objeto. Este objeto representa la tabla que incluye los datos agregados. Puede operar en la tabla después de la operación de escritura.

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-Path

Especifica la ruta de acceso completa en el contexto del proveedor SQL de la tabla donde este cmdlet escribe datos.

Tipo:String[]
Posición:1
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-ProgressAction

Determina cómo Responde PowerShell a las actualizaciones de progreso generadas por un script, cmdlet o proveedor, como las barras de progreso generadas por el cmdlet Write-Progress. El cmdlet Write-Progress crea barras de progreso que muestran el estado de un comando.

Tipo:ActionPreference
Alias:proga
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-SchemaName

Especifica el nombre del esquema de la tabla.

Si ejecuta este cmdlet en el contexto de una base de datos o un elemento secundario de una base de datos, el cmdlet omite este valor de parámetro. Especifique el parámetro IgnoreProviderContext para que el cmdlet use el valor del parámetro SchemaName de todos modos.

El cmdlet admite entrecomillar el valor. No tiene que comillas ni caracteres especiales de escape.

Tipo:String
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-ServerInstance

Especifica el nombre de una instancia de SQL Server. Para la instancia predeterminada, especifique el nombre del equipo. Para las instancias con nombre, use el formato ComputerName\InstanceName.

Si ejecuta este cmdlet en el contexto de una base de datos o un elemento secundario de una base de datos, el cmdlet omite este valor de parámetro. Especifique el parámetro IgnoreProviderContext para que el cmdlet use el valor del parámetro ServerInstance de todos modos.

Tipo:String[]
Posición:1
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:True
Aceptar caracteres comodín:False

-SuppressProviderContextWarning

Indica que este cmdlet suprime el mensaje de advertencia que indica que el cmdlet usa el contexto del proveedor.

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-TableName

Especifica el nombre de la tabla de la que lee este cmdlet.

Si ejecuta este cmdlet en el contexto de una base de datos o un elemento secundario de una base de datos, el cmdlet omite este valor de parámetro. Especifique el parámetro ignoreProviderContext para que el cmdlet use el valor del parámetro TableName de todos modos.

El cmdlet admite entrecomillar el valor. No tiene que comillas ni caracteres especiales de escape.

Tipo:String
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-Timeout

Especifica un valor de tiempo de espera, en segundos, para la operación de escritura. Si no especifica un valor, el cmdlet usa un valor predeterminado (normalmente, 30s). Para evitar un tiempo de espera, pase 0. El tiempo de espera debe ser un valor entero entre 0 y 65535.

Tipo:Int32
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-TrustServerCertificate

Indica si el canal se cifrará mientras se pasa la cadena de certificados para validar la confianza.

En la versión 22 del módulo, el valor predeterminado es $true (por compatibilidad con v21). En la versión 23+ del módulo, el valor predeterminado será "$false", que puede crear un cambio importante para los scripts existentes.

Este parámetro es nuevo en la versión 22 del módulo.

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

Entradas

System.Management.Automation.PSObject

System.String[]

Microsoft.SqlServer.Management.Smo.Table[]