Freigeben über


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\MyInstancein 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 Identityverwendet 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.netzurü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[]