Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Nieoczekiwany typ zmiennej zwrócony przez Receive-Job

  1. Czy istnieje sposób na uzyskanie prawidłowego/oczekiwanego typu zmiennej do zwrócenia podczas wywoływania Receive-Job ?

Korzystanie z pracy w tle powoduje utratę wierności tekstu :obiekty, które otrzymujesz, są emulacjami bez metody oryginalnych typów.

Ręczne odtwarzanie oryginalnych typów nie jest warte wysiłku i może nawet nie być możliwe - chociaż może wystarczy praca z emulacjami.

Aktualizuj :Zgodnie z własną odpowiedzią, przełączenie z pracy z System.DataSet do System.DataTable zaowocowało użytecznymi emulacjami dla Ciebie.

Zobacz dolną sekcję, aby uzyskać więcej informacji.

  1. Czy istnieje lepszy sposób na uruchamianie zapytań SQL na innym koncie AD za pomocą polecenia Invoke-Sqlcmd?

Potrzebujesz w toku metoda wywołania w celu zachowania wierności typów , ale nie sądzę, że jest to możliwe za pomocą dowolnych poleceń, jeśli chcesz podszywać się pod innego użytkownika .

Na przykład alternatywa w toku (oparta na wątkach) dla Start-Job - Start-ThreadJob - nie ma -Credential parametr.

Dlatego najlepiej jest spróbować wykonać Invoke-SqlCmd -Credential parametr działa dla Ciebie lub znajdź inny sposób uruchamiania zapytań w procesie z danymi uwierzytelniającymi danego użytkownika.

Serializacja i deserializacja obiektów w zadaniach w tle / zdalnych / mini-powłokach:

Zawsze, gdy PowerShell organizuje obiekty poza granicami procesu , wykorzystuje serializację opartą na XML-u u źródła i deserializacja w miejscu docelowym , używając formatu znanego jako CLI XML (Wspólna infrastruktura językowa XML).

Dzieje się tak w kontekście remotingu PowerShell (np. Invoke-Command wywołania z
-ComputerName parametr) oraz w pracach w tle (Start-Job ) i tak zwane mini-powłoki (które są niejawnie używane, gdy wywołujesz PowerShell CLI z wnętrza samego PowerShell z blokiem skryptu; np. powershell.exe { Get-Item / } ).

Ta deserializacja zachowuje wierność typów tylko dla ograniczonego zestawu znanych typów , jak określono w MS-PSRP, Specyfikacja protokołu komunikacji zdalnej programu PowerShell. Oznacza to, że tylko instancje ustalonego zestawu typów są deserializowane jako ich pierwotny typ .

Instancje wszystkich innych typów są emulowane :typy podobne do listy stają się [System.Collections.ArrayList] instancje, typy słowników stają się [hasthable] instancje i inne typy stają się bezmetodowymi (tylko właściwości) obiektami niestandardowymi ([pscustomobject] instancje) , którego .pstypenames właściwość zawiera oryginalną nazwę typu poprzedzoną przedrostkiem Deserialized. (np. Deserialized.System.Data.DataTable ), a także nazwy podstawy . z takimi samymi prefiksami typy (hierarchia dziedziczenia).

Dodatkowo głębokość rekurencji dla wykresów obiektowych nie -[pscustomobject] wystąpienia jest ograniczone do 1 poziom - zauważ, że obejmuje to wystąpienie niestandardowych klas PowerShell , utworzony z class słowo kluczowe:oznacza to, że wartości właściwości obiektu wejściowego nie są wystąpieniami dobrze znanych typów (te ostatnie obejmują typy tylko z jedną wartością, w tym typy podstawowe .NET, takie jak [int] , w przeciwieństwie do typów składających się z wielu właściwości), są one zastępowane przez ich .ToString() reprezentacje (np. wpisz System.IO.DirectoryInfo ma .Parent właściwość, która jest kolejnym System.IO.DirectoryInfo instancji, co oznacza, że ​​.Parent wartość właściwości serializuje się jako .ToString() reprezentacja tej instancji, która jest ciągiem pełnej ścieżki); w skrócie:Niestandardowe (skalarne) obiekty są serializowane w taki sposób, że wartości właściwości, które same nie są wystąpieniami dobrze znanych typów, są zastępowane przez ich .ToString() reprezentacja ; zobacz tę odpowiedź jako konkretny przykład.
Z kolei wyraźne użycie serializacji CLI XML za pośrednictwem Export-Clixml domyślnie głębokość 2 (możesz określić niestandardową głębokość za pomocą -Depth i możesz podobnie kontrolować głębokość, jeśli używasz podstawowego System.Management.Automation.PSSerializer wpisz bezpośrednio ).

W zależności od oryginalnego typu, możesz być w stanie odtworzyć instancje oryginalnego typu ręcznie , ale nie jest to gwarantowane. (Pełną nazwę oryginalnego typu można uzyskać, wywołując .pstypenames[0] -replace '^Deserialized\.' na danym obiekcie niestandardowym).

Jednak w zależności od potrzeb przetwarzania, emulacje oryginalnych obiektów może wystarczyć.



  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 SHOWPLAN_TEXT

  2. Jak korzystać z szablonów w SQL Server Management Studio (SSMS) — samouczek SQL Server / TSQL część 16

  3. Brakujący indeks serwera SQL

  4. Formatowanie SQL w SQL Server Management Studio

  5. Pozycje ORDER BY muszą pojawić się na liście wyboru, jeśli określono opcję SELECT DISTINCT