我希望在使用默认图片创建新记录时填充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;
答案 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:)