Flower@12 Ответов: 2

Как проверить, существует ли изображение уже или нет в SQL


Я сохранил изображение в таблице sql с помощью sql server 2005.Теперь мне нужно проверить, существует ли уже изображение или нет.
Мой код находится ниже

Что я уже пробовал:

CREATE PROCEDURE sptblEmployeeProofDetail
(
@SID numeric(18),@EmpSid numeric(18),@ProofTypeSID numeric(18),@ProofNo nvarchar(50),
@ProofPath nvarchar(100),@ProofImage image,@RevisionNo numeric(18),@CreatedBy numeric(18,3))
AS 
BEGIN

IF ((Select Count(*) from tblEmployeeProofDetail where EmpSid=@EmpSid and ProofTypeSID=@ProofTypeSID
     and ProofPath=@ProofPath and ProofImage=@ProofImage)>0)
BEGIN
 Select Top 1  @RevisionNo = RevisionNo +1 from tblEmployeeProofDetail order by RevisionNo Desc
END
INSERT INTO tblEmployeeProofDetail
(EmpSid,ProofTypeSID,ProofNo,ProofPath,ProofImage,RevisionNo,CreatedBy,CreatedOn)
VALUES
(@EmpSid,@ProofTypeSID,@ProofNo,@ProofPath,@ProofImage,@RevisionNo,@CreatedBy,GETDATE())
END


Сообщение об ошибке выглядит следующим образом
Msg 402, Level 16, State 1, Procedure sptblEmployeeProofDetail, Line 9
The data types image and image are incompatible in the equal to operator.

Richard MacCutchan

Сообщение ясно, что существует несовместимость между типом в вашей хранимой процедуре и типом в таблице базы данных.

phil.o

Не совсем :) Это говорит о том, что вы не можете сравнить тип данных изображения с помощью оператора equal to.

[no name]

Да.Теперь как я могу проверить существует ли изображение не в таблице с помощью sql storedprocedure

Maciej Los

Хорошая мысль!

Richard MacCutchan

Так каков же ответ?

phil.o

По-видимому, varbinary datatype будет иметь право на сравнение, но он все равно должен быть проверен на SQL Server 2005.

Richard MacCutchan

Да, я прочитал об этом немного больше после вашего комментария. Но я думаю, что это сообщение об ошибке нуждается в некоторой работе.

[no name]

В моей таблице поле ProofImage имеет тип данных Image и хранимая процедура также объявлена как image..но она показывает ошибку.Формат Моей Таблицы
SID numeric(18, 0)
EmpSid числовой(18, 0)
ProofTypeSID числовой(18, 0)
ProofNo nvarchar(50)
ProofPath nvarchar(100)
Корректурное изображение
Ревизионно числовой(18, 0)
CreatedBy numeric(18, 3)
CreatedOn datetime

0x01AA

а) если у вас есть такая возможность, замените его IMAGE около VARBINARY(MAX). IMAGE рано или поздно они исчезнут.

б.) VARBINARY(MAX) кажется, это прекрасно работает в предложении WHERE

Maciej Los

Хорошая мысль!

2 Ответов

Рейтинг:
15

OriginalGriff

В дополнение к изменению VARBINARY, предложенному 0x01AA, я бы посоветовал вам не использовать его в предложении WHERE, хотя он будет работать. Вместо этого добавьте дополнительный столбец в таблицу, содержащую хэш-значение (для этого подойдет MD5 или базовый SHA, нет необходимости быть защищенным), и сравните хэш-значения вместо самого изображения.

Поскольку изображения, как правило, довольно большие, как только ваша БД будет заполнена, этот выбор начнет работать все медленнее и медленнее, если вы продолжите сравнивать изображения. Сравнение хэшей происходит намного быстрее, так как они имеют определенный - гораздо меньший - размер. Если вы чувствуете себя параноиком, вы можете сравнить изображения, если у вас есть хэш-совпадения, но это, вероятно, не нужно.


Рейтинг:
11

Maciej Los

Ну, единственный способ сравнить изображения на стороне SQL server-это ПРЕОБРАЗОВАТЬ[^] их в VARBINARY тип данных:

...
WHERE CONVERT(VARBINARY(MAX), ProofImage) = CONVERT(VARBINARY(MAX), @ProofImage)


Примечание: Я не уверен, что CONVERT функция доступна на MS SQL Server 2005 из-за документации MSDN...

Для получения более подробной информации, пожалуйста, смотрите: Справочник по типам данных SQL Server 2005 - ConnectionStrings.com[^]