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

Mengapa saya mendapatkan hasil yang berbeda ini dari dua kueri SQL?

Sayangnya, ini adalah metode penggabungan string yang tidak dapat diandalkan di SQL Server. Saya akan menghindarinya dalam semua kasus kecuali yang paling sepele. Ada beberapa informasi lebih lanjut dalam KB ini:Rencana Eksekusi dan Hasil Kueri Penggabungan Agregat Tergantung Pada Lokasi Ekspresi .

Karena itu, saya dapat menggandakan masalah Anda dan memberikan solusi di lingkungan saya:

SET @val = ''
SELECT @val = @val + 'Hello, my name is ' + replace([name], '', '') + '!' + CHAR(10) + CHAR(13)
FROM LINKED.A.sys.tables

Perhatikan bahwa saya telah menambahkan fungsi ganti kosong ke ekspresi. Meskipun seharusnya tidak melakukan apa pun pada output, ia menambahkan lokal langkah "hitung skalar" ke rencana kueri. Ini tampaknya menarik kembali semua data dari kolom nama untuk kemudian diproses secara lokal daripada hanya membiarkan kueri jarak jauh mengembalikan apa yang dianggap perlu.

Saya tidak yakin apakah ada fungsi yang lebih baik untuk digunakan selain replace dengan argumen kosong. Mungkin reverse double ganda atau sesuatu. Pastikan untuk mentransmisikan ke tipe data maksimal jika perlu seperti yang dinyatakan dalam dokumentasi.

PERBARUI

Cukup mendeklarasikan @var sebagai varchar(max) daripada nvarchar(max) menyelesaikan masalah, karena kemudian mengembalikan seluruh kolom nama (ketik sysname -- atau nvarchar(128) -- saya percaya) untuk pemrosesan lokal seperti yang dilakukan oleh fungsi replace. Saya tidak dapat berpura-pura mengetahui kombinasi setelan server tertaut yang mana dan casting implisit menyebabkan ini muncul. Semoga seseorang yang memiliki lebih banyak pengetahuan di bidang ini dapat bergabung!




  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 - Buat salinan tabel database dan letakkan di database yang sama?

  2. Masukkan secara manual ke dalam tabel dengan pernyataan SQL, tetapi kuncinya bertambah secara otomatis

  3. Bagaimana cara mendekripsi kata sandi dari SQL server?

  4. Representasi berbeda dari UUID di Java Hibernate dan SQL Server

  5. Putaran .NET DateTime milidetik, sehingga dapat memuat milidetik SQL Server