2011-01-10 9 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 

Iをこのロジックでは失われています、そして、それは簡単なはず。どんな助けでも大歓迎です。

多くのおかげで、 ポール

答えて

2

は私が機能アップ少しの構文をきれいにしようとしました。要点は、関数の戻り値の型はBITではなくINTでなければならないことです。

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

+0

@ OUT1、@ OUT2および@ OUT3のデータ型もINTに変更する必要があります。私は答えを編集します。 –

+0

これまでのところとても良い.. @OUTSTRにはデフォルトの0をどうやって与えるのですか? – neojakey