2010-10-08 38 views
8

Tôi có hai bảng có cấu trúc giống hệt nhau và số lượng trường RẤT LỚN (khoảng 1000). Tôi cần thực hiện 2 thao tác 1) Chèn từ bảng thứ hai tất cả các hàng vào nắm tay. Ví dụ:Làm cách nào để cập nhật một bảng từ bảng khác mà không chỉ định tên cột?

INSERT INTO [1607348182] 
SELECT * 
FROM _tmp_1607348182; 

2) Cập nhật bảng đầu tiên từ bảng thứ hai nhưng để cập nhật tôi không thể tìm thấy cú pháp sql thích hợp để cập nhật.

Queries như:

Update [1607348182] 
set [1607348182].* = tmp.* 
from [1607348182] 
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid 

hoặc

Update [1607348182] 
from [1607348182] 
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid 

không hợp lệ.

+3

Tôi khuyên bạn nên sử dụng 'TRIGGER' hoặc sửa đổi lược đồ của bạn để bạn không phải thực hiện việc này. –

+0

Tôi không hiểu. Sau lần cập nhật đầu tiên của bạn, hai bảng sẽ chứa các hàng giống hệt nhau, vì vậy bạn đang hy vọng bản cập nhật thứ hai sẽ làm gì? – PaulG

+0

Travis G, tôi đồng ý với bạn để sửa đổi lược đồ db nhưng tiếc là tôi nên làm theo lược đồ này trong dự án của tôi. – amuliar

Trả lời

3

Không chắc chắn liệu bạn có thể thực hiện điều này mà không sử dụng sql động để xây dựng câu lệnh cập nhật trong một biến hay không.

Tuyên bố này sẽ trả về một danh sách các cột dựa trên tên bảng bạn đặt vào:

select name from syscolumns 
where [id] = (select [id] from sysobjects where name = 'tablename') 

Không chắc chắn nếu tôi có thể tránh một vòng lặp ở đây .... bạn sẽ cần phải tải các kết quả từ ở trên vào một con trỏ và sau đó xây dựng một truy vấn từ nó. Psuedo được mã hóa:

set @query = 'update [1607348182] set ' 
load cursor --(we will use @name to hold the column name) 
while stillrecordsincursor 
set @query = @query + @name + ' = tmp_[1607348182]. ' [email protected] + ',' 
load next value from cursor 
loop! 

Khi truy vấn được thực hiện đang được xây dựng trong vòng lặp, hãy sử dụng exec sp_executesql @query.

Chỉ cần một chút cảnh báo ... xây dựng sql động trong một vòng lặp như thế này có thể gây nhầm lẫn một chút. Để khắc phục sự cố, hãy đặt @query vào vòng lặp và xem @query được tạo.

chỉnh sửa: Không chắc chắn liệu bạn có thể làm tất cả 1000 hàng trong bản cập nhật cùng một lúc không ... có giới hạn hợp lý (varchar (8000)?) Về kích thước mà @query có thể phát triển quá. Bạn có thể phải chia mã để nó xử lý 50 cột cùng một lúc. Đặt các cột từ câu lệnh select syscolumns vào một bảng tạm thời với một id và xây dựng sql động của bạn để nó cập nhật 20 cột (hoặc 50?) Tại một thời điểm.

Một giải pháp thay thế khác là sử dụng excel để tạo khối lượng này. Do cột chọn và sao chép các kết quả vào cột a của bảng tính. Đặt '= trong cột b, tmp. [12331312] trong cột c, sao chép cột a vào cột D và dấu phẩy vào cột e. Sao chép toàn bộ bảng tính vào một notepad và bạn nên có các cột của câu lệnh cập nhật được xây dựng cho bạn. Không phải là một giải pháp tồi nếu đây là một sự kiện một shot, không chắc chắn nếu tôi dựa vào điều này như là một giải pháp đang diễn ra.

+0

Nó có vẻ là một giải pháp tốt nhất vì không có biểu thức gốc trong sql để làm điều đó. Ngoài ra tôi đã gặp rắc rối với các hạn chế khác của SQL Server liên quan đến các cột có kích thước biến.(Ngoài ra tôi nhận ra vấn đề của tôi bắt nguồn từ lược đồ DB xấu) Vì vậy, giải pháp của bạn có vẻ là tốt nhất vì tôi có thể lưu trữ câu lệnh SQL này và sử dụng lại sau này trong các yêu cầu khác. – amuliar

+0

Giới hạn về VARCHAR (8000). Tôi có thể tạo varchar (MAX) anyway – amuliar

+0

Điểm tốt, tôi đã làm việc trong cơ sở dữ liệu di sản gần đây và quên về varchar (max). Liên quan đến lược đồ db nghèo ... Tôi giả sử bạn đang làm việc từ một lược đồ cũ (hiếm khi thấy các bảng có tên là số bên ngoài của flatfiles/IDBMS). Việc nhập hàng đêm từ hệ thống kế thừa vào một cơ sở dữ liệu chuẩn hóa có thể là một lựa chọn tốt để xem xét, nếu không bạn đang xem xét một lượng thời gian tương đối lớn để làm việc với lược đồ nghèo này sẽ được thêm vào mọi dự án bạn làm. – Twelfth

5

Làm việc để xóa mọi thứ khỏi bảng chính có ID trong temp, sau đó thực hiện chèn bằng dữ liệu mới?

+0

Có, tôi đã nhận ra giải pháp này và triển khai nó. Cảm ơn bạn – amuliar

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