Write-SqlTableData
Schreibt Daten in eine Tabelle einer SQL-Datenbank.
Syntax
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>]
Beschreibung
Das cmdlet Write-SqlTableData fügt Daten in eine Tabelle einer SQL-Datenbank ein. Dieses Cmdlet akzeptiert die folgenden Eingabetypen für die folgenden Ausgabeformate:
- System.Data.DataSet
- System.Data.DataTable
- System.Data.DateRow-Objekte
- Auflistung von Objekten
Wenn Sie eine DataSet-bereitstellen, wird nur die erste Tabelle im Dataset in die Datenbank geschrieben.
Sie können dieses Cmdlet mit dem Windows PowerShell SQL-Anbieter verwenden.
Dieses Cmdlet kann Informationen wie Server, Datenbank, Schema und Tabelle aus dem aktuellen Pfad ableiten.
Dieses Cmdlet erwartet, dass die Tabelle vorhanden ist. Standardmäßig fügt das Cmdlet Daten an diese Tabelle an.
Wenn Sie den Parameter Force angeben, generiert das Cmdlet fehlende Objekte, die die Datenbank, das Tabellenschema und die Tabelle selbst enthalten. Diese Verwendung ermöglicht eine schnelle Übertragung von Daten in eine Datenbank. Das Cmdlet leitet das Schema der Tabelle aus den Daten ab. Das Ergebnis ist möglicherweise nicht optimal. Beispielsweise werden Zeichenfolgen NVARCHAR(MAX) zugeordnet.
Beispiele
Beispiel 1: Schreiben von Informationen zu Prozessen in eine Tabelle
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
In diesem Beispiel werden Informationen zu Prozessen, die auf einem System ausgeführt werden, in eine Tabelle geschrieben.
Das aktuelle Cmdlet schreibt die Daten in MyServer\MyInstance
in MyDatabase.dbo.TaskManagerDump
.
Da Sie den Parameter Force angeben, wenn die Datenbank, das Schema und die Tabelle nicht vorhanden sind, erstellt dieses Cmdlet diese.
Beispiel 2: Schreiben von Daten in eine Tabelle
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
Der erste Befehl ändert den Speicherort als Speicherort im SQLSERVER-Anbieter. Die Eingabeaufforderung gibt den neuen Speicherort wieder. Geben Sie Get-Help about_Providers ein, um weitere Informationen zu erfahren.
Der letzte Befehl zeigt den Inhalt der $Table
Variablen mithilfe des Cmdlets Read-SqlTableData an.
Beispiel 3: Importieren von Daten aus einer Datei in eine Tabelle
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
In diesem Beispiel wird die Dateiaufforderung vollständig ausgeführt. Kontextinformationen können nicht verwendet werden. Daher müssen Sie alle relevanten Parameter angeben.
Beachten Sie die Verwendung des "," vor der Zeile: Dies besteht darin, PowerShell zu erzwingen, den gesamten Inhalt der Datei direkt an das cmdlet Write-SqlTableData zu übergeben, was wiederum ein Masseneinfügevorgang ausführen kann (was eine einfachere Leistung als eine Zeile nach Zeileneinfügung ist)
Beispiel 4: Abrufen von Daten aus einer Instanz und Push in eine Tabelle einer Datenbank in einer anderen Instanz
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
In diesem Beispiel werden Informationen zu Datenbankdateien aus einer Instanz mithilfe des cmdlets Invoke-SqlCmd abgerufen und die resultierenden Zeilen in eine Datenbank in einer anderen Instanz von SQL Server eingefügt. Beachten Sie, dass während dieses Beispiel Daten zwischen Instanzen von SQL Server auf demselben Computer verschiebt, können sich die Instanzen auf zwei vollständig unterschiedlichen Servern befinden.
Beispiel 5: Schreiben von Daten in eine vorhandene Tabelle einer Azure SQL-Datenbank (oder einer beliebigen Datenbank mit SQL Auth)
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
In diesem Beispiel wird gezeigt, wie Sie das cmdlet Write-SqlTableData mit SQL-Authentifizierung verwenden.
Der großteil des Codes ist nur ADO.Net und SMO-Textbausteine erforderlich, um das erforderliche Objekt (das SMO Table
-Objekt, das die Zieltabelle darstellt) zu erstellen, die über den parameter -InputOject
an das Cmdlet übergeben wird.
Beispiel 6: Schreiben (und Lesen) von Daten in eine vorhandene Tabelle einer Azure SQL-Datenbank mithilfe der verwalteten Identität einer Azure-VM.
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
#
Parameter
-AccessToken
Das Zugriffstoken, das zur Authentifizierung bei SQL Server verwendet wird, als Alternative zur Benutzer-/Kennwort- oder Windows-Authentifizierung.
Dies kann z. B. zum Herstellen einer Verbindung mit SQL Azure DB
und SQL Azure Managed Instance
mithilfe eines Service Principal
oder einer Managed Identity
verwendet werden.
Der zu verwendende Parameter kann entweder eine Zeichenfolge sein, die das Token darstellt, oder ein PSAccessToken
-Objekt, wie durch Ausführen von Get-AzAccessToken -ResourceUrl https://database.windows.net
zurückgegeben wird.
Dieser Parameter ist neu in v22 des Moduls.
Typ: | PSObject |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-ConnectionTimeout
Gibt die Anzahl der Sekunden an, die auf eine Serververbindung warten sollen, bevor ein Timeoutfehler auftritt. Der Timeoutwert muss eine ganze Zahl zwischen 0 und 65534 sein. Wenn 0 angegeben ist, werden Verbindungsversuche nicht unterbrochen.
Typ: | Int32 |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-ConnectToDatabase
Wenn Sie die Verbindung herstellen, erzwingen Sie, dass das Cmdlet die übergebene Datenbank (-DatabaseName
) als anfänglichen Katalog verwendet.
Dieser Parameter kann hilfreich sein, damit Benutzer mit niedriger Privilegierten eine Verbindung mit einer vorhandenen Datenbank für den Schreibvorgang herstellen können.
Verwenden Sie nicht, wenn die Datenbank erstellt werden muss.
Typ: | SwitchParameter |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-Credential
Gibt ein PSCredential -Objekt für die Verbindung mit SQL Server an. Verwenden Sie das Cmdlet Get-Credential, um ein Anmeldeinformationsobjekt abzurufen. Geben Sie Get-Help Get-Credential ein, um weitere Informationen zu erhalten.
Typ: | PSCredential |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-DatabaseName
Gibt den Namen der Datenbank an, die die Tabelle enthält.
Das Cmdlet unterstützt das Zitieren des Werts. Sie müssen keine Sonderzeichen anführungs- oder Escapezeichen setzen.
Typ: | String |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-Encrypt
Der Verschlüsselungstyp, der beim Herstellen einer Verbindung mit SQL Server verwendet werden soll.
Dieser Wert ist der Encrypt
Eigenschaft SqlConnectionEncryptOption
für das SqlConnection-Objekt des Microsoft.Data.SqlClient-Treibers zugeordnet.
In v22 des Moduls ist die Standardeinstellung Optional
(aus Kompatibilität mit v21). In v23+ des Moduls lautet der Standardwert "Verpflichtend", wodurch für vorhandene Skripts eine bahnbrechende Änderung erstellt werden kann.
Dieser Parameter ist neu in v22 des Moduls.
Typ: | String |
Zulässige Werte: | Mandatory, Optional, Strict |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-Force
Gibt an, dass dieses Cmdlet fehlende SQL Server-Objekte erstellt. Dazu gehören die Datenbank, das Schema und die Tabelle. Sie müssen über entsprechende Anmeldeinformationen verfügen, um diese Objekte zu erstellen.
Wenn Sie diesen Parameter für fehlende Objekte nicht angeben, gibt das Cmdlet einen Fehler zurück.
Typ: | SwitchParameter |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-HostNameInCertificate
Der Hostname, der beim Überprüfen des SQL Server TLS/SSL-Zertifikats verwendet werden soll. Sie müssen diesen Parameter übergeben, wenn Ihre SQL Server-Instanz für die Erzwingungsverschlüsselung aktiviert ist und Sie eine Verbindung mit einer Instanz mit hostname/shortname herstellen möchten. Wenn dieser Parameter nicht angegeben wird, ist das Übergeben des vollqualifizierten Domänennamens (Fully Qualified Domain Name, FQDN) an -ServerInstance erforderlich, um eine Verbindung mit einer SQL Server-Instanz herzustellen, die für die Erzwingungsverschlüsselung aktiviert ist.
Dieser Parameter ist neu in v22 des Moduls.
Typ: | String |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-IgnoreProviderContext
Gibt an, dass dieses Cmdlet nicht den aktuellen Kontext verwendet, um die Werte der ServerInstance-, DatabaseName-, SchemaName-und TableName- Parameter außer Kraft zu setzen. Wenn Sie diesen Parameter nicht angeben, ignoriert das Cmdlet die Werte dieser Parameter, falls möglich, zugunsten des Kontexts, in dem Sie das Cmdlet ausführen.
Typ: | SwitchParameter |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-InputData
Gibt die Daten an, die in die Datenbank geschrieben werden sollen.
Typische Eingabedaten sind eine System.Data.DataTable-, aber Sie können System.Data.DataSet- oder System.Data.DateRow-* -Objekte angeben.
Typ: | PSObject |
Position: | Named |
Standardwert: | None |
Erforderlich: | True |
Pipelineeingabe akzeptieren: | True |
Platzhalterzeichen akzeptieren: | False |
-InputObject
Gibt ein Array von SQL Server Management Objects (SMO)-Objekten an, die die Tabelle darstellen, in die dieses Cmdlet schreibt.
Typ: | Table[] |
Position: | 1 |
Standardwert: | None |
Erforderlich: | True |
Pipelineeingabe akzeptieren: | True |
Platzhalterzeichen akzeptieren: | False |
-Passthru
Gibt an, dass dieses Cmdlet eine SMO zurückgibt. Table-Objekt. Dieses Objekt stellt die Tabelle dar, die die hinzugefügten Daten enthält. Sie können die Tabelle nach dem Schreibvorgang verwenden.
Typ: | SwitchParameter |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-Path
Gibt den vollständigen Pfad im Kontext des SQL-Anbieters der Tabelle an, in der dieses Cmdlet Daten schreibt.
Typ: | String[] |
Position: | 1 |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-ProgressAction
Bestimmt, wie PowerShell auf Statusaktualisierungen reagiert, die von einem Skript, Cmdlet oder Anbieter generiert werden, z. B. auf die Statusanzeigen, die vom Cmdlet Write-Progress generiert werden. Das Cmdlet Write-Progress erstellt Statusanzeigen, die den Status eines Befehls anzeigen.
Typ: | ActionPreference |
Aliase: | proga |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-SchemaName
Gibt den Namen des Schemas für die Tabelle an.
Wenn Sie dieses Cmdlet im Kontext einer Datenbank oder eines untergeordneten Elements einer Datenbank ausführen, ignoriert das Cmdlet diesen Parameterwert. Geben Sie den parameter IgnoreProviderContext für das Cmdlet an, um trotzdem den Wert des SchemaName Parameter zu verwenden.
Das Cmdlet unterstützt das Zitieren des Werts. Sie müssen keine Sonderzeichen anführungs- oder Escapezeichen setzen.
Typ: | String |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-ServerInstance
Gibt den Namen einer Instanz von SQL Server an.
Geben Sie für die Standardinstanz den Computernamen an.
Verwenden Sie für benannte Instanzen das Format ComputerName\InstanceName
.
Wenn Sie dieses Cmdlet im Kontext einer Datenbank oder eines untergeordneten Elements einer Datenbank ausführen, ignoriert das Cmdlet diesen Parameterwert. Geben Sie den IgnoreProviderContext- Parameter für das Cmdlet an, um den Wert des ServerInstance- Parameters trotzdem zu verwenden.
Typ: | String[] |
Position: | 1 |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | True |
Platzhalterzeichen akzeptieren: | False |
-SuppressProviderContextWarning
Gibt an, dass dieses Cmdlet die Warnmeldung unterdrückt, die besagt, dass das Cmdlet den Anbieterkontext verwendet.
Typ: | SwitchParameter |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-TableName
Gibt den Namen der Tabelle an, aus der dieses Cmdlet liest.
Wenn Sie dieses Cmdlet im Kontext einer Datenbank oder eines untergeordneten Elements einer Datenbank ausführen, ignoriert das Cmdlet diesen Parameterwert. Geben Sie den IgnoreProviderContext- Parameter für das Cmdlet an, um den Wert des TableName Parameter trotzdem zu verwenden.
Das Cmdlet unterstützt das Zitieren des Werts. Sie müssen keine Sonderzeichen anführungs- oder Escapezeichen setzen.
Typ: | String |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-Timeout
Gibt einen Timeoutwert in Sekunden für den Schreibvorgang an. Wenn Sie keinen Wert angeben, verwendet das Cmdlet einen Standardwert (in der Regel 30s). Um ein Timeout zu vermeiden, übergeben Sie 0. Das Timeout muss ein ganzzahliger Wert zwischen 0 und 65535 sein.
Typ: | Int32 |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-TrustServerCertificate
Gibt an, ob der Kanal verschlüsselt wird, während die Zertifikatkette umgangen wird, um die Vertrauensstellung zu überprüfen.
In v22 des Moduls ist die Standardeinstellung $true
(aus Kompatibilität mit v21). In v23+ des Moduls lautet der Standardwert "$false", wodurch möglicherweise eine änderung für vorhandene Skripts geändert wird.
Dieser Parameter ist neu in v22 des Moduls.
Typ: | SwitchParameter |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
Eingaben
System.Management.Automation.PSObject
System.String[]
Microsoft.SqlServer.Management.Smo.Table[]