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 Encrypt
SqlConnectionEncryptOption
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
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[]