Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Неочакван тип променлива, върнат от Receive-Job

  1. Има ли начин да се върне правилният/очакван тип променлива при извикване на Receive-Job ?

Поради използването на фоново задание губите точност на типа :обектите, които връщате, са емулации без метод от оригиналните типове.

Ръчното пресъздаване на оригиналните типове не си струва усилията и дори може да не е възможно - макар че може би работата с емулациите е достатъчна.

Актуализиране :Според вашия собствен отговор, превключване от работа с System.DataSet към System.DataTable доведе до полезни емулации за вас.

Вижте долния раздел за повече информация.

  1. Има ли по-добър начин за изпълнение на SQL заявки под различен AD акаунт, като се използва командата Invoke-Sqlcmd?

Имате нужда от в процес метод на извикване с цел поддържане на вярност на типата , но не мисля, че това е възможно с произволни команди, ако искате да имитирате друг потребител .

Например алтернативата в процеса (базирана на нишки) на Start-Job - Start-ThreadJob - няма -Credential параметър.

Следователно най-добрият ви залог е да опитате да направите Invoke-SqlCmd -Credential параметърът работи за вас или намерете различен по време на процеса начин за изпълнение на вашите заявки с идентификационни данни на даден потребител.

Сериализиране и десериализация на обекти във фонови задания / отдалечени / мини-обвивки:

Всеки път, когато PowerShell маршалира обекти през границите на процеса , той използва базирана на XML сериализация при източника и десериализация на дестинациятата , използвайки формат, известен като CLI XML (XML на общата езикова инфраструктура).

Това се случва в контекста на отдалечаването на PowerShell (напр. Invoke-Command извиквания с
-ComputerName параметър), както и във фонови задания (Start-Job ) и така нареченитемини-черупки (които се използват имплицитно, когато извиквате PowerShell CLI от вътре в самия PowerShell със скриптов блок; например powershell.exe { Get-Item / } ).

Тази десериализация поддържа точност на типа само за ограничен набор от известни типове , както е посочено в MS-PSRP, спецификацията на PowerShell Remoting Protocol Protocol. Тоест само екземпляри от фиксиран набор от типове се десериализират като оригиналния им тип .

Екземпляри от всички други типове емулират :списъчни типове стават [System.Collections.ArrayList] екземпляри, типовете речници стават [hasthable] екземпляри и други типове стани без метод (само за свойства) персонализирани обекти ([pscustomobject] случаи) , чиито .pstypenames свойството съдържа оригиналното име на тип с префикс Deserialized. (напр. Deserialized.System.Data.DataTable ), както и имената с еднакъв префикс на база на типа типове (йерархия на наследяване).

Освен това, дълбочината на рекурсията за обектни графики на не -[pscustomobject] екземпляри е ограничен до 1 ниво - имайте предвид, че това включва екземпляр на PowerShell персонализирани класове , създаден с class ключова дума:Тоест, ако стойностите на свойството на входния обект не са екземпляр на добре познати типове (последният включва типове само с една стойност, включително примитивни типове .NET, като [int] , за разлика от типовете, съставени от множество свойства), те се заменят със своя .ToString() представяния (например, тип System.IO.DirectoryInfo има .Parent свойство, което е друг System.IO.DirectoryInfo екземпляр, което означава, че .Parent стойността на свойството се сериализира като .ToString() представяне на този екземпляр, което е неговият пълен низ от пътя); накратко:Неперсонализираните (скаларни) обекти се сериализират така, че стойностите на свойства, които сами по себе си не са екземпляри на добре познати типове, се заменят от техния .ToString() представителство ; вижте този отговор за конкретен пример.
За разлика от това, изрично използване на CLI XML сериализация чрез Export-Clixml по подразбиране на дълбочина от 2 (можете да посочите персонализирана дълбочина чрез -Depth и можете по подобен начин да контролирате дълбочината, ако използвате основния System.Management.Automation.PSSerializer въведете директно ).

В зависимост от оригиналния тип, можете да можете да реконструирате екземпляри от оригиналния тип ръчно , но това не е гарантирано. (Можете да получите пълното име на оригиналния тип, като извикате .pstypenames[0] -replace '^Deserialized\.' върху даден персонализиран обект.)

В зависимост от вашите нужди от обработка обаче, емулациите от оригиналните обекти може да е достатъчно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създайте изчислена колона в SQL Server с помощта на T-SQL

  2. Компресиране на специфичен дял в таблица в SQL Server (T-SQL)

  3. Как да активирате улавянето на промяна на данни (CDC) на цяла таблица ИЛИ да активирате CDC върху таблица със списък с колони в SQL Server

  4. Възстановяване на достъпа до екземпляра на SQL Server без рестартиране

  5. Как да активирате всички ограничения за проверка в базата данни на SQL Server - SQL Server / TSQL урок, част 88