2009-07-13 40 views
47

Tôi có một SQL Server 2000 với một bảng có chứa một cột image.Làm cách nào để chèn dữ liệu tệp nhị phân vào trường SQL nhị phân bằng cách sử dụng câu lệnh chèn đơn giản?

Làm cách nào để chèn dữ liệu nhị phân của tệp vào cột đó bằng cách chỉ định đường dẫn của tệp?

CREATE TABLE Files 
(
    FileId int, 
    FileData image 
) 
+0

nhị phân (tối đa) trong MS SQL 2000? Như tôi nhớ trong biến nhị phân phiên bản này có thể chỉ có chiều dài cố định và có thể chứa tới 8000 byte. Trong các dự án của riêng tôi, chúng tôi đã lưu trữ các tệp trong các trường IMAGE. –

+0

@Alex_L, chỉ cần kiểm tra lại lược đồ, đó là hình ảnh. – scottm

Trả lời

41

Nếu bạn có nghĩa là sử dụng một chữ, bạn chỉ cần có để tạo ra một chuỗi nhị phân:

insert into Files (FileId, FileData) values (1, 0x010203040506) 

Và bạn sẽ có một kỷ lục với một giá trị Sáu byte cho trường fileData.


Bạn cho biết trong nhận xét bạn muốn chỉ định tên tệp mà bạn không thể thực hiện với SQL Server 2000 (hoặc bất kỳ phiên bản nào khác mà tôi biết).

Bạn cần một thủ tục lưu trữ CLR để thực hiện điều này trong SQL Server 2005/2008 hoặc thủ tục được lưu trữ mở rộng (nhưng tôi tránh mọi chi phí đó trừ khi bạn phải), lấy tên tệp và sau đó chèn dữ liệu (hoặc trả về chuỗi byte, nhưng điều đó có thể khá dài).


Liên quan đến vấn đề chỉ có thể lấy dữ liệu từ một SP/truy vấn, tôi sẽ nói câu trả lời là có, bởi vì nếu bạn cung cấp cho SQL Server khả năng đọc tập tin từ hệ thống tập tin, những gì bạn làm gì khi không được kết nối thông qua Windows Authentication, người dùng nào được sử dụng để xác định quyền? Nếu bạn đang chạy dịch vụ với tư cách quản trị viên (Thiên Chúa cấm) thì bạn có thể có quyền nâng cao quyền không được phép.

+1

Tôi muốn chỉ định tên tệp. – scottm

+0

Vì vậy, các trường hình ảnh/nhị phân chỉ được sử dụng với các ứng dụng có thể đọc dữ liệu nhị phân truyền qua truy vấn/sp? – scottm

+0

Tôi nghĩ rằng giải pháp bên dưới được ưa thích vì nó bao gồm một bước để chuyển đổi từ một tệp. Thử nghiệm nó với hình ảnh kiểu dữ liệu và nó hoạt động. –

79

Tôi tin rằng điều này sẽ ở đâu đó gần.

INSERT INTO Files 
(FileId, FileData) 
SELECT 1, * FROM OPENROWSET(BULK N'C:\Image.jpg', SINGLE_BLOB) rs 

Điều cần lưu ý, ở trên chạy trong SQL Server 2005 và SQL Server 2008 với kiểu dữ liệu là varbinary(max). Nó không được thử nghiệm với hình ảnh như kiểu dữ liệu.

+17

Lưu ý: điều này phải rõ ràng cho tất cả (ngoại trừ tôi), nhưng đường dẫn tệp dường như cần phải tồn tại trên máy chủ cơ sở dữ liệu thực tế. Nếu tệp được lưu trữ trên máy từ xa, bạn sẽ gặp phải lỗi sau: Không thể tải hàng loạt vì tệp ".." không thể mở được. – timmi4sa

+1

+1 Không chỉ "ở đâu đó gần" - nó hoạt động hoàn hảo ở đây (SQL Server 2005). –

+0

Chà. Stonking tip! Trong công ty của chúng tôi, trung tâm dữ liệu nội bộ của chúng tôi là một lục địa, và chúng tôi có vấn đề về độ trễ lớn. Bắt C# để viết một tập tin 7Mb vào một bản ghi SQL Server mất 30 giây. Nhưng sao chép tập tin vào máy SQL Server, sau đó sử dụng INSERT này để ghi nó vào một bản ghi mất tổng cộng khoảng 3 giây. Mẹo tuyệt vời, đặc biệt là nó không dựa vào OLEDB (mà luôn luôn có vẻ gây ra cho chúng tôi các vấn đề với SQL Server) –

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