2011-01-10 2 views
1

Я использую Scalar-Valued Function, чтобы узнать, есть ли у пользователя системы изображения, аудиофайлы или видео в своем профиле.Простая математика в 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

Получение следующего сообщения об ошибке: Msg 8117, Level 16, State 1, процедура sf_MemberHasMedia, Линия 25 Операнда типа битых данных является недопустимым для оператора надстройки. – neojakey

+0

Необходимо изменить типы данных для @ OUT1, @ OUT2 AND @ OUT3 и INT. Я отредактирую ответ. –

+0

До сих пор так хорошо .. как я могу дать @OUTSTR значение по умолчанию 0? – neojakey

Смежные вопросы