sql >> Database >  >> RDS >> Sqlserver

Onverwacht type variabele geretourneerd door Receive-Job

  1. Is er een manier om ervoor te zorgen dat het juiste/verwachte type variabele wordt geretourneerd bij het aanroepen van Receive-Job ?

Door het gebruik van een achtergrondtaak, verlies je typetrouw :de objecten die je terugkrijgt zijn methodeloze emulaties van de originele typen.

Het handmatig opnieuw maken van de originele typen is de moeite niet waard en is misschien niet eens mogelijk - hoewel misschien is werken met de emulaties voldoende.

Bijwerken :Volgens uw eigen antwoord, overschakelen van werken met System.DataSet naar System.DataTable resulteerde in bruikbare emulaties voor u.

Zie het onderste gedeelte voor meer informatie.

  1. Is er een betere manier om SQL-query's uit te voeren onder een ander AD-account, met de opdracht Invoke-Sqlcmd?

Je hebt een in behandeling . nodig aanroepmethode om typegetrouwheid te behouden , maar ik denk niet dat dat mogelijk is met willekeurige commando's als je je wilt je voordoen als een andere gebruiker .

Bijvoorbeeld het in-proces (thread-based) alternatief voor Start-Job - Start-ThreadJob - heeft geen -Credential parameter.

Je kunt daarom het beste proberen om Invoke-SqlCmd . te maken 's -Credential parameter voor u werken of een andere manier vinden om uw zoekopdrachten uit te voeren met de inloggegevens van een bepaalde gebruiker.

Serialisatie en deserialisatie van objecten in achtergrondtaken / remoting / mini-shells:

Telkens wanneer PowerShell objecten over procesgrenzen heen rangschikt , het maakt gebruik van XML-gebaseerde serialisatie bij de bron, en deserialisatie op de bestemming , met een indeling die bekend staat als CLI XML (Common Language Infrastructure XML).

Dit gebeurt in de context van PowerShell remoting (bijv. Invoke-Command oproepen met de
-ComputerName parameter) en in achtergrondtaken (Start-Job ) en zogenaamde mini-shells (die impliciet worden gebruikt wanneer u de PowerShell CLI vanuit PowerShell zelf aanroept met een scriptblok; bijv. powershell.exe { Get-Item / } ).

Deze deserialisatie handhaaft type-getrouwheid alleen voor een beperkt aantal bekende typen , zoals gespecificeerd in MS-PSRP, de PowerShell Remoting Protocol-specificatie. Dat wil zeggen dat alleen instanties van een vaste reeks typen worden gedeserialiseerd als hun oorspronkelijke type .

Instances van alle andere typen worden geëmuleerd :lijstachtige typen worden [System.Collections.ArrayList] instanties worden woordenboektypen [hasthable] instanties en andere typen worden methodeloos (alleen eigenschappen) aangepaste objecten ([pscustomobject] instanties) , wiens .pstypenames eigenschap bevat de oorspronkelijke typenaam voorafgegaan door Deserialized. (bijv. Deserialized.System.Data.DataTable ), evenals de gelijkluidende namen van de basis . van het type typen (erfenishiërarchie).

Bovendien is de recursiediepte voor objectgrafieken van niet -[pscustomobject] instanties is beperkt tot 1 niveau - merk op dat dit een instantie van PowerShell-aangepaste klassen omvat , gemaakt met de class trefwoord:dat wil zeggen, als de eigenschapswaarden van een invoerobject zelf geen instantie zijn van bekende typen (de laatste omvat typen met alleen een enkele waarde, inclusief primitieve .NET-typen zoals [int] , in tegenstelling tot typen die uit meerdere eigenschappen bestaan), worden ze vervangen door hun .ToString() representaties (bijv. typ System.IO.DirectoryInfo heeft een .Parent eigenschap die een andere System.IO.DirectoryInfo is instantie, wat betekent dat de .Parent eigenschapswaarde serialiseert als de .ToString() representatie van die instantie, die de volledige padtekenreeks is); in het kort:Niet-aangepaste (scalaire) objecten serialiseren zodanig dat eigenschapswaarden die zelf geen instanties van bekende typen zijn, vervangen worden door hun .ToString() vertegenwoordiging ; zie dit antwoord voor een concreet voorbeeld.
Daarentegen expliciet gebruik van CLI XML-serialisatie via Export-Clixml standaard ingesteld op een diepte van 2 (u kunt een aangepaste diepte opgeven via -Depth en u kunt op dezelfde manier de diepte bepalen als u de onderliggende System.Management.Automation.PSSerializer gebruikt typ direct ).

Afhankelijk van het type origineel, kunt u mogelijk in staat zijn om instanties van het originele type handmatig te reconstrueren , maar dat is niet gegarandeerd. (Je kunt de volledige naam van het originele type krijgen door .pstypenames[0] -replace '^Deserialized\.' aan te roepen op een bepaald aangepast object.)

Afhankelijk van uw verwerkingsbehoeften kunnen de emulaties van de originele objecten kan voldoende zijn.



  1. Rails Console vindt gebruikers op reeks id's

  2. SUBSTRING Commando in SQL:A Primer

  3. Een dag aftrekken van een datum in MariaDB

  4. MariaDB-tekenreeksen voor datumnotatie