1

我想要在創建新記錄時填充SQL Server數據庫表的varbinary(MAX)列默認圖片。我如何使用觸發器或在這種情況下通過任何其他方式來做到這一點?如何使用SQL Server 2005 Express中的所有記錄的缺省映像填充varbinary(MAX)列

這是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; 

回答

1

我會傾向於使用一個單獨的表來存儲圖片,並且在一個標量UDF,其被定義爲默認包本約束。

如果僅僅是爲了避免不必要的觸發OPENROWSET電話......

+0

感謝您的建議Mr.GBN – 2009-12-17 06:37:02

5

不,不要做這種方式。

如果你有1,000行這個默認值,你將有1000個這個圖像的副本?數據庫的大小會迅速增長。如果您想更改默認值,則必須更新1,000張圖像。不好。

在1個地方存儲1個副本 - 可能是一個名爲DefaultDPhoto的表。當它是默認值時,將DoctorDemographic表中的圖像列保留爲空,然後當您去檢索圖像時有邏輯,如果此列爲空,則取出單個副本。

編輯:

好的,我首先作出這樣一個存儲過程:

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 

然後從這個例子here作爲起點我將根據「檢索圖像」改變步驟1至如下:

SqlCommand cmdSelect = new SqlCommand("getDPhoto"); 

cmdSelect.CommandType = CommandType.StoredProcedure; 
+0

非常感謝你很多Mr.JBrooks。但正如我已經提到的,我是SQL服務器的新手,如果你可以使用一些代碼解釋,這將是一個很好的幫助。不管你是否運行時間不夠, 再次感謝 – 2009-12-17 06:35:45

+0

提示:您可以在SELECT查詢中使用CASE/WHEN在源列爲NULL時返回默認圖像。 – RickNZ 2009-12-17 06:59:24

+0

謝謝Mr.Brooks ....感謝您寶貴的時間。我會盡快嘗試您的建議並讓您知道結果。我感謝你的善意幫助。 再次感謝 – 2009-12-17 07:28:00

0

可以使用類似這樣的東西?

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小馬]下面插入試試這個呢。

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 

這樣做使得它更難以後更改默認的照片雖然,但它是你的DB :)

+0

謝謝Mr.Don ......但我的想法是在我手動輸入記錄或使用任何INSERT或UPDATE語句時自動填寫此列。如果您可以發佈代碼,我將非常高興請務必記住上述要求。您的幫助非常感謝。 再次感謝 – 2009-12-17 10:33:19

+0

我非常感謝您的幫助Mr.Don.再次感謝您。 – 2009-12-18 04:12:17

相關問題