Sau nhiều tìm kiếm và kết hợp các kỹ thuật rất tuyệt vời để chuyển đổi tập hợp kết quả bằng cách sử dụng lệnh FOR XML và .nodes() trên web, tôi có thể tạo truy vấn đơn này (không phải là một thủ tục được lưu trữ) mà thực hiện một công việc hợp lý để chuyển đổi bất kỳ truy vấn SQL tùy ý nào thành một mảng JSON.Cải thiện truy vấn SQL Server để chuyển đổi bảng tùy ý thành JSON
Truy vấn sẽ mã hóa từng hàng dữ liệu dưới dạng một đối tượng JSON đơn lẻ có dấu phẩy hàng đầu. Các hàng dữ liệu được bao bọc bởi các dấu ngoặc và toàn bộ tập kết quả sau đó được mong đợi sẽ được xuất ra một tệp.
Tôi muốn xem liệu có ai có thể xem cách cải thiện hiệu suất của nó không?
Dưới đây là các truy vấn với một bảng mẫu:
declare @xd table (col1 varchar(max), col2 int, col3 real, colNull int)
insert into @xd
select '', null, null, null
UNION ALL select 'ItemA', 123, 123.123, null
UNION ALL select 'ItemB', 456, 456.456, null
UNION ALL select '7890', 789, 789.789, null
select '[{}'
UNION ALL
select ',{' + STUFF((
(select ','
+ '"' + r.value('local-name(.)', 'varchar(max)') + '":'
+ case when r.value('./@xsi:nil', 'varchar(max)') = 'true' then 'null'
when isnumeric(r.value('.', 'varchar(max)')) = 1
then r.value('.', 'varchar(max)')
else '"' + r.value('.', 'varchar(max)') + '"'
end
from rows.nodes('/row/*') as x(r) for xml path(''))
), 1, 1, '') + '}'
from (
-- Arbitrary query goes here, (fields go where t.* is, table where @xd t is)
select (select t.* for xml raw,type,elements XSINIL) rows
from @xd t
) xd
UNION ALL
select ']'
phê bình lớn nhất của tôi của nó, là nó điên cuồng chậm.
Hiện tại mất khoảng 3:30 cho ~ 42.000 hàng.
Phê phán lớn khác của tôi là hiện tại giả định rằng mọi thứ trông giống như một số là một số. Nó không cố gắng để khám phá loại cột trong ít nhất (và tôi thậm chí không chắc chắn nếu nó có thể).
Một phê bình nhỏ cuối cùng là hàng dữ liệu đầu tiên sẽ có dấu phẩy ở phía trước và về mặt kỹ thuật nó không nên. Để bù lại, nó yêu cầu đối tượng JSON trống trong hàng đầu tiên bắt đầu mảng JSON.
Các phê bình khác (tốt nhất là với các giải pháp) được mời, giới hạn thực sự duy nhất tôi có là giải pháp có thể lặp lại một cách rõ ràng trên nhiều truy vấn SQL tùy ý mà không cần phải xác định rõ tên cột.
Tôi đang sử dụng SQL Server 2012.
Cảm ơn và để bất cứ ai khác như tôi những người đang tìm kiếm một kết quả SQL tổng quát -> JSON Mảng chuyển đổi, ENJOY!
Trong khi tôi hoan nghênh bạn SQL-fu, tôi phải tự hỏi: tại sao? Kịch bản trong thế giới thực là nơi bạn cần làm điều này? Tôi không cố gắng để tiêu cực ở đây, chỉ lúng túng là tại sao bạn cần điều này. –
Trong trường hợp này, tôi đang tìm một cách đặc biệt để tải nhanh các bộ kết quả vào cơ sở dữ liệu NoSQL như CouchDB mà không cần phải xây dựng nhiều cơ sở hạ tầng hoặc thêm bất cứ thứ gì vào môi trường SQL sản xuất của tôi. Mongo, Couch, et al. dường như sử dụng JSON làm ngôn ngữ lingua của họ để vận chuyển dữ liệu. Khi ở trong NoSQL DB, chúng ta có thể thử nghiệm với việc cắt và dicing các bộ dữ liệu để xem chúng hoạt động như thế nào. Việc sao chép cơ sở dữ liệu CouchDB để tạo ra các kho lưu trữ cục bộ trên máy tính để bàn từ xa, máy tính xách tay, điện thoại thông minh, vv là cách dễ dàng hơn việc quản lý cơ sở hạ tầng nhân rộng SQL. Vì vậy, chúng tôi đang làm một số sự tích cực. –
Và đừng quá ngu ngốc ở đây, hầu hết điều đó được tìm thấy bằng cách tìm kiếm câu lệnh SQL hiện có thành JSON và SQL tới các câu trả lời của cặp khóa/giá trị.Có, tôi đã đặt nó lại với nhau, đặt một số dấu ngoặc xung quanh nó qua UNION ALL, sử dụng câu lệnh case để xử lý các dấu ngoặc kép thông minh hơn, và bắt đầu thử với điều XSINIL (và có lẽ tôi đã học được một số điều này thực sự hoạt động như thế nào;)) nhưng tôi thực sự không thể lấy tín dụng cho việc này. Về điều duy nhất tôi đã làm mới được kết hợp các truy vấn phụ ở phía dưới để trả về mỗi hàng như một tập dữ liệu XML đầu tiên trước khi có truy vấn trên biến nó thành các cặp khóa/giá trị. –