2013-08-26 35 views
6

Tôi có một bảng lưu trữ truy vấn T SQL được tạo động trong một cột của bảng. Yêu cầu của tôi là tôi cần thực hiện truy vấn được tạo (trong trường hợp của tôi, một số câu lệnh chèn) và tôi 'không muốn sử dụng vòng lặp while' để duyệt toàn bộ các hàng và sau đó thực hiện các câu lệnh từ một biến. Ngoài ra Tôi không muốn sử dụng con trỏ. Bảng này có khoảng 5 triệu câu lệnh chèn SQL được tạo động. Trước đó tôi đã thử điều này bằng cách sử dụng một vòng lặp while nhưng nó đã mất nhiều ngày để hoàn thành, và vì vậy tôi đã bỏ nó.Thực thi câu lệnh SQL động được lưu trữ trong một cột của một bảng

+1

Việc thực hiện 5 triệu câu lệnh 'INSERT' sẽ mất một chút thời gian. Một phương pháp dựa trên tập hợp là không thể? –

+1

Bạn có thiết kế mô hình dữ liệu khủng khiếp và giải pháp được thiết kế kỹ hơn cho một vấn đề. – SQLMason

+0

Hiển thị cho chúng tôi một số ví dụ về dữ liệu này. Đây là một thiết kế rất tồi, và rất khó để giải quyết theo cách hoạt động tốt. Hy vọng tốt nhất của bạn là hầu hết các dữ liệu này có thể được giảm xuống một cái gì đó quan hệ hơn. – RBarryYoung

Trả lời

4

phải bất lực nhìn lên những gì `lakh' là :)

Như ý kiến ​​khác đề cập đây không phải là phương pháp tối ưu nhất để DML, hãy xem xét việc sắp xếp. Vì bạn có thể kết hợp SQL động theo lô, ví dụ:

DECLARE @sSQL nvarchar(max) 
SET @sSQL = 'BEGIN TRAN; ' 

SELECT @sSQL = @sSQL + COLUMN_WITH_INSERT_STATEMENT + '; ' 
FROM TABLE 
WHERE [limit number of rows] 

SET @sSQL = @sSQL + 'COMMIT TRAN ' 

EXEC(@sSQL) 

Bằng cách này bạn có thể kết hợp số câu lệnh INSERT được kiểm soát thành một giao dịch. Bạn có thể kiểm soát số lần chèn bằng phương thức câu lệnh WHERE (ví dụ: WHERE ID BETWEEN 1 and 100 để thực thi 100 lần INSERT cùng một lúc) Bạn có thể lặp lại điều kiện này (có vòng lặp, nhưng nó sẽ không được lặp qua các hàng riêng lẻ, nhưng thông qua các điều kiện thay thế eg1 - 100, 101 - 200, 201 - 300 vv).

+0

Cảm ơn bạn đã trả lời. Tôi đã thử phương pháp này. Vấn đề chính xảy ra với tôi là sự mâu thuẫn trong giới hạn của varchar (max) khi tôi đã thử nghiệm nó trên các máy khác nhau. Có lẽ, một cái gì đó để làm với mã hóa ký tự. – Dibin

+0

Nvarchar (tối đa) giới hạn id 2Gb, về mặt kỹ thuật là đủ. Làm thế nào có thể báo cáo là bạn cố gắng để chạy cùng một lúc? –

+0

Bạn có thể ghép nối trong exec của bạn để vượt quá tối đa. 'exec (@sSQL + @ sSQL1 + @ sSQL2)' – SQLMason

Các vấn đề liên quan