2011-07-18 30 views
-3

にストアドプロシージャに助けが必要: は、私は4つのテーブル持っているSQL Server 2008の

ContentID(fk) 
versionid(pk) 
page 

表2

表1

ContentID(pk) 
ContentGUID 
Description 
SiteID 
CategoryID 
StartDate 
DisplayName 
ParentId 
AssignedAuthors 
AssignedEditors 
CreatedBy 
U.UserName 
Created 
ModifiedBy 
UserName 
Modified 
Priority 

を表3

apprhistroyid(pk) 
verstionid(fk) 
approvalstatusid(fk) 

表4

approvalstatusid(pk) 
statusname 

テーブル1とテーブル4の合計詳細が必要です。私は、次の手順を試してみました。私はそれではなく、私は1つのテーブルとして、すべての戻り値をしたい1つのコンテンツID 1行あたりに返されROWAは、No.ofのnを取得しています

ALTER PROCEDURE [dbo].[DEV_SiteAdmin_Menu_GetItem_ALL_TEMP] 
@SiteID Int 

    AS 
DECLARE @VersionID int, @ApprovalStatusID int,@StatusName nvarchar(max),@ContentID Int,@Rowcount int 
DECLARE @TEMP INT 

--set @ApprovalStatusID=5; 
--set @StatusName ='New'; 
set @Rowcount=(select max(ContentID)from dev_content where [email protected]) 
set @ContentID=(select min(ContentID) from dev_content where [email protected]) 
SET @[email protected] 
IF(@Rowcount>=1) 

    BEGIN 
     WHILE @Rowcount>1 
     BEGIN 
      SET @[email protected] 
      set @ApprovalStatusID= 
CASE 
WHEN exists (SELECT VersionID from DEV_ContentVersion WHERE [email protected]) 
THEN (SELECT ApprovalStatusID FROM DEV_ApprovalStatus WHERE ApprovalStatusID=(SELECT ApprovalStatusID FROM DEV_ApprovalHistory WHERE VersionID=(SELECT VersionID from DEV_ContentVersion WHERE ContentID=(select ContentID from dev_content where [email protected] and [email protected])))) else 5 end 
set @StatusName= 
case 
when (@ApprovalStatusID != 5) 
then 
(SELECT StatusName FROM DEV_ApprovalStatus WHERE [email protected]) 
else 
'New' 
end 
     SELECT DISTINCT [ContentID] 
        ,[ContentGUID] 
        ,[Description] 
        ,[SiteID] 
        ,[CategoryID] 
        ,[StartDate] 
        ,[DisplayName] 
        ,[ParentId] 
        ,[AssignedAuthors] 
        ,[AssignedEditors] 
        ,[CreatedBy] 
        ,U.UserName 'CreatedUser' 
        ,dbo.fnGetUserNamesFromUserIds([AssignedAuthors],',') 'Authors' 
        ,dbo.fnGetUserNamesFromUserIds([AssignedEditors],',') 'Editors' 
        ,[Created] 
        ,[ModifiedBy] 
        ,U1.UserName 'ModifiedUser' 
        ,[Modified] 
        ,[Priority] 
        ,@ApprovalStatusID [ApprovalStatusID] 
        ,@StatusName [StatusName] 
       FROM [DEV_Content] C 
       INNER JOIN dbo.aspnet_Users U ON U.UserId=C.CreatedBy 
       INNER JOIN dbo.aspnet_Users U1 ON U1.UserId=C.ModifiedBy 
       WHERE [email protected] AND [ContentID] = @TEMP 
       SET @TEMP= @TEMP+1 
     END 
    END 
    else 
    print 'error' 

+0

あなたはクエリが壊れていると思います - '@ ApprovalStatusID'への割り当てでは、純粋に' ContentID'に基づいて 'DEV_ContentVersion'を検索するつもりですが、' ContentID'と ' SiteID'?そして、私は同じステートメントで '@ ContentID'を使用していることに注意してください。これはあなたのループでインクリメントしている' @ TEMP'ではなく、一度だけ割り当てられます。それらが意図的であるかどうかを言うことができますか? –

答えて

0

私はあなたの全体のクエリがに煮詰めことができると思う:

SELECT 
    [ContentID] 
    ,[ContentGUID] 
    ,[Description] 
    ,[SiteID] 
    ,[CategoryID] 
    ,[StartDate] 
    ,[DisplayName] 
    ,[ParentId] 
    ,[AssignedAuthors] 
    ,[AssignedEditors] 
    ,[CreatedBy] 
    ,U.UserName as CreatedUser 
    ,dbo.fnGetUserNamesFromUserIds([AssignedAuthors],',') as Authors 
    ,dbo.fnGetUserNamesFromUserIds([AssignedEditors],',') as Editors 
    ,[Created] 
    ,[ModifiedBy] 
    ,U1.UserName as ModifiedUser 
    ,[Modified] 
    ,[Priority] 
    ,COALESCE(ah.ApprovalStatusID,5) as ApprovalStatusID 
    ,COALESCE(ast.StatusName,'New' as StatusName 
FROM 
    [DEV_Content] C 
     INNER JOIN 
    dbo.aspnet_Users U 
     ON 
      U.UserId=C.CreatedBy 
     INNER JOIN 
    dbo.aspnet_Users U1 
     ON 
      U1.UserId=C.ModifiedBy 
     left join 
    DEV_ContentVersion cv 
     inner join 
    DEV_ApprovalHistory ah 
     on 
      cv.VersionID = ah.VersionID 
     inner join 
    DEV_ApprovalStatus ast 
     on 
      ah.ApprovalStatusID = ast.ApprovalStatusID 
     on 
      C.ContentID = cv.ContentID 

WHERE 
    [email protected] 

しかし、私は認めざるを得ない、私はDISTINCTはそこでやっているものだったのかわからないんだけど。

関連する問題