2011-01-10 50 views
1

我正在使用标量值函数来确定系统的用户是否在其配置文件中包含图像,音频文件或视频。T-SQL中的简单数学

当我搜索成员时,我想按照他们拥有的媒体数量来排列成员。因此,举例来说,拥有所有媒体(视频,音频和图像)的用户对于他们拥有的每个媒体都将获得3,1分。如果他们有2个媒体(图像和视频),但没有音频,他们会得到2.这将列在拥有所有3个媒体的所有用户之后。

存储过程具有这样的:

SELECT 
a.MemberID, 
a.UserName, 
a.LastLogin, 
a.City, 
b.Abbr, 
c.Country, 
a.AvatarMed, 
a.Gender, 
sbuser.sf_MemberHasImages(a.MemberID), 
sbuser.sf_MemberHasVideo(a.MemberID), 
sbuser.sf_MemberHasAudio(a.MemberID), 
d.Domain, 
sbuser.sf_DisplayName(a.MemberID), 
a.CreateDate, 
a.Claimed, 
a.ProfileTypeID, 
a.Zip, 
a.PhoneNbr, 
a.PrPhone 
FROM Member a 
LEFT JOIN State b ON b.StateID = a.StateID 
INNER JOIN Country c ON c.countryID = a.CountryID 
INNER JOIN Region d ON d.RegionID = a.MemberREgionID 
WHERE ProfileTypeID IS NOT NULL 
AND (sbuser.sf_DisplayName(a.MemberID) LIKE @UserName + '%') 
AND a.MemberID <> @MemberID 
ORDER BY a.Claimed DESC, a.AvatarTiny DESC, sbuser.sf_MemberHasMedia(a.MemberID) 

如果您注意顺序,它包含以下内容:

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [sbuser].[sf_MemberHasMedia](@MemberID bigint) 

RETURNS BIT 
AS 
BEGIN 
DECLARE @OUTSTR INT 
DECLARE @OUT1 BIT 
DECLARE @OUT2 BIT 
DECLARE @OUT3 BIT 
SET @OUT1 = (SELECT CAST(COUNT(MemberAudioID) AS BIT) FROM MemberAudio 
WHERE MemberID @MemberID) 
RETURN @OUTSTR = @OUT1 
END 

RETURNS BIT 
AS 
BEGIN 
SET @OUT2 = (SELECT CAST(COUNT(a.MemberImgID) AS BIT) 
From MemberImg a 
INNER JOIN MemberImgGallery b ON b.MemberImgGalleryID=a.MemberImgGalleryID 
WHERE b.MemberID = @MemberID) 
RETURN @OUTSTR = @OUTSTR + @OUT2 
END 

RETURNS BIT 
AS 
BEGIN 
SET @OUT3 = (SELECT CAST(COUNT(MemberVideoID) AS BIT) FROM MemberVideo 
WHERE MemberID = @MemberID) 
RETURN @OUTSTR = @OUTSTR + @OUT3 
END 

我在这个逻辑丢失,它应该很容易。任何帮助将不胜感激。

非常感谢, 保罗

回答

2

我已经尝试清洁功能了一个小的语法。关键是函数的返回类型应该是INT而不是BIT。

ALTER FUNCTION [sbuser].[sf_MemberHasMedia](@MemberID bigint) 

RETURNS INT 
AS 
BEGIN 
    DECLARE @OUTSTR INT 
    DECLARE @OUT1 INT 
    DECLARE @OUT2 INT 
    DECLARE @OUT3 INT 

    SET @OUT1 = (SELECT CAST(COUNT(MemberAudioID) AS BIT) 
       FROM MemberAudio 
       WHERE MemberID @MemberID) 

    SET @OUT2 = (SELECT CAST(COUNT(a.MemberImgID) AS BIT) 
       FROM MemberImg a 
        INNER JOIN MemberImgGallery b 
         ON b.MemberImgGalleryID=a.MemberImgGalleryID 
       WHERE b.MemberID = @MemberID) 

    SET @OUT3 = (SELECT CAST(COUNT(MemberVideoID) AS BIT) 
       FROM MemberVideo 
       WHERE MemberID = @MemberID) 

    SET @OUTSTR = @OUT1 + @OUT2 + @OUT3 
    RETURN @OUTSTR 
END 
+0

收到以下错误:消息8117,级别16,状态1,过程sf_MemberHasMedia,第25行 操作数数据类型位是增加操作符无效。 – neojakey 2011-01-10 21:06:27