sql >> Databasteknik >  >> RDS >> Sqlserver

Oväntad variabeltyp som returneras av Receive-Job

  1. Finns det något sätt att få den korrekta/förväntade variabeltypen att returneras när du anropar Receive-Job ?

På grund av att du använder ett bakgrundsjobb förlorar du typtrohet :objekten du får tillbaka är emuleringar utan metod av originaltyperna.

Att manuellt återskapa originaltyperna är inte värt ansträngningen och kanske inte ens är möjligt - även om det kanske räcker med att arbeta med emuleringarna.

Uppdatera :Enligt ditt eget svar, byter du från att arbeta med System.DataSet till System.DataTable resulterade i användbara emuleringar för dig.

Se det nedre avsnittet för mer information.

  1. Finns det ett bättre sätt att köra SQL-frågor under ett annat AD-konto, med kommandot Invoke-Sqlcmd?

Du behöver en pågående anropsmetod för att bibehålla typtrohet , men jag tror inte att det är möjligt med godtyckliga kommandon om du vill imitera en annan användare .

Till exempel, det pågående (trådbaserade) alternativet till Start-Job - Start-ThreadJob - har inte en -Credential parameter.

Det bästa är därför att försöka skapa Invoke-SqlCmd s -Credential parametern fungerar för dig eller hitta ett annat sätt under processen att köra dina frågor med en given användares autentiseringsuppgifter.

Serialisering och deserialisering av objekt i bakgrundsjobb/remoting/mini-skal:

När PowerShell flyttar objekt över processgränser , använder den XML-baserad serialisering vid källan och deserialisering vid destinationen , med ett format som kallas CLI XML (Common Language Infrastructure XML).

Detta händer i samband med PowerShell-fjärrkontroll (t.ex. Invoke-Command samtal med
-ComputerName parameter) samt i bakgrundsjobb (Start-Job ) och så kallade miniskal (som implicit används när du anropar PowerShell CLI från PowerShell själv med ett skriptblock; t.ex. powershell.exe { Get-Item / } ).

Denna deserialisering bibehåller typtrohet endast för en begränsad uppsättning kända typer , som specificerats i MS-PSRP, PowerShell Remoting Protocol Specification. Det vill säga, endast instanser av en fast uppsättning typer deserialiseras som sin ursprungliga typ .

Förekomster av alla andra typer emuleras :listliknande typer blir [System.Collections.ArrayList] instanser blir ordbokstyper [hasthable] instanser och andra typer blir metodlösa (endast egenskaper) anpassade objekt ([pscustomobject] instanser) , vars .pstypenames egenskapen innehåller det ursprungliga typnamnet med prefixet Deserialized. (t.ex. Deserialized.System.Data.DataTable ), såväl som de lika prefixerade namnen på typens bas typer (arvshierarki).

Dessutom är rekursionsdjupet för objektgrafer av icke -[pscustomobject] instanser är begränsade till 1 nivå - Observera att detta inkluderar instanser av PowerShell anpassade klasser , skapad med class nyckelord:Det vill säga, om ett indataobjekts egenskapsvärden inte är instanser av välkända typer i sig (den senare inkluderar enbart typer av ett värde, inklusive primitiva .NET-typer som [int] , till skillnad från typer som består av flera egenskaper), ersätts de av deras .ToString() representationer (t.ex. skriv System.IO.DirectoryInfo har en .Parent egenskap som är en annan System.IO.DirectoryInfo instans, vilket betyder att .Parent egenskapsvärdet serialiseras som .ToString() representation av den instansen, som är dess fullständiga sökvägssträng); kort sagt:Icke-anpassade (skalära) objekt serialiseras så att egenskapsvärden som inte själva är instanser av välkända typer ersätts med deras .ToString() representation ; se det här svaret för ett konkret exempel.
Däremot explicit användning av CLI XML-serialisering via Export-Clixml förinställer ett djup på 2 (du kan ange ett anpassat djup via -Depth och du kan på samma sätt styra djupet om du använder den underliggande System.Management.Automation.PSSerializer skriv direkt ).

Beroende på originaltypen kan du kunna rekonstruera instanser av den ursprungliga typen manuellt , men det är inte garanterat.(Du kan få originaltypens fullständiga namn genom att anropa .pstypenames[0] -replace '^Deserialized\.' på ett givet anpassat objekt.)

Beroende på dina bearbetningsbehov, dock emuleringarna av de ursprungliga objekten kan vara tillräckliga.



  1. Uppskatta datakomprimeringsbesparingar i SQL Server

  2. sql cross join - vilken användning har någon hittat för det?

  3. Kopiera data till ny tabell i MySQL

  4. SqlDateTime.MinValue !=DateTime.MinValue, varför?