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!