Compartilhar via


Write-SqlTableData

Grava dados em uma tabela de um banco de dados SQL.

Sintaxe

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

O cmdlet Write-SqlTableData insere dados em uma tabela de um banco de dados SQL. Esse cmdlet aceita os seguintes tipos de entrada os seguintes formatos de saída:

  • System.Data.DataSet
  • System.Data.DataTable
  • Objetos System.Data.DateRow
  • Coleção de objetos

Se você fornecer um DataSet, somente a primeira tabela do conjunto de dados será gravada no banco de dados.

Você pode usar esse cmdlet com o provedor de SQL do Windows PowerShell.

Esse cmdlet pode inferir informações como servidor, banco de dados, esquema e tabela de seu caminho atual.

Esse cmdlet espera que a tabela exista. Por padrão, o cmdlet acrescenta dados a essa tabela.

Se você especificar o parâmetro Force, o cmdlet gerará objetos ausentes, que incluem o banco de dados, o esquema de tabela e a própria tabela. Esse uso permite a transferência rápida de dados para um banco de dados. O cmdlet infere o esquema da tabela dos dados. O resultado pode não ser ideal. Por exemplo, as cadeias de caracteres são mapeadas para NVARCHAR(MAX).

Exemplos

Exemplo 1: gravar informações sobre processos em uma tabela

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

Este exemplo obtém informações sobre processos que são executados em um sistema e o grava em uma tabela.

O cmdlet atual grava os dados para MyDatabase.dbo.TaskManagerDump no MyServer\MyInstance. Como você especifica o parâmetro Force, se o banco de dados, o esquema e a tabela não existirem, esse cmdlet os criará.

Exemplo 2: gravar dados em uma tabela

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

O primeiro comando altera o local para ser um local no provedor SQLSERVER. O prompt de comando reflete o novo local. Para obter mais informações, digite Get-Help about_Providers.

O comando final exibe o conteúdo da variável usando o cmdlet Read-SqlTableData.

Exemplo 3: importar dados de um arquivo para uma tabela

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

Este exemplo é executado completamente a partir do prompt de arquivo. Ele não pode usar informações de contexto. Portanto, você deve especificar todos os parâmetros relevantes.

Observe o uso do "" na frente da linha: isso é para forçar o PowerShell a passar todo o conteúdo do arquivo diretamente para o cmdlet Write-SqlTableData, que, por sua vez, pode fazer uma inserção em massa (que é muito mais performante do que uma linha por inserção de linha)

Exemplo 4: recuperar dados de uma instância e enviar por push para a tabela de um banco de dados em outra instância

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

Este exemplo obtém informações sobre tamanhos de arquivos de banco de dados de uma instância usando o cmdlet Invoke-SqlCmd e insere as linhas resultantes em um banco de dados em uma instância diferente do SQL Server. Observe que, embora este exemplo mova dados entre instâncias do SQL Server no mesmo computador, as instâncias podem estar em dois servidores completamente diferentes.

Exemplo 5: gravar dados em uma tabela existente de um Banco de Dados SQL do Azure (ou qualquer banco de dados usando autenticação 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

Este exemplo mostra como usar o cmdlet Write-SqlTableData com a Autenticação SQL. A maior parte do código é apenas ADO.Net e clichê de SMO necessários para criar o objeto necessário (o objeto SMO Table que representa a tabela de destino) necessário que é passado para o cmdlet por meio do parâmetro -InputOject.

Exemplo 6: gravar (e ler) dados em uma tabela existente de um Banco de Dados SQL do Azure usando a identidade gerenciada de uma VM do 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
#

Parâmetros

-AccessToken

O token de acesso usado para autenticar no SQL Server, como uma alternativa ao usuário/senha ou à Autenticação do Windows.

Isso pode ser usado, por exemplo, para se conectar a SQL Azure DB e SQL Azure Managed Instance usando um Service Principal ou um Managed Identity.

O parâmetro a ser usado pode ser uma cadeia de caracteres que representa o token ou um objeto PSAccessToken conforme retornado executando Get-AzAccessToken -ResourceUrl https://database.windows.net.

Esse parâmetro é novo na v22 do módulo.

Tipo:PSObject
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-ConnectionTimeout

Especifica o número de segundos para aguardar uma conexão de servidor antes de uma falha de tempo limite. O valor de tempo limite deve ser um inteiro entre 0 e 65534. Se 0 for especificado, as tentativas de conexão não chegarão ao tempo limite.

Tipo:Int32
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-ConnectToDatabase

Ao estabelecer a conexão, force o cmdlet a usar o banco de dados passado (-DatabaseName) como o catálogo inicial. Esse parâmetro pode ser útil para permitir que usuários com baixos privilégios se conectem a um banco de dados existente para a operação de gravação. Não usar quando o banco de dados precisar ser criado.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-Credential

Especifica um objeto PSCredential para a conexão com o SQL Server. Para obter um objeto de credencial, use o cmdlet Get-Credential. Para obter mais informações, digite Get-Help Get-Credential.

Tipo:PSCredential
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-DatabaseName

Especifica o nome do banco de dados que contém a tabela.

O cmdlet dá suporte à citação do valor. Você não precisa citar ou escapar de caracteres especiais.

Tipo:String
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-Encrypt

O tipo de criptografia a ser usado ao se conectar ao SQL Server.

Esse valor é mapeado para a propriedade EncryptSqlConnectionEncryptOption no objeto SqlConnection do driver Microsoft.Data.SqlClient.

Na v22 do módulo, o padrão é Optional (para compatibilidade com v21). Na v23+ do módulo, o valor padrão será 'Obrigatório', o que pode criar uma alteração significativa para scripts existentes.

Esse parâmetro é novo na v22 do módulo.

Tipo:String
Valores aceitos:Mandatory, Optional, Strict
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-Force

Indica que esse cmdlet cria objetos do SQL Server ausentes. Isso inclui o banco de dados, o esquema e a tabela. Você deve ter as credenciais apropriadas para criar esses objetos.

Se você não especificar esse parâmetro para objetos ausentes, o cmdlet retornará um erro.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-HostNameInCertificate

O nome do host a ser usado na validação do certificado TLS/SSL do SQL Server. Você deve passar esse parâmetro se a instância do SQL Server estiver habilitada para o Force Encryption e quiser se conectar a uma instância usando nome de host/nome curto. Se esse parâmetro for omitido, passar o FQDN (Nome de Domínio Totalmente Qualificado) para -ServerInstance será necessário para se conectar a uma instância do SQL Server habilitada para o Force Encryption.

Esse parâmetro é novo na v22 do módulo.

Tipo:String
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-IgnoreProviderContext

Indica que esse cmdlet não usa o contexto atual para substituir os valores dos parâmetros ServerInstance, DatabaseName, SchemaNamee TableName. Se você não especificar esse parâmetro, o cmdlet ignorará os valores desses parâmetros, se possível, em favor do contexto no qual você executa o cmdlet.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-InputData

Especifica os dados a serem gravados no banco de dados.

Os dados de entrada típicos são umSystem.Data.DataTable , mas você pode especificar objetos System.Data.DataSet ou System.Data.DateRow*.

Tipo:PSObject
Cargo:Named
Valor padrão:None
Obrigatório:True
Aceitar a entrada de pipeline:True
Aceitar caracteres curinga:False

-InputObject

Especifica uma matriz de objetos SMO (SQL Server Management Objects) que representam a tabela à qual esse cmdlet grava.

Tipo:Table[]
Cargo:1
Valor padrão:None
Obrigatório:True
Aceitar a entrada de pipeline:True
Aceitar caracteres curinga:False

-Passthru

Indica que esse cmdlet retorna um SMO . Objeto de tabela. Esse objeto representa a tabela que inclui os dados adicionados. Você pode operar na tabela após a operação de gravação.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-Path

Especifica o caminho completo no contexto do Provedor de SQL da tabela em que esse cmdlet grava dados.

Tipo:String[]
Cargo:1
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-ProgressAction

Determina como o PowerShell responde às atualizações de progresso geradas por um script, cmdlet ou provedor, como as barras de progresso geradas pelo cmdlet Write-Progress. O cmdlet Write-Progress cria barras de progresso que mostram o status de um comando.

Tipo:ActionPreference
Aliases:proga
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-SchemaName

Especifica o nome do esquema para a tabela.

Se você executar esse cmdlet no contexto de um banco de dados ou um item filho de um banco de dados, o cmdlet ignorará esse valor de parâmetro. Especifique o parâmetro IgnoreProviderContext para o cmdlet usar o valor do parâmetro SchemaName de qualquer maneira.

O cmdlet dá suporte à citação do valor. Você não precisa citar ou escapar de caracteres especiais.

Tipo:String
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-ServerInstance

Especifica o nome de uma instância do SQL Server. Para a instância padrão, especifique o nome do computador. Para instâncias nomeadas, use o formato ComputerName\InstanceName.

Se você executar esse cmdlet no contexto de um banco de dados ou um item filho de um banco de dados, o cmdlet ignorará esse valor de parâmetro. Especifique o parâmetro IgnoreProviderContext para o cmdlet usar o valor do parâmetro ServerInstance de qualquer maneira.

Tipo:String[]
Cargo:1
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:True
Aceitar caracteres curinga:False

-SuppressProviderContextWarning

Indica que esse cmdlet suprime a mensagem de aviso que afirma que o cmdlet usa o contexto do provedor.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-TableName

Especifica o nome da tabela da qual este cmdlet lê.

Se você executar esse cmdlet no contexto de um banco de dados ou um item filho de um banco de dados, o cmdlet ignorará esse valor de parâmetro. Especifique o parâmetro IgnoreProviderContext para que o cmdlet use o valor do parâmetro TableName de qualquer maneira.

O cmdlet dá suporte à citação do valor. Você não precisa citar ou escapar de caracteres especiais.

Tipo:String
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-Timeout

Especifica um valor de tempo limite, em segundos, para a operação de gravação. Se você não especificar um valor, o cmdlet usará um valor padrão (normalmente, 30s). Para evitar um tempo limite, passe 0. O tempo limite deve ser um valor inteiro entre 0 e 65535.

Tipo:Int32
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-TrustServerCertificate

Indica se o canal será criptografado ao ignorar a cadeia de certificados para validar a confiança.

Na v22 do módulo, o padrão é $true (para compatibilidade com v21). Na v23+ do módulo, o valor padrão será "$false", o que pode criar uma alteração significativa para scripts existentes.

Esse parâmetro é novo na v22 do módulo.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

Entradas

System.Management.Automation.PSObject

System.String[]

Microsoft.SqlServer.Management.Smo.Table[]