Write-SqlTableData

Scrive i dati in una tabella di un database SQL.

Sintassi

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

Descrizione

Il cmdlet write-SqlTableData inserisce i dati in una tabella di un database SQL. Questo cmdlet accetta i tipi di input seguenti i formati di output seguenti:

  • System.Data.DataSet
  • System.Data.DataTable
  • Oggetti System.Data.DateRow
  • Raccolta di oggetti

Se si specifica un DataSet, nel database viene scritta solo la prima tabella del set di dati.

È possibile usare questo cmdlet con il provider SQL di Windows PowerShell.

Questo cmdlet può dedurre informazioni quali server, database, schema e tabella dal percorso corrente.

Questo cmdlet prevede che la tabella esista. Per impostazione predefinita, il cmdlet aggiunge i dati a tale tabella.

Se si specifica il parametro Force, il cmdlet genera oggetti mancanti, che includono il database, lo schema della tabella e la tabella stessa. Questo utilizzo consente il trasferimento rapido dei dati in un database. Il cmdlet deduce lo schema della tabella dai dati. Il risultato potrebbe non essere ottimale. Ad esempio, le stringhe vengono mappate a NVARCHAR(MAX).

Esempio

Esempio 1: Scrivere informazioni sui processi in una tabella

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

Questo esempio ottiene informazioni sui processi eseguiti in un sistema e lo scrive in una tabella.

Il cmdlet corrente scrive i dati in MyDatabase.dbo.TaskManagerDump in MyServer\MyInstance. Poiché si specifica il parametro Force, se il database, lo schema e la tabella non esistono, questo cmdlet li crea.

Esempio 2: Scrivere dati in una tabella

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

Il primo comando modifica il percorso in modo che sia un percorso nel provider SQLSERVER. Il prompt dei comandi riflette il nuovo percorso. Per altre informazioni, digitare Get-Help about_Providers.

Il comando finale visualizza il contenuto della variabile $Table usando il cmdlet Read-SqlTableData.

Esempio 3: Importare dati da un file in una tabella

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

Questo esempio viene eseguito completamente dal prompt dei file. Non può usare le informazioni di contesto. Pertanto, è necessario specificare tutti i parametri pertinenti.

Si noti l'uso di "," davanti alla riga: si tratta di forzare PowerShell a passare l'intero contenuto del file direttamente al cmdlet write-SqlTableData, che a sua volta può eseguire un inserimento bulk (che è il modo più efficiente di una riga per inserimento di riga)

Esempio 4: Recuperare dati da un'istanza e eseguire il push alla tabella di un database in un'altra istanza

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

Questo esempio ottiene informazioni sulle dimensioni dei file di database da un'istanza usando il cmdlet Invoke-SqlCmd e inserisce le righe risultanti in un database in un'istanza diversa di SQL Server. Si noti che mentre questo esempio sposta i dati tra istanze di SQL Server nello stesso computer, le istanze potrebbero trovarsi in due server completamente diversi.

Esempio 5: Scrivere dati in una tabella esistente di un database SQL di Azure (o in qualsiasi database usando l'autenticazione 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

Questo esempio illustra come usare il cmdlet Write-SqlTableData con l'autenticazione SQL. La maggior parte del codice è solo ADO.Net e SMO boilerplate necessario per creare l'oggetto necessario (l'oggetto SMO Table che rappresenta la tabella di destinazione) che viene passato al cmdlet tramite il parametro -InputOject.

Esempio 6: Scrivere (e leggere) dati in una tabella esistente di un database SQL di Azure usando l'identità gestita di una macchina virtuale di 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
#

Parametri

-AccessToken

Token di accesso usato per eseguire l'autenticazione a SQL Server, come alternativa all'autenticazione utente/password o windows.

Può essere usato, ad esempio, per connettersi a SQL Azure DB e SQL Azure Managed Instance usando un Service Principal o un Managed Identity.

Il parametro da usare può essere una stringa che rappresenta il token o un oggetto PSAccessToken restituito eseguendo Get-AzAccessToken -ResourceUrl https://database.windows.net.

Questo parametro è nuovo nella versione 22 del modulo.

Tipo:PSObject
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-ConnectionTimeout

Specifica il numero di secondi di attesa di una connessione server prima di un errore di timeout. Il valore di timeout deve essere un numero intero compreso tra 0 e 65534. Se si specifica 0, i tentativi di connessione non si verifica il timeout.

Tipo:Int32
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-ConnectToDatabase

Quando si stabilisce la connessione, forzare il cmdlet a usare il database passato (-DatabaseName) come catalogo iniziale. Questo parametro può essere utile per consentire agli utenti con privilegi limitati di connettersi a un database esistente per l'operazione di scrittura. Non usare quando è necessario creare il database.

Tipo:SwitchParameter
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-Credential

Specifica un oggetto PSCredential per la connessione a SQL Server. Per ottenere un oggetto credenziale, usare il cmdlet Get-Credential. Per altre informazioni, digitare Get-Help Get-Credential.

Tipo:PSCredential
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-DatabaseName

Specifica il nome del database che contiene la tabella.

Il cmdlet supporta la citazione del valore. Non è necessario racchiudere tra virgolette o caratteri speciali di escape.

Tipo:String
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-Encrypt

Tipo di crittografia da usare per la connessione a SQL Server.

Questo valore esegue il mapping alla proprietà EncryptSqlConnectionEncryptOption sull'oggetto SqlConnection del driver Microsoft.Data.SqlClient.

Nella versione 22 del modulo, il valore predefinito è Optional (per compatibilità con v21). Nella versione 23+ del modulo, il valore predefinito sarà "Obbligatorio", che potrebbe creare una modifica di rilievo per gli script esistenti.

Questo parametro è nuovo nella versione 22 del modulo.

Tipo:String
Valori accettati:Mandatory, Optional, Strict
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-Force

Indica che questo cmdlet crea oggetti SQL Server mancanti. Questi includono il database, lo schema e la tabella. Per creare questi oggetti, è necessario disporre delle credenziali appropriate.

Se non si specifica questo parametro per gli oggetti mancanti, il cmdlet restituisce un errore.

Tipo:SwitchParameter
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-HostNameInCertificate

Nome host da usare per convalidare il certificato TLS/SSL di SQL Server. È necessario passare questo parametro se l'istanza di SQL Server è abilitata per Forza crittografia e si vuole connettersi a un'istanza usando nome host/nome breve. Se questo parametro viene omesso, è necessario passare il nome di dominio completo (FQDN) a -ServerInstance per connettersi a un'istanza di SQL Server abilitata per Forza crittografia.

Questo parametro è nuovo nella versione 22 del modulo.

Tipo:String
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-IgnoreProviderContext

Indica che questo cmdlet non usa il contesto corrente per eseguire l'override dei valori del ServerInstance, DatabaseName, SchemaNamee parametri TableName. Se non si specifica questo parametro, il cmdlet ignora i valori di questi parametri, se possibile, a favore del contesto in cui si esegue il cmdlet.

Tipo:SwitchParameter
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-InputData

Specifica i dati da scrivere nel database.

I dati di input tipici sono System.Data.DataTable, ma è possibile specificare System.Data.DataSet o oggetti System.Data.DateRow* .

Tipo:PSObject
Posizione:Named
Valore predefinito:None
Necessario:True
Accettare l'input della pipeline:True
Accettare caratteri jolly:False

-InputObject

Specifica una matrice di oggetti SMO (SQL Server Management Objects) che rappresentano la tabella in cui scrive questo cmdlet.

Tipo:Table[]
Posizione:1
Valore predefinito:None
Necessario:True
Accettare l'input della pipeline:True
Accettare caratteri jolly:False

-Passthru

Indica che questo cmdlet restituisce un SMO. Oggetto Table. Questo oggetto rappresenta la tabella che include i dati aggiunti. È possibile operare sulla tabella dopo l'operazione di scrittura.

Tipo:SwitchParameter
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-Path

Specifica il percorso completo nel contesto del provider SQL della tabella in cui questo cmdlet scrive i dati.

Tipo:String[]
Posizione:1
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-ProgressAction

Determina in che modo PowerShell risponde agli aggiornamenti dello stato generati da uno script, un cmdlet o un provider, ad esempio le barre di stato generate dal cmdlet Write-Progress. Il cmdlet Write-Progress crea barre di stato che mostrano lo stato di un comando.

Tipo:ActionPreference
Alias:proga
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-SchemaName

Specifica il nome dello schema per la tabella.

Se si esegue questo cmdlet nel contesto di un database o di un elemento figlio di un database, il cmdlet ignora questo valore di parametro. Specificare il parametro IgnoreProviderContext affinché il cmdlet usi comunque il valore del parametro schemaName .

Il cmdlet supporta la citazione del valore. Non è necessario racchiudere tra virgolette o caratteri speciali di escape.

Tipo:String
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-ServerInstance

Specifica il nome di un'istanza di SQL Server. Per l'istanza predefinita, specificare il nome del computer. Per le istanze denominate, usare il formato ComputerName\InstanceName.

Se si esegue questo cmdlet nel contesto di un database o di un elemento figlio di un database, il cmdlet ignora questo valore di parametro. Specificare il parametro IgnoreProviderContext per il cmdlet per usare comunque il valore del parametro ServerInstance .

Tipo:String[]
Posizione:1
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:True
Accettare caratteri jolly:False

-SuppressProviderContextWarning

Indica che questo cmdlet elimina il messaggio di avviso che indica che il cmdlet usa il contesto del provider.

Tipo:SwitchParameter
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-TableName

Specifica il nome della tabella da cui viene letto questo cmdlet.

Se si esegue questo cmdlet nel contesto di un database o di un elemento figlio di un database, il cmdlet ignora questo valore di parametro. Specificare il parametro IgnoreProviderContext per il cmdlet per usare comunque il valore del parametro TableName .

Il cmdlet supporta la citazione del valore. Non è necessario racchiudere tra virgolette o caratteri speciali di escape.

Tipo:String
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-Timeout

Specifica un valore di timeout, espresso in secondi, per l'operazione di scrittura. Se non si specifica un valore, il cmdlet usa un valore predefinito (in genere, 30s). Per evitare un timeout, passare 0. Il timeout deve essere un valore intero compreso tra 0 e 65535.

Tipo:Int32
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-TrustServerCertificate

Indica se il canale verrà crittografato durante il bypass della catena di certificati per convalidare l'attendibilità.

Nella versione 22 del modulo, il valore predefinito è $true (per compatibilità con v21). Nella versione 23+ del modulo, il valore predefinito sarà "$false", che potrebbe creare una modifica di rilievo per gli script esistenti.

Questo parametro è nuovo nella versione 22 del modulo.

Tipo:SwitchParameter
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

Input

System.Management.Automation.PSObject

System.String[]

Microsoft.SqlServer.Management.Smo.Table[]