Поделиться через


Write-SqlTableData

Записывает данные в таблицу базы данных SQL.

Синтаксис

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

Описание

Командлет Write-SqlTableData вставляет данные в таблицу базы данных SQL. Этот командлет принимает следующие типы входных данных в следующих форматах выходных данных:

  • System.DataSet
  • System.Data.DataTable
  • Объекты System.Data.DateRow
  • Коллекция объектов

Если вы предоставляете Набор данных, в базу данных записывается только первая таблица в наборе данных.

Этот командлет можно использовать с поставщиком SQL Windows PowerShell.

Этот командлет может выводить такие сведения, как сервер, база данных, схема и таблица из текущего пути.

Этот командлет ожидает, что таблица будет существовать. По умолчанию командлет добавляет данные в эту таблицу.

Если указать параметр Force, командлет создает отсутствующие объекты, которые включают базу данных, схему таблицы и саму таблицу. Это позволяет быстро передавать данные в базу данных. Командлет содержит схему таблицы из данных. Результат может быть неоптимальным. Например, строки сопоставляются с NVARCHAR(MAX).

Примеры

Пример 1. Запись сведений о процессах в таблицу

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

Этот пример получает сведения о процессах, выполняемых в системе, и записывает их в таблицу.

Текущий командлет записывает данные в MyDatabase.dbo.TaskManagerDump на MyServer\MyInstance. Так как вы указываете параметр Force, если база данных, схема и таблица не существуют, этот командлет создает их.

Пример 2. Запись данных в таблицу

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

Первая команда изменяет расположение, чтобы быть расположением в поставщике SQLSERVER. Командная строка отражает новое расположение. Дополнительные сведения см. в Get-Help about_Providers.

Последняя команда отображает содержимое переменной $Table с помощью командлета Read-SqlTableData.

Пример 3. Импорт данных из файла в таблицу

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

Этот пример выполняется полностью из запроса файла. Не удается использовать сведения о контексте. Поэтому необходимо указать все соответствующие параметры.

Обратите внимание на использование "," перед строкой. Это позволяет PowerShell передавать все содержимое файла непосредственно в командлет Write-SqlTableData, который, в свою очередь, может выполнять массовую вставку (что является более производительной, чем строка по строке вставки).

Пример 4. Получение данных из одного экземпляра и отправка в таблицу базы данных на другом экземпляре

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

Этот пример получает сведения о размерах файлов базы данных из одного экземпляра с помощью командлета Invoke-SqlCmd и вставки результирующей строки в базу данных в другом экземпляре SQL Server. Обратите внимание, что в этом примере данные перемещаются между экземплярами SQL Server на одном компьютере, экземпляры могут находиться на двух полностью разных серверах.

Пример 5. Запись данных в существующую таблицу базы данных SQL Azure (или любой базы данных с помощью проверки подлинности 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

В этом примере показано, как использовать командлет Write-SqlTableData с проверкой подлинности SQL. Большая часть кода — это просто ADO.Net и шаблон SMO, необходимый для создания необходимого объекта (SMO Table объекта, представляющего целевую таблицу), необходимых командлету через параметр -InputOject.

Пример 6. Запись (и чтение) данных в существующую таблицу базы данных SQL Azure с помощью управляемого удостоверения виртуальной машины 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
#

Параметры

-AccessToken

Маркер доступа, используемый для проверки подлинности в SQL Server, в качестве альтернативы пользователю или паролю или проверке подлинности Windows.

Это можно использовать, например, для подключения к SQL Azure DB и SQL Azure Managed Instance с помощью Service Principal или Managed Identity.

Используемый параметр может быть строкой, представляющей маркер или объект PSAccessToken, как возвращается при выполнении Get-AzAccessToken -ResourceUrl https://database.windows.net.

Этот параметр является новым в версии 22 модуля.

Тип:PSObject
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-ConnectionTimeout

Указывает количество секунд ожидания подключения к серверу до сбоя времени ожидания. Значение времени ожидания должно быть целым числом от 0 до 65534. Если задано значение 0, попытки подключения не истекает.

Тип:Int32
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-ConnectToDatabase

При установке подключения принудительная командлету использовать переданный в базе данных (-DatabaseName) в качестве начального каталога. Этот параметр может быть полезен, чтобы разрешить пользователям с низким уровнем привилегий подключаться к существующей базе данных для операции записи. не использовать при создании базы данных.

Тип:SwitchParameter
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-Credential

Указывает объект PSCredential для подключения к SQL Server. Чтобы получить объект учетных данных, используйте командлет Get-Credential. Для получения дополнительных сведений введите Get-Help Get-Credential.

Тип:PSCredential
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-DatabaseName

Указывает имя базы данных, содержащей таблицу.

Командлет поддерживает кворирование значения. Вам не нужно цитировать или экранировать специальные символы.

Тип:String
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-Encrypt

Тип шифрования, используемый при подключении к SQL Server.

Это значение сопоставляется со свойством EncryptSqlConnectionEncryptOption в объекте SqlConnection драйвера Microsoft.Data.SqlClient.

В версии 22 модуля по умолчанию используется Optional (для совместимости с версией 21). В версии 23+ модуля значение по умолчанию будет "Обязательный", которое может создать критическое изменение для существующих скриптов.

Этот параметр является новым в версии 22 модуля.

Тип:String
Допустимые значения:Mandatory, Optional, Strict
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-Force

Указывает, что этот командлет создает отсутствующие объекты SQL Server. К ним относятся база данных, схема и таблица. Для создания этих объектов необходимо иметь соответствующие учетные данные.

Если этот параметр не указан для отсутствующих объектов, командлет возвращает ошибку.

Тип:SwitchParameter
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-HostNameInCertificate

Имя узла, используемое при проверке TLS/SSL-сертификата SQL Server. Этот параметр необходимо передать, если экземпляр SQL Server включен для принудительного шифрования и требуется подключиться к экземпляру с помощью имени узла или короткого имени. Если этот параметр опущен, передача полного доменного имени (FQDN) в -ServerInstance необходима для подключения к экземпляру SQL Server, включенного для принудительного шифрования.

Этот параметр является новым в версии 22 модуля.

Тип:String
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-IgnoreProviderContext

Указывает, что этот командлет не использует текущий контекст для переопределения значений ServerInstance, DatabaseName, SchemaNameи параметров TableName. Если этот параметр не указан, командлет игнорирует значения этих параметров, если это возможно, в пользу контекста, в котором выполняется командлет.

Тип:SwitchParameter
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-InputData

Указывает данные для записи в базу данных.

Типичные входные данные — это System.DataTable, но можно указать объекты System.Data.DataSet или System.Data.DateRow* .

Тип:PSObject
Position:Named
Default value:None
Обязательно:True
Принять входные данные конвейера:True
Принять подстановочные знаки:False

-InputObject

Задает массив объектов SQL Server Management Objects (SMO), представляющих таблицу, в которую записывается этот командлет.

Тип:Table[]
Position:1
Default value:None
Обязательно:True
Принять входные данные конвейера:True
Принять подстановочные знаки:False

-Passthru

Указывает, что этот командлет возвращает SMO. Объект табличного. Этот объект представляет таблицу, содержащую добавленные данные. Вы можете работать с таблицей после операции записи.

Тип:SwitchParameter
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-Path

Указывает полный путь в контексте поставщика SQL таблицы, в которой этот командлет записывает данные.

Тип:String[]
Position:1
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-ProgressAction

Определяет, как PowerShell реагирует на обновления хода выполнения, созданные скриптом, командлетом или поставщиком, например индикаторами хода выполнения, созданными командлетом Write-Progress. Командлет Write-Progress создает индикаторы хода выполнения, показывающие состояние команды.

Тип:ActionPreference
Aliases:proga
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-SchemaName

Указывает имя схемы для таблицы.

При выполнении этого командлета в контексте базы данных или дочернего элемента базы данных командлет игнорирует это значение параметра. Укажите параметр IgnoreProviderContext для командлета, чтобы использовать значение параметра SchemaName в любом случае.

Командлет поддерживает кворирование значения. Вам не нужно цитировать или экранировать специальные символы.

Тип:String
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-ServerInstance

Указывает имя экземпляра SQL Server. Для экземпляра по умолчанию укажите имя компьютера. Для именованных экземпляров используйте формат ComputerName\InstanceName.

При выполнении этого командлета в контексте базы данных или дочернего элемента базы данных командлет игнорирует это значение параметра. Укажите параметр IgnoreProviderContext, чтобы командлет использовал значение параметра ServerInstance в любом случае.

Тип:String[]
Position:1
Default value:None
Обязательно:False
Принять входные данные конвейера:True
Принять подстановочные знаки:False

-SuppressProviderContextWarning

Указывает, что этот командлет подавляет предупреждающее сообщение, указывающее, что командлет использует контекст поставщика.

Тип:SwitchParameter
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-TableName

Указывает имя таблицы, из которой считывается этот командлет.

При выполнении этого командлета в контексте базы данных или дочернего элемента базы данных командлет игнорирует это значение параметра. Укажите параметр IgnoreProviderContext для командлета, чтобы использовать значение параметра TableName в любом случае.

Командлет поддерживает кворирование значения. Вам не нужно цитировать или экранировать специальные символы.

Тип:String
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-Timeout

Задает значение времени ожидания (в секундах) для операции записи. Если значение не указано, командлет использует значение по умолчанию (обычно 30-х). Чтобы избежать времени ожидания, передайте 0. Время ожидания должно быть целым значением от 0 до 65535.

Тип:Int32
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-TrustServerCertificate

Указывает, будет ли канал зашифрован при обходе цепочки сертификатов для проверки доверия.

В версии 22 модуля по умолчанию используется $true (для совместимости с версией 21). В версии 23+ модуля значение по умолчанию будет иметь значение "$false", которое может создать критическое изменение для существующих скриптов.

Этот параметр является новым в версии 22 модуля.

Тип:SwitchParameter
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

Входные данные

System.Management.Automation.PSObject

System.String[]

Microsoft.SqlServer.Management.Smo.Table[]