Thật không may, đây là một phương pháp nối chuỗi không đáng tin cậy trong SQL Server. Tôi sẽ tránh nó trong tất cả, trừ những trường hợp nhỏ nhặt nhất. Có một số thông tin khác trong KB này: Kế hoạch Thực thi và Kết quả của Truy vấn Kết hợp Tổng hợp Phụ thuộc vào Khi Vị trí biểu thức .
Điều đó nói rằng, tôi có thể vừa sao chép vấn đề của bạn vừa đưa ra giải pháp khắc phục trong môi trường của tôi:
SET @val = ''
SELECT @val = @val + 'Hello, my name is ' + replace([name], '', '') + '!' + CHAR(10) + CHAR(13)
FROM LINKED.A.sys.tables
Lưu ý rằng tôi đã thêm một hàm thay thế rỗng vào biểu thức. Mặc dù nó không phải làm gì với đầu ra, nó sẽ thêm một cục bộ bước "tính toán vô hướng" cho kế hoạch truy vấn. Điều này dường như kéo lại tất cả dữ liệu từ cột tên để sau đó được xử lý cục bộ thay vì chỉ để truy vấn từ xa trả về những gì nó cho là cần thiết.
Tôi không chắc liệu có chức năng nào tốt hơn để sử dụng ngoài đảo ngược
kép hoặc một cái gì đó. Chỉ cần đảm bảo truyền tới một kiểu dữ liệu tối đa nếu cần thiết như tài liệu đã nêu.
CẬP NHẬT
Chỉ cần khai báo @var
dưới dạng varchar (max)
chứ không phải là nvarchar (max)
giải quyết vấn đề, vì nó sau đó trả lại toàn bộ cột tên (gõ sysname - hoặc nvarchar (128) - Tôi tin rằng) để xử lý cục bộ giống như hàm thay thế đã làm. Tôi không thể giả vờ biết sự kết hợp nào của cài đặt máy chủ được liên kết
và ép kiểu ngầm gây ra điều này. Hy vọng rằng ai đó có nhiều kiến thức hơn trong lĩnh vực này có thể tham gia!