1

Je souhaite remplir la colonne varbinary (MAX) d'une table de base de données SQL Server chaque fois qu'un nouvel enregistrement est créé avec un image par défaut. Comment est-ce que je fais ceci en utilisant un déclencheur ou dans ce cas par n'importe quel autre moyen?Comment remplir une colonne varbinary (MAX) avec une image par défaut pour tous les enregistrements dans SQL Server 2005 Express

Voici le code T-SQL J'ai essayé:

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; 

Répondre

1

Je serais enclin à utiliser une table séparée pour stocker l'image et l'encapsuler dans une UDF scalaire, qui est défini comme la valeur par défaut contrainte.

Si seulement pour éviter les appels OPENROWSET inutiles dans les déclencheurs ...

+0

Merci pour la suggestion Mr.GBN –

5

Non, ne le font pas de cette façon.

Si vous avez 1 000 lignes avec cette valeur par défaut, vous aurez 1 000 copies de cette image? La taille de votre base de données va augmenter rapidement. Si vous voulez changer la valeur par défaut, vous devez mettre à jour 1 000 images. Pas bon.

Stockez 1 copie à 1 place - peut-être une table appelée DefaultDPhoto. Gardez la colonne image nulle dans votre table DoctorDemographic quand c'est la valeur par défaut, puis quand vous allez récupérer l'image, ayez la logique que si cette colonne est nulle, allez tirer la copie unique.

EDIT:

Ok, d'abord je voudrais faire une procédure stockée comme:

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 

Puis, de cet exemple here comme point de départ, je changerais étape 1 sous "Image Récupération" à ce qui suit:

SqlCommand cmdSelect = new SqlCommand("getDPhoto"); 

cmdSelect.CommandType = CommandType.StoredProcedure; 
+0

Je vous remercie beaucoup Mr.Brooks. Mais comme je l'ai déjà mentionné que je suis nouveau sur SQL Server, ce sera une aide précieuse si vous pouviez expliquer en utilisant du code. N'importe si vous manquez de temps. Merci encore une fois –

+0

Conseil: vous pouvez utiliser CASE/WHEN dans votre requête SELECT pour renvoyer l'image par défaut lorsque la colonne source est NULL. – RickNZ

+0

Merci Mr.Brooks .... merci pour votre précieux temps. Je vais essayer votre suggestion dès que possible et vous faire connaître le résultat. Je vous remercie de votre aide. Merci encore une fois –

0

Pourriez-vous utiliser quelque chose comme ça?

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'; 

Edit: Eh bien, si vous voulez vraiment des copies de l'image dans la table pour fixer [OMG Poneys] encadré ci-dessous essayer ce moment-là.

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

Au lieu de:

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

Faire cela rend plus difficile de changer l'image par défaut plus tard si, mais c'est votre DB :)

+0

Merci M.Don ...... Mais mon idée est de remplir automatiquement cette colonne lorsque je saisis un enregistrement manuellement ou en utilisant une déclaration INSERT ou UPDATE. Je serai plus qu'heureux si vous pouviez poster un code extrait en gardant à l'esprit l'exigence mentionnée ci-dessus. Votre aide est grandement appréciée. Merci encore une fois –

+0

Je suis reconnaissant envers vous pour votre aide M.Don.Merci encore une fois. –

Questions connexes