Partager via


Write-SqlTableData

Écrit des données dans une table d’une base de données SQL.

Syntaxe

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

L’applet de commande Write-SqlTableData insère des données dans une table d’une base de données SQL. Cette applet de commande accepte les types d’entrée suivants les formats de sortie suivants :

  • System.Data.DataSet
  • System.Data.DataTable
  • Objets System.Data.DateRow
  • Collection d’objets

Si vous fournissez un DataSet, seule la première table du jeu de données est écrite dans la base de données.

Vous pouvez utiliser cette applet de commande avec le fournisseur SQL Windows PowerShell.

Cette applet de commande peut déduire des informations telles que le serveur, la base de données, le schéma et la table à partir de son chemin d’accès actuel.

Cette applet de commande s’attend à ce que la table existe. Par défaut, l’applet de commande ajoute des données à cette table.

Si vous spécifiez le paramètre Force, l’applet de commande génère des objets manquants, qui incluent la base de données, le schéma de table et la table elle-même. Cette utilisation permet le transfert rapide de données dans une base de données. L’applet de commande déduit le schéma de la table à partir des données. Le résultat peut ne pas être optimal. Par exemple, les chaînes sont mappées à NVARCHAR(MAX).

Exemples

Exemple 1 : Écrire des informations sur les processus dans une table

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

Cet exemple obtient des informations sur les processus qui s’exécutent sur un système et les écrit dans une table.

L’applet de commande actuelle écrit les données dans MyDatabase.dbo.TaskManagerDump sur MyServer\MyInstance. Étant donné que vous spécifiez le paramètre force , si la base de données, le schéma et la table n’existent pas, cette applet de commande les crée.

Exemple 2 : Écrire des données dans une table

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

La première commande modifie l’emplacement pour qu’il s’agit d’un emplacement dans le fournisseur SQLSERVER. L’invite de commandes reflète le nouvel emplacement. Pour plus d’informations, tapez Get-Help about_Providers.

La commande finale affiche le contenu de la variable $Table à l’aide de l’applet de commande Read-SqlTableData.

Exemple 3 : Importer des données d’un fichier dans une table

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

Cet exemple s’exécute complètement à partir de l’invite de fichiers. Il ne peut pas utiliser d’informations de contexte. Par conséquent, vous devez spécifier tous les paramètres pertinents.

Notez l’utilisation du « », devant la ligne : il s’agit de forcer PowerShell à transmettre l’intégralité du contenu du fichier directement à l’applet de commande Write-SqlTableData, qui à son tour peut effectuer une insertion en bloc (ce qui est beaucoup plus performant qu’une ligne par insertion de ligne)

Exemple 4 : Récupérer des données d’une instance et envoyer (push) à la table d’une base de données sur une autre instance

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

Cet exemple obtient des informations sur les tailles de fichiers de base de données d’une instance à l’aide de l’applet de commande Invoke-SqlCmd et insère les lignes obtenues dans une base de données sur une autre instance de SQL Server. Notez que, bien que cet exemple déplace des données entre des instances de SQL Server sur le même ordinateur, les instances peuvent se trouver sur deux serveurs complètement différents.

Exemple 5 : Écrire des données dans une table existante d’une base de données Azure SQL (ou toute base de données à l’aide de l’authentification 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

Cet exemple montre comment utiliser l’applet de commande Write-SqlTableData avec l’authentification SQL. La plupart du code est simplement ADO.Net et SMO réutilisable requis pour créer l’objet nécessaire (l’objet SMO Table qui représente la table cible) nécessaire qui est passé à l’applet de commande via le paramètre -InputOject.

Exemple 6 : Écrire (et lire) des données dans une table existante d’une base de données Azure SQL à l’aide de l’identité managée d’une machine virtuelle 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
#

Paramètres

-AccessToken

Jeton d’accès utilisé pour s’authentifier auprès de SQL Server, comme alternative à l’authentification utilisateur/mot de passe ou Windows.

Cela peut être utilisé, par exemple, pour se connecter à SQL Azure DB et SQL Azure Managed Instance à l’aide d’un Service Principal ou d’un Managed Identity.

Le paramètre à utiliser peut être une chaîne représentant le jeton ou un objet PSAccessToken tel qu’il est retourné en exécutant Get-AzAccessToken -ResourceUrl https://database.windows.net.

Ce paramètre est nouveau dans v22 du module.

Type:PSObject
Position:Named
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

-ConnectionTimeout

Spécifie le nombre de secondes à attendre pour une connexion serveur avant une défaillance de délai d’attente. La valeur de délai d’attente doit être un entier compris entre 0 et 65534. Si 0 est spécifié, les tentatives de connexion n’expirent pas.

Type:Int32
Position:Named
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

-ConnectToDatabase

Lors de l’établissement de la connexion, forcez l’applet de commande à utiliser la base de données passée (-DatabaseName) comme catalogue initial. Ce paramètre peut être utile pour permettre aux utilisateurs à faible privilège de se connecter à une base de données existante pour l’opération d’écriture. n’utilisez pas quand la base de données doit être créée.

Type:SwitchParameter
Position:Named
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

-Credential

Spécifie un objet PSCredential pour la connexion à SQL Server. Pour obtenir un objet d’informations d’identification, utilisez l’applet de commande Get-Credential. Pour plus d’informations, tapez Get-Help Obtenir des informations d’identification.

Type:PSCredential
Position:Named
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

-DatabaseName

Spécifie le nom de la base de données qui contient la table.

L’applet de commande prend en charge le guillemet de la valeur. Vous n’avez pas besoin de citer ou d’échapper des caractères spéciaux.

Type:String
Position:Named
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

-Encrypt

Type de chiffrement à utiliser lors de la connexion à SQL Server.

Cette valeur est mappée à la propriété EncryptSqlConnectionEncryptOption sur l’objet SqlConnection du pilote Microsoft.Data.SqlClient.

Dans la version 22 du module, la valeur par défaut est Optional (pour la compatibilité avec v21). Dans la version 23+ du module, la valeur par défaut est « Obligatoire », ce qui peut créer une modification cassant pour les scripts existants.

Ce paramètre est nouveau dans v22 du module.

Type:String
Valeurs acceptées:Mandatory, Optional, Strict
Position:Named
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

-Force

Indique que cette applet de commande crée des objets SQL Server manquants. Il s’agit notamment de la base de données, du schéma et de la table. Vous devez disposer d’informations d’identification appropriées pour créer ces objets.

Si vous ne spécifiez pas ce paramètre pour les objets manquants, l’applet de commande retourne une erreur.

Type:SwitchParameter
Position:Named
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

-HostNameInCertificate

Nom d’hôte à utiliser pour valider le certificat TLS/SSL SQL Server. Vous devez passer ce paramètre si votre instance SQL Server est activée pour Forcer le chiffrement et que vous souhaitez vous connecter à une instance à l’aide du nom d’hôte/shortname. Si ce paramètre est omis, le passage du nom de domaine complet (FQDN) à -ServerInstance est nécessaire pour se connecter à une instance SQL Server activée pour Forcer le chiffrement.

Ce paramètre est nouveau dans v22 du module.

Type:String
Position:Named
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

-IgnoreProviderContext

Indique que cette applet de commande n’utilise pas le contexte actuel pour remplacer les valeurs de l'ServerInstance , DatabaseName, SchemaNameet paramètres tableName. Si vous ne spécifiez pas ce paramètre, l’applet de commande ignore les valeurs de ces paramètres, si possible, en faveur du contexte dans lequel vous exécutez l’applet de commande.

Type:SwitchParameter
Position:Named
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

-InputData

Spécifie les données à écrire dans la base de données.

Les données d’entrée classiques sont unSystem.Data.DataTable , mais vous pouvez spécifier System.Data.DataSet ou objets System.Data.DateRow*.

Type:PSObject
Position:Named
Valeur par défaut:None
Obligatoire:True
Accepter l'entrée de pipeline:True
Accepter les caractères génériques:False

-InputObject

Spécifie un tableau d’objets SMO (SQL Server Management Objects) qui représentent la table dans laquelle cette applet de commande écrit.

Type:Table[]
Position:1
Valeur par défaut:None
Obligatoire:True
Accepter l'entrée de pipeline:True
Accepter les caractères génériques:False

-Passthru

Indique que cette applet de commande retourne une SMO. Table objet. Cet objet représente la table qui inclut les données ajoutées. Vous pouvez utiliser la table après l’opération d’écriture.

Type:SwitchParameter
Position:Named
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

-Path

Spécifie le chemin complet dans le contexte du fournisseur SQL de la table où cette applet de commande écrit des données.

Type:String[]
Position:1
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

-ProgressAction

Détermine comment PowerShell répond aux mises à jour de progression générées par un script, une applet de commande ou un fournisseur, telles que les barres de progression générées par l’applet de commande Write-Progress. L’applet de commande Write-Progress crée des barres de progression qui affichent l’état d’une commande.

Type:ActionPreference
Alias:proga
Position:Named
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

-SchemaName

Spécifie le nom du schéma de la table.

Si vous exécutez cette applet de commande dans le contexte d’une base de données ou d’un élément enfant d’une base de données, l’applet de commande ignore cette valeur de paramètre. Spécifiez le paramètre IgnoreProviderContext pour l’applet de commande afin d’utiliser la valeur du paramètre SchemaName de toute façon.

L’applet de commande prend en charge le guillemet de la valeur. Vous n’avez pas besoin de citer ou d’échapper des caractères spéciaux.

Type:String
Position:Named
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

-ServerInstance

Spécifie le nom d’une instance de SQL Server. Pour l’instance par défaut, spécifiez le nom de l’ordinateur. Pour les instances nommées, utilisez le format ComputerName\InstanceName.

Si vous exécutez cette applet de commande dans le contexte d’une base de données ou d’un élément enfant d’une base de données, l’applet de commande ignore cette valeur de paramètre. Spécifiez le paramètre IgnoreProviderContext pour l’applet de commande afin d’utiliser la valeur du paramètre ServerInstance de toute façon.

Type:String[]
Position:1
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:True
Accepter les caractères génériques:False

-SuppressProviderContextWarning

Indique que cette applet de commande supprime le message d’avertissement qui indique que l’applet de commande utilise le contexte du fournisseur.

Type:SwitchParameter
Position:Named
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

-TableName

Spécifie le nom de la table à partir de laquelle cette applet de commande lit.

Si vous exécutez cette applet de commande dans le contexte d’une base de données ou d’un élément enfant d’une base de données, l’applet de commande ignore cette valeur de paramètre. Spécifiez le paramètre IgnoreProviderContext pour l’applet de commande afin d’utiliser la valeur du paramètre TableName de toute façon.

L’applet de commande prend en charge le guillemet de la valeur. Vous n’avez pas besoin de citer ou d’échapper des caractères spéciaux.

Type:String
Position:Named
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

-Timeout

Spécifie une valeur de délai d’attente, en secondes, pour l’opération d’écriture. Si vous ne spécifiez pas de valeur, l’applet de commande utilise une valeur par défaut (généralement 30s). Pour éviter un délai d’expiration, passez 0. Le délai d’expiration doit être une valeur entière comprise entre 0 et 65535.

Type:Int32
Position:Named
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

-TrustServerCertificate

Indique si le canal sera chiffré lors du contournement de la marche à pied de la chaîne de certificats pour valider l’approbation.

Dans la version 22 du module, la valeur par défaut est $true (pour la compatibilité avec v21). Dans v23+ du module, la valeur par défaut est « $false », ce qui peut créer une modification cassant pour les scripts existants.

Ce paramètre est nouveau dans v22 du module.

Type:SwitchParameter
Position:Named
Valeur par défaut:None
Obligatoire:False
Accepter l'entrée de pipeline:False
Accepter les caractères génériques:False

Entrées

System.Management.Automation.PSObject

System.String[]

Microsoft.SqlServer.Management.Smo.Table[]