sql >> Database teknologi >  >> RDS >> Sqlserver

Uventet variabeltype returneret af Receive-Job

  1. Er der en måde at få den korrekte/forventede variabeltype til at blive returneret, når du kalder Receive-Job ?

På grund af at bruge et baggrundsjob, mister du typetroskab :De objekter, du får tilbage, er emuleringer uden metode af de originale typer.

Manuel genskabelse af de originale typer er ikke besværet værd og er måske ikke engang muligt - selvom det måske er nok at arbejde med emuleringerne.

Opdater :Ifølge dit eget svar, skifte fra at arbejde med System.DataSet til System.DataTable resulteret i brugbare emuleringer for dig.

Se det nederste afsnit for mere information.

  1. Er der en bedre måde at køre SQL-forespørgsler under en anden AD-konto ved at bruge kommandoen Invoke-Sqlcmd?

Du har brug for en igangværende invokationsmetode for at bevare typetroskab , men jeg tror ikke, det er muligt med vilkårlige kommandoer, hvis du vil efterligne en anden bruger .

For eksempel det igangværende (trådbaserede) alternativ til Start-Job - Start-ThreadJob - har ikke en -Credential parameter.

Dit bedste bud er derfor at prøve at lave Invoke-SqlCmd s -Credential parameter arbejde for dig, eller find en anden måde at køre dine forespørgsler under processen med en given brugers legitimationsoplysninger.

Serialisering og deserialisering af objekter i baggrundsjob/remoting/mini-skaller:

Hver gang PowerShell fører objekter på tværs af procesgrænser , den anvender XML-baseret serialisering ved kilden og deserialisering på destinationen , ved hjælp af et format kendt som CLI XML (Common Language Infrastructure XML).

Dette sker i forbindelse med PowerShell-fjernbetjening (f.eks. Invoke-Command opkald med
-ComputerName parameter) samt i baggrundsjob (Start-Job ) og såkaldte mini-skaller (som implicit bruges, når du kalder PowerShell CLI inde fra PowerShell selv med en scriptblok; f.eks. powershell.exe { Get-Item / } ).

Denne deserialisering bevarer typetroskab kun for et begrænset sæt kendte typer , som specificeret i MS-PSRP, PowerShell Remoting Protocol Specification. Det vil sige, kun forekomster af et fast sæt typer er deserialiseret som deres oprindelige type .

Forekomster af alle andre typer emuleres :listelignende typer bliver [System.Collections.ArrayList] forekomster bliver ordbogstyper [hasthable] instanser og andre typer bliver metodeløse (kun egenskaber) tilpassede objekter ([pscustomobject] forekomster) , hvis .pstypenames egenskaben indeholder det originale typenavn med præfikset Deserialized. (f.eks. Deserialized.System.Data.DataTable ), samt de lige præfiksede navne på typens base typer (arvehierarki).

Derudover rekursionsdybden for objektgrafer af ikke -[pscustomobject] forekomster er begrænset til 1 niveau - Bemærk, at dette inkluderer forekomster af PowerShell brugerdefinerede klasser , oprettet med class nøgleord:Det vil sige, hvis et inputobjekts egenskabsværdier ikke er forekomster af velkendte typer i sig selv (sidstnævnte inkluderer typer med en enkelt værdi, inklusive primitive .NET-typer såsom [int] , i modsætning til typer sammensat af flere egenskaber), erstattes de af deres .ToString() repræsentationer (skriv f.eks. System.IO.DirectoryInfo har en .Parent egenskab, der er en anden System.IO.DirectoryInfo instans, hvilket betyder, at .Parent egenskabsværdien serialiseres som .ToString() repræsentation af den instans, som er dens fulde stistreng); kort sagt:Ikke-tilpassede (skalære) objekter serialiseres således, at egenskabsværdier, der ikke selv er forekomster af velkendte typer, erstattes af deres .ToString() repræsentation ; se dette svar for et konkret eksempel.
Derimod eksplicit brug af CLI XML-serialisering via Export-Clixml standard til en dybde på 2 (du kan angive en brugerdefineret dybde via -Depth og du kan på samme måde kontrollere dybden, hvis du bruger den underliggende System.Management.Automation.PSSerializer skriv direkte ).

Afhængigt af den originale type kan være i stand til at rekonstruere forekomster af den oprindelige type manuelt , men det er ikke garanteret.(Du kan få den originale types fulde navn ved at kalde .pstypenames[0] -replace '^Deserialized\.' på et givet brugerdefineret objekt.)

Afhængigt af dine behandlingsbehov, dog emuleringerne af de originale objekter kan være tilstrækkelige.



  1. Sådan VÆLGES * men uden Kolonnenavne skal være unikke i hver visning

  2. Sådan ændres prioritet for samtidig program

  3. Hvad kan forårsage intermitterende ORA-12519 (TNS:ingen passende handler fundet) fejl

  4. Hvad er STATISTIK TID i SQL Server?