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