如何使用SQL Server 2005 Express中所有记录的默认图像填充varbinary(MAX)列

时间:2009-12-17 05:18:58

标签: sql sql-server image sql-server-express sql-server-2005-express

我希望在使用默认图片创建新记录时填充SQL Server数据库表的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;

3 个答案:

答案 0 :(得分:5)

不,不要这样做。

如果您有1000行此默认设置,您将拥有此图像的1,000份副本?数据库的大小将快速增长。如果要更改默认值,则必须更新1,000张图像。不好。

将1份副本存储在1个位置 - 也许是一个名为DefaultDPhoto的表。默认情况下,将图像列保留为DoctorDemographic表中的null,然后当您去检索图像时,如果此列为空,则请拉出单个副本。

编辑:

好的,首先我要制作一个存储过程,如:

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;

答案 1 :(得分:1)

我倾向于使用单独的表来存储图片,并将其包装在标量UDF中,该UDF被定义为默认约束。

如果只是为了避免触发器中不必要的OPENROWSET调用......

答案 2 :(得分: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:)