2012-03-29 31 views
5

Tôi cần chuyển đổi dữ liệu từ bảng tính thành chèn câu lệnh trong SQL. Tôi đã làm việc ra hầu hết các biểu thức thông thường để sử dụng công cụ tìm và thay thế trong SSMS, nhưng tôi đang gặp phải vấn đề khi cố gắng tham chiếu đến mục thứ 9 được ngoặc trong lần thay thế cuối cùng của tôi.SQL tìm và thay thế giới hạn chụp biểu thức chính quy?

Đây là mẩu tin ban đầu:

Blue Doe 12/21/1967 1126 Queens Highway Torrance CA 90802 N 1/1/2012 

Và đây là những gì tôi cần (bây giờ):

select 'Blue','Doe','19671221','1126 Queens Highway','Torrance','CA','90802','N','20120101' 

Do hạn chế về số lượng các mục trong ngoặc đơn cho phép tôi phải chạy qua thay thế ba lần. Điều này có thể làm việc thành một thủ tục được lưu trữ nếu tôi có thể thực hiện đầu tiên làm công việc này như là một POC.

Đây là biểu hiện phù hợp đầu tiên:

^{:w:b:w:b}{:z}/{:z}/{:z:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b}{:z}/{:z}/{:z} 

Và thay thế: \10\2/0\3/\40\5/0\6/\7

này cho biết thêm số không vào những tháng và những ngày để họ có ít nhất hai nhân vật.

Kết quả khớp tiếp theo định dạng ngày theo định dạng được yêu cầu trong truy vấn (không có ý kiến ​​về việc không sử dụng trường ngày tháng. Đây là yêu cầu của khách hàng đối với cơ sở dữ liệu).

Matching biểu:

^{:w:b:w:b}[0-9]*{[0-9]^2}/[0-9]*{[0-9]^2}/{:z}{:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b}[0-9]*{[0-9]^2}/[0-9]*{[0-9]^2}/{:z} 

Và thay thế: \1\4\(2,2)\(2,3)\5\8\(2,6)\(2,7)

Cuối cùng, trận chung kết sẽ chèn kết quả vào các câu lệnh SQL mà sẽ được sử dụng trong một tuyên bố chèn.

Matching biểu:

^{:w}:b{:w}:b{:z}:b{[0-9A-Za-z:b]+}:b{:w}:b{[A-Z]+}:b{:z}:b{:w}:b{:z} 

Và thay thế: select '\1','\2','\3','\4','\5','\6','\7','\8','\9'

Tất cả các công trình ngoại trừ việc thay thế cuối cùng. Vì lý do nào đó, \ 9 KHÔNG nhận được dữ liệu từ trận đấu. Nếu tôi chỉ thay thế toàn bộ biểu thức thay thế bằng \ 9, tôi nhận được khoảng trống. Nếu tôi sử dụng \ 8, tôi nhận được N. Nếu tôi loại bỏ mục thứ 8 bị ngoặc, do đó làm cho mặt hàng thứ 9 của tôi thứ tám, nó trả về những gì tôi muốn, 20120101.

Vì vậy, câu hỏi của tôi là, SSMS/SQL cho phép được gắn thẻ 9 biểu thức khi sử dụng tìm/thay thế và biểu thức chính quy? Hay tôi đang thiếu thứ gì đó ở đây? Tôi biết có nhiều cách khác để làm điều này. Tôi chỉ cố gắng làm cho nó được thực hiện một cách nhanh chóng như là một POC trước khi chúng tôi di chuyển này vào một sproc hoặc ứng dụng.

Cảm ơn bạn đã hỗ trợ. -Peter

+0

Bạn có thể nhập trực tiếp từ bảng tính. Dữ liệu đã có trong các cột riêng biệt chưa? – RedFilter

+0

Tại sao bạn cần sử dụng thay thế? Nếu dữ liệu từ bảng tính và bạn đang sử dụng SSMS, tại sao không sử dụng trình quản lý nhập/xuất? Ngoài ra, tại sao định dạng lại dữ liệu, bảng tính không hỗ trợ định dạng ngày tháng/ngày/năm? Bạn không thể viết một số công thức ô để ghép một chuỗi chèn dữ liệu cho bạn? – Trisped

+0

Vui lòng chỉnh sửa câu hỏi của bạn để thêm định dạng đúng các biểu thức mã. Bạn có thể làm điều này bằng cách: xung quanh với dấu sau ("' "), chọn tất cả và nhấp vào nút thanh công cụ' {} 'hoặc bằng cách đánh dấu một khối mã và nhấn Ctrl + K. Bạn có thể xem trước bài đăng của mình (trước khi đăng bài) ngay bên dưới nút "Gửi câu hỏi" khi bạn đang nhập; bản cập nhật xem trước trong thời gian thực, vì vậy đây là chế độ xem WYSIWYG. Định dạng đúng làm cho câu hỏi của bạn dễ đọc và dễ hiểu hơn, và do đó giúp bạn có nhiều câu trả lời hơn. Cảm ơn. :) –

Trả lời

2

Không có biểu thức phù hợp nào của bạn hoạt động với bản ghi bạn đã cung cấp trong MS SQL Server Management Studio 2008r2 của tôi.

Từ mô tả của bạn, có vẻ như có sự cố với Biểu thức được gắn thẻ 9 vì kết quả mong muốn được trả lại khi sử dụng Biểu thức được gắn thẻ 8, nhưng không được 9. Bạn có thể muốn ask Microsoft or report it as a bug.

Giải pháp nhanh hơn là di chuyển văn bản bạn đang thực hiện Tìm/Thay thế trên SSMS thành bảng tính và sử dụng công thức ô để phân tích dữ liệu thành lệnh chèn. Nếu bạn có MS Excel, hàm CONCATENATE, FIND và MID có thể sẽ hữu ích. Ngoài ra, nó giúp chia các giá trị thành các cột riêng của chúng để bạn có thể định dạng ngày, sau đó sử dụng một giá trị nối để tạo chèn của bạn.

Vui lòng cho tôi biết nếu bạn cần một ví dụ.

Cập nhật: Tôi đã thử ví dụ của bạn trong MS SQL Server Management Studio 2008r2, Visual Studio 2005 và Visual Studio 2010 với cùng kết quả bạn nhận được, \ 9 trả về một chuỗi rỗng. Kiểm tra xung quanh tôi thấy rằng others are also having this issue (xem nội dung cộng đồng từ Henrique Evaristo) và toàn bộ hệ thống đã là replaced in the new editors.

Vì vậy, để trả lời câu hỏi của bạn, SSMS không hỗ trợ 9 biểu thức được gắn thẻ do lỗi.

Nếu bạn không thể sử dụng ý tưởng bảng tính, bạn có thể thử chia hành động thành hai phần, đặt 8 giá trị đầu tiên, sau đó quay lại để thực hiện thao tác cuối cùng. Ví dụ:

^{:w}:b{:w}:b{:z}:b{[0-9A-Za-z:b]+}:b{:w}:b{[A-Z]+}:b{:z}:b{:w}:b:z 
select '\1','\2','\3','\4','\5','\6','\7','\8','\0' 

:w:b:w:b:z:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b{:z} 
\1 
+0

Cảm ơn bạn đã trả lời. Tôi nghĩ lý do họ không làm việc cho bạn là một vấn đề với cách họ được dán vào SO. Tôi đã cập nhật văn bản gốc để phản ánh 'không gian số ít' giữa mỗi mục xuất hiện dưới dạng nhiều khi được dán từ SQL sang SO. –

+0

@Peter Anderson đã cập nhật kết quả. Tôi sẽ chuyển sang excel hoặc mã hóa giải pháp của riêng bạn, nhưng tôi đã cung cấp một trong trường hợp bạn muốn nó. Bạn có thể muốn thêm tiền tố '\ 0' với một ký tự đặc biệt vì bạn sẽ không còn có thể tìm kiếm theo dòng. Hoặc, bạn có thể thay đổi truy vấn thứ hai để tìm '\ 0' trong lựa chọn và làm việc từ đó. – Trisped

+0

Cảm ơn bạn đã trả lời câu hỏi này. Đó là những gì tôi cần. Và cảm ơn cho các tùy chọn bổ sung ở cuối. Tôi đã chia nhỏ thứ này ba lần để xử lý các thay thế khác nhau, tôi đã không nghĩ đến việc chỉ sử dụng \ 0 và lấy bit cuối cùng thay thế thứ tư. Cảm ơn một lần nữa. –

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