Как заполнить столбец varbinary (MAX) изображением по умолчанию для всех записей в SQL Server 2005 Express - PullRequest
1 голос
/ 17 декабря 2009

Я хочу заполнить столбец varbinary (MAX) таблицы базы данных SQL Server при создании новой записи с изображением по умолчанию. Как мне сделать это с помощью триггера или в этом случае любым другим способом?

Это код T-SQL, который я пробовал:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Trg_DoctorDemographic_DefaultImage]
ON [ECGManagementSystem].[dbo].[DoctorDemographic]
 AFTER INSERT  
NOT FOR REPLICATION
AS
BEGIN
  INSERT INTO[ECGManagementSystem].[dbo].[DoctorDemographic]
    (DPhoto)
    SELECT  * FROM OPENROWSET(Bulk N'D:\Programs\MSVC\Exercises\BEMS\BEMS\res\Doctor.bmp',SINGLE_BLOB)AS BLOB
END;

Ответы [ 3 ]

5 голосов
/ 17 декабря 2009

Нет, не делай так.

Если у вас есть 1000 строк с этим значением по умолчанию, у вас будет 1000 копий этого изображения? Размер вашей базы данных будет быстро расти. Если вы хотите изменить значение по умолчанию, вам нужно обновить 1000 изображений. Нехорошо.

Храните 1 копию в 1 месте - возможно, таблицу с именем DefaultDPhoto. Оставьте столбец изображения пустым в своей таблице DoctorDemographic, когда это значение по умолчанию, а затем, когда вы собираетесь извлечь изображение, есть логика, что если этот столбец равен нулю, потяните одну копию.

EDIT:

Хорошо, сначала я бы сделал хранимый процесс вроде:

create proc getDPhoto(@ID int)
as
begin
set nocount on

if exists (select 1 from DoctorDemographic where id = @ID and DPhoto is not null)
     select DPhoto from DoctorDemographic where id = @ID
else 
    select DPhoto from DefaultDPhoto 

end

Затем из этого примера здесь в качестве отправной точки я бы изменил шаг 1 в разделе «Получение изображения» следующим образом:

SqlCommand cmdSelect = new SqlCommand("getDPhoto");

cmdSelect.CommandType = CommandType.StoredProcedure;
1 голос
/ 17 декабря 2009

Я был бы склонен использовать отдельную таблицу для хранения изображения и обернуть его в скалярную пользовательскую функцию, которая определяется как ограничение по умолчанию.

Чтобы избежать ненужных вызовов OPENROWSET в триггерах ...

0 голосов
/ 17 декабря 2009

Можно ли использовать что-то вроде этого?

SELECT [DColumnName1]
     , [DColumnName2]
     , CASE WHEN [DPhoto] IS NULL THEN (SELECT  * FROM OPENROWSET(Bulk N'D:\Programs\MSVC\Exercises\BEMS\BEMS\res\Doctor.bmp',SINGLE_BLOB)AS BLOB) ELSE [DPhoto] END [DPhoto]
  FROM [ECGManagementSystem].[dbo].[DoctorDemographic]
 WHERE Something = 'Matching';

Редактировать: Ну, если вы действительно хотите, чтобы копии изображения в таблице исправили [OMG Ponies], вставьте ниже, попробуйте тогда.

SET @Image = (SELECT BulkColumn FROM OPENROWSET(Bulk N'D:\Programs\MSVC\Exercises\BEMS\BEMS\res\Doctor.bmp',SINGLE_BLOB)AS BLOB);

Вместо:

SELECT @image = column FROM OPENROWSET(Bulk N'D:\Programs\MSVC\Exercises\BEMS\BEMS\res\Doctor.bmp', SINGLE_BLOB) AS BLOB

В дальнейшем это усложняет изменение изображения по умолчанию, но это ваша БД:)

...