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>]
     [<CommonParameters>]
Write-SqlTableData
     [-DatabaseName <String>]
     [-SchemaName <String>]
     [-TableName <String>]
     [-IgnoreProviderContext]
     [-SuppressProviderContextWarning]
     [-Force]
     -InputData <PSObject>
     [-Passthru]
     [-Timeout <Int32>]
     [[-ServerInstance] <String[]>]
     [-Credential <PSCredential>]
     [-ConnectionTimeout <Int32>]
     [-AccessToken <PSObject>]
     [-TrustServerCertificate]
     [-HostNameInCertificate <String>]
     [-Encrypt <String>]
     [<CommonParameters>]
Write-SqlTableData
     [-Force]
     -InputData <PSObject>
     [-Passthru]
     [-Timeout <Int32>]
     [-InputObject] <Table[]>
     [-AccessToken <PSObject>]
     [-TrustServerCertificate]
     [-HostNameInCertificate <String>]
     [-Encrypt <String>]
     [<CommonParameters>]

Descrizione

Il cmdlet Write-SqlTableData inserisce 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 oggetto DataSet, nel database viene scritta solo la prima tabella del set di dati.

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

Questo cmdlet può dedurre informazioni, ad esempio 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 inferisce 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 la posizione in modo che sia una posizione nel provider SQLSERVER. Il prompt dei comandi riflette la nuova posizione. Per altre informazioni, digitare Get-Help about_Providers.

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

Esempio 3: Importare dati da un file a 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 che 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 è più efficiente di una riga in base all'inserimento di righe)

Esempio 4: Recuperare i 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 Azure SQL (o 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) necessario che viene passato al cmdlet tramite il -InputOject parametro .

Parametri

-AccessToken

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

Questa operazione può essere usata, ad esempio, per connettersi a SQL Azure DB e SQL Azure Managed Instance usando un Service Principal oggetto o .Managed Identity

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

Questo parametro è nuovo nella versione 22 del modulo.

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ConnectionTimeout

Specifica il numero di secondi per attendere 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, non si verifica alcun timeout dei tentativi di connessione.

Type:Int32
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters: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.

Type:PSCredential
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-DatabaseName

Specifica il nome del database contenente la tabella.

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

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Encrypt

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

Questo valore esegue il Encrypt mapping alla proprietà SqlConnectionEncryptOption nell'oggetto SqlConnection del driver Microsoft.Data.SqlClient.

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

Questo parametro è nuovo nella versione 22 del modulo.

Type:String
Accepted values:Mandatory, Optional, Strict
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Force

Indica che questo cmdlet crea oggetti SQL Server mancanti. Includono il database, lo schema e la tabella. È necessario disporre delle credenziali appropriate per creare questi oggetti.

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

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-HostNameInCertificate

Nome host da usare per la convalida del certificato TLS/SSL di SQL Server. È necessario passare questo parametro se l'istanza di SQL Server è abilitata per Force Encryption 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 Force Encryption.

Questo parametro è nuovo nella versione 22 del modulo.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-IgnoreProviderContext

Indica che questo cmdlet non usa il contesto corrente per eseguire l'override dei valori dei parametri ServerInstance, DatabaseName, SchemaName e 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.

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputData

Specifica i dati da scrivere nel database.

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

Type:PSObject
Position:Named
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-InputObject

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

Type:Table[]
Position:1
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters: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.

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Path

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

Type:String[]
Position:1
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters: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 per il cmdlet per usare comunque il valore del parametro SchemaName .

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

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters: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 .

Type:String[]
Position:1
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-SuppressProviderContextWarning

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

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters: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 virgolette o caratteri speciali di escape.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Timeout

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

Type:Int32
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters: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 la compatibilità con v21). Nella versione 23+ del modulo il valore predefinito sarà "$false", che può creare una modifica di rilievo per gli script esistenti.

Questo parametro è nuovo nella versione 22 del modulo.

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

Input

System.Management.Automation.PSObject

System.String[]

Microsoft.SqlServer.Management.Smo.Table[]