2009-10-29 8 views
42

Làm cách nào để tôi có thể dễ dàng chèn một đốm màu vào trường varbinary (MAX)?Cách chèn một đốm màu vào cơ sở dữ liệu bằng cách sử dụng studio quản lý máy chủ sql

cho lập luận vì lợi ích:

giả định điều tôi muốn chèn là: c: \ picture.png bảng là mytable cột là mypictureblob và địa điểm là recid = 1

tôi đã được googling một thời gian và tôi không thể tìm thấy một giải pháp đơn giản

cảm ơn!

Trả lời

56

Bạn có thể chèn vào trường varbinary (max) bằng T-SQL trong SQL Server Management Studio và đặc biệt bằng cách sử dụng lệnh OPENROWSET commmand.

Ví dụ:

INSERT Production.ProductPhoto 
(
    ThumbnailPhoto, 
    ThumbnailPhotoFilePath, 
    LargePhoto, 
    LargePhotoFilePath 
) 
SELECT ThumbnailPhoto.*, null, null, N'tricycle_pink.gif' 
FROM OPENROWSET 
    (BULK 'c:\images\tricycle.jpg', SINGLE_BLOB) ThumbnailPhoto 

Hãy nhìn vào các tài liệu sau đây cho một ví dụ tốt/hương

Working With Large Value Types

Lưu ý rằng đường dẫn tập tin trong trường hợp này là tương đối so với SQL nhắm mục tiêu máy chủ và không phải máy khách của bạn đang chạy lệnh này.

+0

TSQL như trong nút 'truy vấn mới' trên thanh công cụ trên cùng bên phải? – Toad

+0

T-SQL là ngôn ngữ truy vấn mà SQL Server sử dụng. Có, bạn sẽ cần phải tạo một truy vấn mới ...... –

+0

cảm ơn! sẽ cung cấp cho điều này một whirl – Toad

1

Bạn có cần làm điều đó từ studio mgmt không? Dưới đây là cách chúng tôi thực hiện từ dòng cmd:

"C: \ Tệp chương trình \ Microsoft SQL Server \ MSSQL \ Binn \ TEXTCOPY.exe"/S < Máy chủ>/D < DataBase>/T mytable/C mypictureblob/F "C: \ picture.png"/W "trong đó RecId ="/I

+0

euh .... ok ... nhưng làm cách nào để biết cơ sở dữ liệu nào kết nối? – Toad

+0

xin lỗi, có vẻ như một số nhận xét của tôi đã bị sọc. tùy chọn/S là máy chủ và/D là cơ sở dữ liệu – cagreen

+0

hi cảm ơn !, Nhưng còn mật khẩu/tên người dùng thì sao? – Toad

0

Ok ... điều này đã cho tôi cách quá dài. Công cụ studio quản lý sql không chỉ đơn thuần là những thứ đơn giản như thế này (mà tôi đã nhận thấy trước khi tìm kiếm nơi đặt thời gian chờ trên truy vấn và được thực hiện ở 4 vị trí khác nhau)

Tôi đã tải xuống một số sql trình soạn thảo gói (sql maestro trong trường hợp của tôi). Và nhìn nó bao gồm một trình soạn thảo blob, nơi bạn có thể nhìn vào các đốm màu, và tải các đốm màu mới vào các lĩnh vực này.

cảm ơn cho đầu vào!

12

MSDN có một bài viết Working With Large Value Types cố gắng giải thích cách hoạt động của tính năng nhập nhưng có thể hơi khó hiểu vì nó làm 2 việc cùng nhau. Vì vậy, đây là một phiên bản đơn giản hóa và chia thành 2 phần. Giả sử bảng đơn giản:

CREATE TABLE [Thumbnail](
    [Id]  [int] IDENTITY(1,1) NOT NULL, 
    [Data]  [varbinary](max) NULL 
CONSTRAINT [PK_Thumbnail] PRIMARY KEY CLUSTERED 
(
[Id] ASC 
)) ON [PRIMARY] 

Nếu bạn chạy (trong SSMS):

SELECT * FROM OPENROWSET (BULK 'C:\Test\TestPic1.jpg', SINGLE_BLOB) 

nó sẽ hiển thị rằng kết quả trông giống như một bảng với một cột tên là BulkColumn. Đó là lý do tại sao bạn có thể sử dụng nó trong INSERT như:

INSERT [Thumbnail] (Data) 
SELECT * FROM OPENROWSET (BULK 'C:\Test\TestPic1.jpg', SINGLE_BLOB) 

Phần còn lại chỉ vừa lắp nó vào với nhiều cột mà bàn của bạn có thể có hoặc không có. Nếu bạn đặt tên cho kết quả od mà chọn FOO thì bạn có thể sử dụng SELECT Foo.BulkColumn và ass sau đó hằng số cho các trường khác trong bảng của bạn.

Bài đăng có thể phức tạp hơn là cách xuất dữ liệu đó trở lại thành tệp để bạn có thể kiểm tra xem nó vẫn OK. Nếu bạn chạy trên dòng cmd:

bcp "select Data from B2B.dbo.Thumbnail where Id=1" queryout D:\T\TestImage1_out2.dds -T -L 1 

Nó sẽ bắt đầu rên rỉ cho thêm 4 "thông số" và sẽ cung cấp cho mặc định gây hiểu lầm (whihc sẽ dẫn đến thay đổi tệp). Bạn có thể chấp nhận một đầu tiên, thiết lập 2 đến 0 và sau đó assept thứ 3 và thứ 4, hoặc là rõ ràng:

Enter the file storage type of field Data [varbinary(max)]: 
Enter prefix-length of field Data [8]: 0 
Enter length of field Data [0]: 
Enter field terminator [none]: 

Sau đó nó sẽ hỏi:

Do you want to save this format information in a file? [Y/n] y 
Host filename [bcp.fmt]: C:\Test\bcp_2.fmt 

Lần sau bạn phải chạy nó thêm -f C: \ Test \ bcp_2.fmt và nó sẽ ngừng rên rỉ :-) Tiết kiệm rất nhiều thời gian và đau buồn.

+0

+1 nỗ lực lớn cho một câu hỏi rất ngày (nhưng luôn luôn có liên quan). – Toad

+1

Một trong những nhu cầu để xác định một bí danh trong mệnh đề FROM –

5

Có hai cách để chọn một BLOB với TSQL:

SELECT * FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a 

Cũng như:

SELECT BulkColumn FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a 

Lưu ý tên tương quan sau mệnh đề FROM, mà là bắt buộc.

Sau đó, bạn có thể thực hiện điều này với INSERT bằng cách thực hiện CH INSN CHỌN.

Bạn cũng có thể sử dụng phiên bản thứ hai để thực hiện CẬP NHẬT như được mô tả trong How To Update A BLOB In SQL SERVER Using TSQL.

2

Tuy nhiên bạn chỉ có thể đọc một tập tin từ đĩa trên máy tính của SQL server:

select * from openrowset (bulk 'c:\path\filename.ext',single_blob) a 

để xem nó trong ứng dụng quản lý ở dạng hex (Management Studio).

Vì vậy, bạn có thể, ví dụ, sao lưu cơ sở dữ liệu vào tệp (cục bộ trên máy chủ) và sau đó tải xuống vị trí khác theo tuyên bố ở trên.