2010-07-18 135 views
1

这是我的逻辑。需要SQL 2000存储过程帮助

我有一个文章表和一个匹配的图片表。图像以二进制格式存储。每个图像表有两个实例的每个图像,这是因为我有2个尺寸。 300 x 200和500 x 400以及它们的行由ImageSize分隔

我想编写一个存储过程,检查ImageSize = 3是否可用,如果没有,则从ImageSize = 2中检索。

如何设置我的存储过程来执行此操作?

感谢

+1

在你的问题中包含你的表格结构。 – JohnFx 2010-07-18 15:28:06

回答

2

Andomar的反应是完全有效的,非常优雅的 - 如果你想要更多的东西“脚踏实地”,即取考虑到有可能参与今后的其他数值,试试这个:

CREATE PROCEDURE dbo.FetchImage(@ImageName VARCHAR(255)) 
AS 
    IF EXISTS(SELECT * FROM dbo.ImageTable 
      WHERE ImageName = @ImageName AND ImageSize = 3) 
     SELECT 
      Image 
     FROM 
      dbo.ImageTable 
     WHERE 
      ImageName = @ImageName AND ImageSize = 3 
    ELSE 
     SELECT 
      Image 
     FROM 
      dbo.ImageTable 
     WHERE 
      ImageName = @ImageName AND ImageSize = 2 

,基本上做同样的事情 - 但它会续因为即使您突然还有图像大小代码为4,5等等,也会返回Image作为ImageSize = 3

+0

@TOm:我不喜欢这样的事实,即如果引入其他值(如ImageSize = 4),Andomar的解决方案将失败。这就是为什么我喜欢在我的意图中更具体和更清晰。优雅是伟大的 - 但“它的作品”(在所有情况下)对我来说更重要。 – 2010-07-18 20:48:27

+0

如果是这样的话,那么您肯定会使用Andomar的解决方案,在WHERE子句中添加“AND ImageSize BETWEEN 2和3”? – Tom 2010-07-18 21:11:39

+0

@Tom:这可能是一种可能性,是的。 – 2010-07-18 21:18:11

5

你可以找到一个简单的top 1最高大小的图片:

create procedure dbo.GetImage(
    @ImageName varchar(50)) 
as 
select top 1 image 
from ImageTable 
where ImageName = @ImageName 
order by 
     ImageSize desc 
+0

动态sql通常很糟糕 - 听起来像现在没有必要这样做。 – 2010-07-18 15:22:34

+2

这不是动态sql,只是使用参数的sql语句(在过程中)。 – 2010-07-18 15:34:57