Tôi đã có một kịch bản IronPython thực hiện một loạt các câu lệnh SQL đối với cơ sở dữ liệu SQL Server. các câu lệnh là các chuỗi lớn thực sự chứa nhiều câu lệnh, được phân cách bằng từ khóa "GO". Điều đó hoạt động khi chúng được chạy từ studio quản lý sql và một số công cụ khác, nhưng không chạy trong ADO. Vì vậy, tôi chia ra các chuỗi bằng cách sử dụng 2,5 "lại" mô-đun như vậy:regex để phân tích cú pháp câu lệnh SQL
splitter = re.compile(r'\bGO\b', re.IGNORECASE)
for script in splitter.split(scriptBlob):
if(script):
[... execute the query ...]
này phá vỡ trong trường hợp hiếm hoi mà có từ "đi" trong một chú thích hoặc một chuỗi. Làm thế nào trong heck tôi sẽ làm việc xung quanh đó? tức là phân tích một cách chính xác chuỗi này thành hai kịch bản:
-- this is a great database script! go team go!
INSERT INTO myTable(stringColumn) VALUES ('go away!')
/*
here are some comments that go with this script.
*/
GO
INSERT INTO myTable(stringColumn) VALUES ('this is the next script')
EDIT:
tôi đã tìm kiếm và tìm thấy tài liệu SQL này: http://msdn.microsoft.com/en-us/library/ms188037(SQL.90).aspx
Khi nó quay ra, GO phải trên dòng riêng của nó như một số câu trả lời được đề xuất. Tuy nhiên nó có thể được theo sau bởi một số nguyên "count" mà thực sự sẽ thực thi lô lệnh mà nhiều lần (có ai thực sự sử dụng trước đó ??) và nó có thể được theo sau bởi một dòng chú thích trên cùng một dòng (nhưng không phải là một nhiều đường, tôi đã kiểm tra này) vì vậy, các regex kỳ diệu sẽ giống như thế:.
"(?m)^\s*GO\s*\d*\s*$"
Trừ này không tính đến:
- một lời nhận xét đơn dòng có thể (
"--"
tiếp theo bất kỳ ký tự ngoại trừ ngắt dòng) ở cuối. - toàn bộ dòng nằm bên trong nhận xét nhiều dòng lớn hơn.
Tôi không quan tâm đến việc nắm bắt đối số "đếm" và sử dụng đối số. Bây giờ tôi có một số tài liệu hướng dẫn kỹ thuật, tôi gần như đang viết bài này "để làm rõ" và không bao giờ phải lo lắng về nó nữa.
tôi upmodded câu trả lời của mọi người, cảm ơn vì sự giúp đỡ! Tôi đã đưa ra câu trả lời cho mcassano vì anh ấy là người đầu tiên đề xuất rằng GO luôn có thể nằm trên một dòng riêng, dẫn tôi tìm kiếm tài liệu cho lệnh đó và cuối cùng dẫn đến một giải pháp dễ dàng hơn nhiều. –