Share via


Write-SqlTableData

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

Syntax

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

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 no conjunto de dados será gravada no banco de dados.

Você pode usar esse cmdlet com o provedor de SQL 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 executados em um sistema e as grava em uma tabela.

O cmdlet atual grava os dados MyDatabase.dbo.TaskManagerDump em em 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 $Table 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 no 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 de SQL Server. Observe que, embora este exemplo mova dados entre instâncias de 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 a 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 o SMO clichê necessário para criar o objeto necessário (o SMO Table objeto que representa a tabela de destino) necessário, que é passado para o cmdlet por meio do -InputOject parâmetro .

Parâmetros

-AccessToken

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

Isso pode ser usado, por exemplo, para se conectar SQL Azure DB e SQL Azure Managed Instance usar 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 PSAccessToken objeto conforme retornado executando Get-AzAccessToken -ResourceUrl https://database.windows.net.

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

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

-ConnectionTimeout

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

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

-Credential

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

Type:PSCredential
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters: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 nem escapar de caracteres especiais.

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

-Encrypt

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

Esse valor é mapeado para a Encrypt propriedade SqlConnectionEncryptOption 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 interruptiva para scripts existentes.

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

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

-Force

Indica que esse cmdlet cria objetos 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.

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters: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 sua instância de 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 de SQL Server habilitada para o Force Encryption.

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

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

-IgnoreProviderContext

Indica que esse cmdlet não usa o contexto atual para substituir os valores dos parâmetros ServerInstance, DatabaseName, SchemaName e 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.

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

-InputData

Especifica os dados a serem gravados no banco de dados.

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

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

-InputObject

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

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

-Passthru

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

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

-Path

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

Type:String[]
Position:1
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters: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 que o cmdlet use o valor do parâmetro SchemaName de qualquer maneira.

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

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

-ServerInstance

Especifica o nome de uma instância de 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.

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

-SuppressProviderContextWarning

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

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters: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 o cmdlet usar o valor do parâmetro TableName de qualquer maneira.

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

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

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

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

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

Entradas

System.Management.Automation.PSObject

System.String[]

Microsoft.SqlServer.Management.Smo.Table[]