1

当使用默认图片创建新记录时,我想填充 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;
4

3 回答 3

5

不,不要这样做。

如果您有 1,000 行使用此默认值,您将拥有此图像的 1,000 个副本?您的数据库的大小将迅速增长。如果要更改默认值,则必须更新 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

然后从这里的这个示例作为起点,我会将“检索图像”下的步骤 1 更改为以下内容:

SqlCommand cmdSelect = new SqlCommand("getDPhoto");

cmdSelect.CommandType = CommandType.StoredProcedure;
于 2009-12-17T06:26:45.523 回答
1

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

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

于 2009-12-17T06:26:06.270 回答
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 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

这样做会使以后更改默认图片变得更加困难,但这是您的数据库:)

于 2009-12-17T10:15:29.590 回答