Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Jenis variabel tak terduga yang dikembalikan oleh Receive-Job

  1. Apakah ada cara untuk mengembalikan tipe variabel yang benar/diharapkan saat memanggil Receive-Job ?

Karena menggunakan pekerjaan latar belakang, Anda kehilangan ketepatan jenis :objek yang Anda dapatkan kembali adalah em>emulasi . tanpa metode dari jenis aslinya.

Membuat ulang tipe asli secara manual tidak sepadan dengan usaha dan bahkan mungkin tidak dapat dilakukan - meskipun mungkin bekerja dengan emulasi sudah cukup.

Perbarui :Sesuai jawaban Anda sendiri, beralih dari bekerja dengan System.DataSet ke System.DataTable menghasilkan emulasi yang dapat digunakan untuk Anda.

Lihat bagian bawah untuk informasi lebih lanjut.

  1. Apakah ada cara yang lebih baik untuk menjalankan kueri SQL di bawah akun AD yang berbeda, menggunakan perintah Invoke-Sqlcmd?

Anda memerlukan dalam proses metode pemanggilan untuk mempertahankan kesetiaan tipe , tapi menurut saya itu tidak mungkin dengan perintah arbitrer jika Anda ingin meniru pengguna lain .

Misalnya, alternatif dalam proses (berbasis utas) untuk Start-Job - Start-ThreadJob - tidak memiliki -Credential parameter.

Oleh karena itu, taruhan terbaik Anda adalah mencoba membuat Invoke-SqlCmd -Credential parameter berfungsi untuk Anda atau temukan cara lain dalam proses menjalankan kueri Anda dengan kredensial pengguna tertentu.

Serialization dan deserialisasi objek di pekerjaan latar belakang / remote / mini-shell:

Kapan pun PowerShell mengatur objek melintasi batas proses , ini menggunakan berbasis XML serialisasi di sumbernya, dan deserialisasi di tempat tujuan , menggunakan format yang dikenal sebagai CLI XML (XML Infrastruktur Bahasa Umum).

Ini terjadi dalam konteks remote PowerShell (mis., Invoke-Command panggilan dengan
-ComputerName parameter) serta di pekerjaan latar belakang (Start-Job ) dan apa yang disebut mini-shells (yang secara implisit digunakan saat Anda memanggil PowerShell CLI dari dalam PowerShell itu sendiri dengan blok skrip; misalnya, powershell.exe { Get-Item / } ).

Deserialization ini mempertahankan tipe fidelitas hanya untuk jenis terbatas yang diketahui , sebagaimana ditentukan dalam MS-PSRP, Spesifikasi Protokol Jarak Jauh PowerShell. Artinya, hanya instance dari kumpulan tipe tetap yang dideserialisasi sebagai tipe aslinya .

Instance dari semua jenis lainnya diemulasi :tipe seperti daftar menjadi [System.Collections.ArrayList] contoh, tipe kamus menjadi [hasthable] instance, dan jenis lainnya menjadi tanpa metode (khusus properti) objek khusus ([pscustomobject] contoh) , yang .pstypenames-nya properti berisi nama tipe asli yang diawali dengan Deserialized. (mis., Deserialized.System.Data.DataTable ), serta nama awalan yang sama dari basis . jenis jenis (hierarki pewarisan).

Selain itu, kedalaman rekursi untuk grafik objek non -[pscustomobject] instance terbatas pada 1 tingkat - perhatikan bahwa ini termasuk instance dari kelas kustom PowerShell , dibuat dengan class kata kunci:Yaitu, jika nilai properti objek input bukan turunan dari tipe terkenal itu sendiri (yang terakhir termasuk tipe nilai tunggal, termasuk tipe primitif .NET seperti [int] , sebagai lawan dari tipe yang terdiri dari beberapa properti), mereka diganti dengan .ToString() representasi (mis., ketik System.IO.DirectoryInfo memiliki .Parent properti yang merupakan System.IO.DirectoryInfo lain instance, yang berarti bahwa .Parent nilai properti bersambung sebagai .ToString() representasi dari instance itu, yang merupakan string path lengkapnya); singkatnya:Objek non-kustom (skalar) bersambung sedemikian rupa sehingga nilai properti yang bukan merupakan instance dari tipe terkenal diganti dengan .ToString() mereka perwakilan ; lihat jawaban ini untuk contoh nyata.
Sebaliknya, eksplisit penggunaan serialisasi XML CLI melalui Export-Clixml default ke kedalaman 2 (Anda dapat menentukan kedalaman khusus melalui -Depth dan Anda juga dapat mengontrol kedalaman jika menggunakan System.Management.Automation.PSSerializer yang mendasarinya ketik langsung ).

Tergantung pada jenis aslinya, Anda mungkin dapat merekonstruksi instance dari tipe aslinya secara manual , tapi itu tidak dijamin.(Anda bisa mendapatkan nama lengkap tipe asli dengan memanggil .pstypenames[0] -replace '^Deserialized\.' pada objek khusus yang diberikan.)

Namun, bergantung pada kebutuhan pemrosesan Anda, emulasi dari objek aslinya mungkin sudah cukup.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Periksa Apakah Tabel Memiliki Kunci Asing di SQL Server dengan OBJECTPROPERTY()

  2. Wawasan tentang Batasan Unik SQL Server

  3. PARSE() vs TRY_PARSE() di SQL Server:Apa Bedanya?

  4. Cara Menemukan Pengaturan ANSI_NULLS Database di SQL Server (T-SQL)

  5. Bergabung dengan beberapa tabel di SQL