SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeSelect]
GO

--====================================================================================
--==根据给定的  Knowledge ID 以 获得 Knowledge 表中的指定记录
--====================================================================================
--==版权所有 2001-2011 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeSelect

@KnowledgeItem INT				--Knowledge 记录 ID

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择
--====================================================================================
SELECT
	now.[ID] AS [ID],
	now.PageDirectoryID AS PageDirectoryID,
	now.Serial AS Serial,
	now.Editor AS Editor,
	now.DedicatedTo AS DedicatedTo,
	now.CommentsPermission AS CommentsPermission,
	now.UpdateTime AS UpdateTime,
	now.Author AS Author

FROM dbo.Knowledge now

WHERE now.[ID]=@KnowledgeItem

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.StoredProcedureParametersBuild    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[StoredProcedureParametersBuild]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[StoredProcedureParametersBuild]
GO

--====================================================================================
--==获取某个Stored Procedure 的参数列表，供 BL DataAccess 中的部件用
--==输入参数， @StoredProcedureName varchar(128) 
--==输出结果，建立的参数列表
--==该SP 参照了SQL Server 2000所带的 PARAMETERS View
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28 
--====================================================================================


CREATE PROCEDURE dbo.StoredProcedureParametersBuild

 @StoredProcedureName nvarchar(128)		--SP 名

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

SELECT 

    PARAMETER_NAME AS ParameterName, 
    DATA_TYPE AS ParameterDataType, 
    CASE UPPER(PARAMETER_MODE) WHEN N'IN' THEN N'Input' WHEN N'OUT' THEN N'Output' WHEN N'INOUT' THEN N'Output' ELSE N'ReturnValue' END AS ParameterDirection, 
    CHARACTER_MAXIMUM_LENGTH AS ParameterSize,
    NUMERIC_PRECISION AS ParameterPrecision, 
    NUMERIC_SCALE AS ParameterScale

FROM INFORMATION_SCHEMA.PARAMETERS

WHERE SPECIFIC_NAME=@StoredProcedureName

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[StoredProcedureParametersBuild]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserAuthentication    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserAuthentication]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserAuthentication]
GO

--====================================================================================
--本系统对用户验证的原理：
--表 Users 中保存了用户的所有 Profile ，包括 Name, Password, UserRole
--用户一共有下列 UserRole -- 1.Admin, 2.Chief Editor, 3.Column Editor, 2.Community
--验证的时候要看下列条件 -- 1. Name Password 符合 （注意：我们不再需要 UserRole 一致这个条件，因为只要 Users 表中包含某个用户，且 Name, Password 一致，就表示用户可以进来，至于他能不能进入某个模块 TemplateBase 中的 CheckLogin 会进行验证）
--输出： oPass 指示验证是否成功
--输出： oUserRoles 返回该用户可以覆盖的所有角色，该用户将同时自动登入这些角色 （返回它们是为了在 BL 中为他们创建连接字符串）
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-12-02
--====================================================================================

CREATE PROCEDURE dbo.UserAuthentication

@Name nvarchar(50),				--用户名（输入）
@Password nvarchar(200),			--密码（已经经过加密处理，输入）
@oPass int OUT,				--验证是否通过（输出）
@oUserRoles nvarchar(4000) OUT,		--返回的，该用户可以覆盖的角色名称列表 （以 “，” 分隔开的列表）
@oUserAdmin INT OUT,				--返回的，该用户是否 Amin 用户 （在 Menu 和一些别的场合，系统得知当前用户是 Admin，会 Render 系统管理相应功能链接）
@oUserAdminEditor INT OUT,			--返回的，该用户是否 AminEditor 用户 （在 Menu 和一些别的场合，系统得知当前用户是 AdminEditor，会 Render 编辑相应功能链接）
@oModeratorForums nvarchar(4000) OUT	--返回的，该用户出任斑竹的 Forum ID 列表（以“，”分隔开的列表）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==如果输入参数非法，则当然不通过
--==如果输入参数合法，则验证之
--======================================================
IF (RTRim(LTRim(@Name))=N'') or (RTRim(LTRim(@Password))=N'')

	BEGIN 
		SELECT @oPass=0
		RAISERROR(N'用户名和密码不可以为空。',16,1)
		RETURN
	END	

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

ELSE

	BEGIN
		--========================================
		--==如果用户名字，密码都符合，并且 UserRole 也符合
		--==UserRole 符合是通过检查给定的 @UserRole 是否出现在被验证用户可以覆盖的角色列表中来实现的
		--========================================
		--IF Exists (SELECT us.[ID] FROM dbo.Users us INNER JOIN dbo.UserRole ur ON ur.[ID]=us.UserRole WHERE (us.[Name]=@Name) AND (us.[Password]=@Password) AND ur.[Name]=@UserRole)

		IF Exists (SELECT us.[ID] FROM dbo.Users us WHERE (us.[Name]=@Name) AND (us.[Password]=@Password))  

			BEGIN 
				--========================================
				--==验证通过返回 1
				--========================================
				SELECT @oPass=1

				--========================================
				--==记录在案（用户登录记录：0-登录，TargetID 这里没有意义，直接用 0 就可以了）
				--========================================
				EXEC dbo.SiteLogSave @Name, 0, 0
			END  
		Else
			BEGIN 
				--========================================
				--==验证没有通过返回 0
				--========================================
				SELECT @oPass=0 	
			END  

		--========================================
		--==返回该用户覆盖的角色列表
		--========================================
		SELECT @oUserRoles=COALESCE(@oUserRoles+N',',N'') + ur.[Name] FROM dbo.Users us INNER JOIN dbo.UserRole ur ON ur.[ID]=us.UserRole WHERE us.[Name]=@Name

		--========================================
		--==返回该用户出任斑竹的 Forum 列表
		--========================================
		SELECT @oModeratorForums=COALESCE(@oModeratorForums+N',',N'') + CONVERT(NVARCHAR(20),[ID]) FROM dbo.Forum WHERE dbo.UDF_UserModerator(@Name,[ID])=1

		--========================================
		--==返回该用户是否 Amin
		--========================================
		SELECT @oUserAdmin=dbo.UDF_UserAdmin(@Name)

		--========================================
		--==返回该用户是否 AminEditor
		--========================================
		SELECT @oUserAdminEditor=dbo.UDF_UserAdminEditor(@Name)

	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserAuthentication]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicQuery    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicQuery]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicQuery]
GO

--====================================================================================
--==这个 SP 的作用：根据给定线索，查询 Topic 列表
--==参数：所有检索线索作为参数，如果参数为NULL, 则该项不参与检索
--==建立分页机制，先将正常查询结果存入一个结构一样（但多了一个PagingID的表变量），根据PagingID，@PageSize，@CurrentPage选取当前页的记录，并将总页数作为一个追加栏位输出
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-24
--====================================================================================

CREATE PROCEDURE dbo.TopicQuery

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@Culture nvarchar(50),			--当前语种 （为了获取相应语种下的 TopicStatusCustomization<xxx> ）

@ForumID int,				--Forum 的 ID  （社区搜索是指定 Forum 内部的搜索，即只搜索本 Forum 内的内容）
@Keyword nvarchar(4000),		--搜索关键词
@KeywordFlag int,			--指定搜索的是主题标题还是跟帖内容，还是皆可。(1. 主题标题,  2.主题内容及跟帖,  3.皆可)
@UserName nvarchar(50),		--主题或跟帖用户名
@Online int,				--主题或跟贴用户是否在线 （1.在线  0. 不在）
@UserFlag int,				--指定搜索的是主题用户还是跟帖用户，还是皆可。 (1. 主题用户,  2.跟帖用户,  3.皆可)
@PostTimeFrom datetime,		--查询主题发帖起始时间
@PostTimeTo datetime,			--查询主题发帖结束时间
@TopicStatus INT,			--主题状态（1。空主题，2。实主题，3。热门主题，4。精华主题，5。违禁主题，6。置顶主题）

@PageSize INT,			--页码机制：每页的尺寸
@CurrentPage INT,			--页码机制：当前页
@OrderBy nvarchar(100),		--进行排序的列名
@OrderByOrder nvarchar(10)		--排序方式 ASC, DESC

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==参数的逃逸处理（仅在存在动态语句的地方使用） 
--=====================================================
SET @Culture=dbo.UDF_PublicStringEscape(@Culture)
SET @Keyword=dbo.UDF_PublicStringEscape(@Keyword)
SET @UserName=dbo.UDF_PublicStringEscape(@UserName)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================  
--==用户权限检查  （社区查询，肯定是指定 Forum 内的查询，就是说，你进入一个 Forum ，在该 Forum 范围内查询。我们只需要对指定 Forum 进行权限检查，后面的具体查询中就不必涉及权限了）
--=====================================================  
DECLARE @oPass INT  
EXEC dbo.TopicUserAuthenticationSelect @User,@ForumID,@oPass OUT  
IF @oPass=0 BEGIN RETURN END  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用来构建Where从句
--=====================================================
DECLARE @DynSQL NVARCHAR(4000)    
DECLARE @DynWhere NVARCHAR(4000)

--=====================================================
--==分 TaskList 和普通查询两种情形处理
--=====================================================
IF @TopicStatus=-1

	--=====================================================
	--==当 @TopicStatus 等于 -1 的时候，我们约定查询 TaskList
	--=====================================================

	BEGIN

		--=====================================================
		--==创建分页表 
		--=====================================================
		SET @DynSQL=N' SET NOCOUNT ON   '
		SET @DynSQL=@DynSQL + N' Declare @Paging table '
		SET @DynSQL=@DynSQL + N' ( '
		SET @DynSQL=@DynSQL + N' PagingID int identity(1,1), '
		SET @DynSQL=@DynSQL + N' [ID] int, '
		SET @DynSQL=@DynSQL + N' TopicUser nvarchar(50) COLLATE database_default,  '
		SET @DynSQL=@DynSQL + N' Online int, '
		SET @DynSQL=@DynSQL + N' Title nvarchar(200) COLLATE database_default, '
		SET @DynSQL=@DynSQL + N' Hit int, '
		SET @DynSQL=@DynSQL + N' AttachmentName nvarchar(2000) COLLATE database_default, '
		SET @DynSQL=@DynSQL + N' TopicStatus int,  '
		SET @DynSQL=@DynSQL + N' TopicStatusIconName nvarchar(50) COLLATE database_default, '
		SET @DynSQL=@DynSQL + N' TopicStatusDescription nvarchar(200) COLLATE database_default, '
		SET @DynSQL=@DynSQL + N' UpdateTime datetime,  '
		SET @DynSQL=@DynSQL + N' FollowUp int '

		SET @DynSQL=@DynSQL + N' ) '

		--=====================================================
		--==首先填充置顶贴
		--=====================================================
		SET @DynSQL=@DynSQL + N' Insert into @Paging '

		SET @DynSQL=@DynSQL + N' Select distinct   '  
		SET @DynSQL=@DynSQL + N' tp.[ID] as [ID], '
		SET @DynSQL=@DynSQL + N' tp.[User] as TopicUser, '
		SET @DynSQL=@DynSQL + N' dbo.UDF_PublicLoginOnline(tp.[User]) as Online, '
		SET @DynSQL=@DynSQL + N' tp.Title as Title, '
		SET @DynSQL=@DynSQL + N' tp.Hit as Hit, '
		SET @DynSQL=@DynSQL + N' tp.AttachmentName as AttachmentName, '
		SET @DynSQL=@DynSQL + N' ts.[ID] as TopicStatus, '
		SET @DynSQL=@DynSQL + N' ts.IconName as TopicStatusIconName, '
		--SET @DynSQL=@DynSQL + N' ts.Description as TopicStatusDescription, '
		SET @DynSQL=@DynSQL + N' dbo.UDF_TopicStatusDescription(' +  convert(nvarchar(20),@ForumID) + ',N'''  + @Culture +  ''',ts.[ID]) as TopicStatusDescription, '
		SET @DynSQL=@DynSQL + N' MAX(ISNULL(fu.PostTime,tp.PostTime)) as UpdateTime, '
		SET @DynSQL=@DynSQL + N' COUNT(fu.[ID]) as FollowUp '

		SET @DynSQL=@DynSQL + N' From dbo.Topic tp '
		SET @DynSQL=@DynSQL + N' Left Join dbo.FollowUp fu ON fu.TopicID=tp.[ID] '
		SET @DynSQL=@DynSQL + N' Inner Join dbo.TopicStatus ts ON ts.[ID]=tp.TopicStatus '
		SET @DynSQL=@DynSQL + N' Where tp.ForumID= ' + CONVERT(nvarchar(20),@ForumID) + N' And tp.TopicStatus=6 '

		SET @DynSQL=@DynSQL + N' group by tp.[ID], tp.[User], tp.Title, tp.Hit, tp.AttachmentName, ts.[ID], ts.IconName, ts.[Description] '
		SET @DynSQL=@DynSQL + N' order by UpdateTime DESC '

		--=====================================================
		--==如果存在置顶帖，则加一个间隔行（在业务逻辑那里，我们设计了一个 RowHighlightCriteria 机制，可以置顶一个字段名以及该字段的参考值，当该字段的记录值等于参考值的时候，那个记录所在的行加亮显示间隔 ）
		--=====================================================
		IF EXISTS (Select [ID] From dbo.Topic Where ForumID=@ForumID And TopicStatus=6)

		BEGIN

			SET @DynSQL=@DynSQL + N' Insert into @Paging '
	
			SET @DynSQL=@DynSQL + N' ( '
			SET @DynSQL=@DynSQL + N' [ID], '
			SET @DynSQL=@DynSQL + N' TopicUser,  '
			SET @DynSQL=@DynSQL + N' Online, '
			SET @DynSQL=@DynSQL + N' Title, '
			SET @DynSQL=@DynSQL + N' Hit, '
			SET @DynSQL=@DynSQL + N' AttachmentName, '
			SET @DynSQL=@DynSQL + N' TopicStatus,  '
			SET @DynSQL=@DynSQL + N' TopicStatusIconName, '
			SET @DynSQL=@DynSQL + N' TopicStatusDescription, '
			SET @DynSQL=@DynSQL + N' UpdateTime,  '
			SET @DynSQL=@DynSQL + N' FollowUp '
			SET @DynSQL=@DynSQL + N' ) '
	
			SET @DynSQL=@DynSQL + N' Values '
	
			SET @DynSQL=@DynSQL + N' ( '
			SET @DynSQL=@DynSQL + N' 0, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null '
			SET @DynSQL=@DynSQL + N' ) '

		END

		--=====================================================
		--==填充分页表 （非置顶贴）
		--=====================================================
		SET @DynSQL=@DynSQL + N' Insert into @Paging '

		SET @DynSQL=@DynSQL + N' Select distinct   '  
		SET @DynSQL=@DynSQL + N' tp.[ID] as [ID], '
		SET @DynSQL=@DynSQL + N' tp.[User] as TopicUser, '
		SET @DynSQL=@DynSQL + N' dbo.UDF_PublicLoginOnline(tp.[User]) as Online, '
		SET @DynSQL=@DynSQL + N' tp.Title as Title, '
		SET @DynSQL=@DynSQL + N' tp.Hit as Hit, '
		SET @DynSQL=@DynSQL + N' tp.AttachmentName as AttachmentName, '
		SET @DynSQL=@DynSQL + N' ts.[ID] as TopicStatus, '
		SET @DynSQL=@DynSQL + N' ts.IconName as TopicStatusIconName, '
		--SET @DynSQL=@DynSQL + N' ts.Description as TopicStatusDescription, '
		SET @DynSQL=@DynSQL + N' dbo.UDF_TopicStatusDescription(' +  convert(nvarchar(20),@ForumID) + ',N'''  + @Culture +  ''',ts.[ID]) as TopicStatusDescription, '
		SET @DynSQL=@DynSQL + N' MAX(ISNULL(fu.PostTime,tp.PostTime)) as UpdateTime, '
		SET @DynSQL=@DynSQL + N' COUNT(fu.[ID]) as FollowUp '

		SET @DynSQL=@DynSQL + N' From dbo.Topic tp '
		SET @DynSQL=@DynSQL + N' Left Join dbo.FollowUp fu ON fu.TopicID=tp.[ID] '
		SET @DynSQL=@DynSQL + N' Inner Join dbo.TopicStatus ts ON ts.[ID]=tp.TopicStatus '
		SET @DynSQL=@DynSQL + N' Where tp.ForumID= ' + CONVERT(nvarchar(20),@ForumID) + N' And tp.TopicStatus<>6 '

		--=====================================================
		--==系统管理员和斑竹可以看到所有状态的主题（包括违禁主题） ，而普通用户不能看到违禁主题（2010-11-21：该机制暂不使用）
		--=====================================================
		--IF dbo.UDF_UserAdmin(@User)<>1 AND dbo.UDF_UserModerator(@User,@ForumID)<>1
		--BEGIN
		--	SET @DynSQL=@DynSQL + N' And tp.TopicStatus<>5 '
		--END

		--===========================================================
		--==前面的 SQL 语句最后加  GROUP BY
		--===========================================================
		SET @DynSQL=@DynSQL + N' group by tp.[ID], tp.[User], tp.Title, tp.Hit, tp.AttachmentName, ts.[ID], ts.IconName, ts.[Description] '

		--=========================================================== 
		--==加上 Order By 从句
		--==如果 OrderBy='' 则，使用缺省 order by UpdateTime DESC
		--=========================================================== 
		SET @OrderBy=LTRIM(RTRIM(@OrderBy))
		SET @OrderByOrder=LTRIM(RTRIM(@OrderByOrder))
		
		IF LEN(@OrderBy)=0 OR  LEN(@OrderByOrder)=0
			BEGIN
			SET @DynSQL=@DynSQL + N' order by UpdateTime DESC '
			END
		ELSE
			BEGIN
			SET @DynSQL=@DynSQL + N' order by [' + @OrderBy + N'] ' + @OrderByOrder
		END

	END

ELSE

	--=====================================================
	--==对于普通查询情形，我们根据提供的查询条件一条一条地来
	--=====================================================

	BEGIN

		--=====================================================
		--==创建分页表 
		--=====================================================
		SET @DynSQL=N' SET NOCOUNT ON   '
		SET @DynSQL=@DynSQL + N' Declare @Paging table '
		SET @DynSQL=@DynSQL + N' ( '
		SET @DynSQL=@DynSQL + N' PagingID int identity(1,1), '
		SET @DynSQL=@DynSQL + N' [ID] int, '
		SET @DynSQL=@DynSQL + N' TopicUser nvarchar(50) COLLATE database_default,  '
		SET @DynSQL=@DynSQL + N' Online int, '
		SET @DynSQL=@DynSQL + N' Title nvarchar(200) COLLATE database_default, '
		SET @DynSQL=@DynSQL + N' Hit int, '
		SET @DynSQL=@DynSQL + N' AttachmentName nvarchar(2000) COLLATE database_default, '
		SET @DynSQL=@DynSQL + N' TopicStatus int,  '
		SET @DynSQL=@DynSQL + N' TopicStatusIconName nvarchar(50) COLLATE database_default, '
		SET @DynSQL=@DynSQL + N' TopicStatusDescription nvarchar(200) COLLATE database_default, '
		SET @DynSQL=@DynSQL + N' UpdateTime datetime,  '
		SET @DynSQL=@DynSQL + N' FollowUp int '

		SET @DynSQL=@DynSQL + N' ) '

		--=====================================================
		--==首先填充置顶贴
		--=====================================================
		SET @DynSQL=@DynSQL + N' Insert into @Paging '

		SET @DynSQL=@DynSQL + N' Select distinct   '  
		SET @DynSQL=@DynSQL + N' tp.[ID] as [ID], '
		SET @DynSQL=@DynSQL + N' tp.[User] as TopicUser, '
		SET @DynSQL=@DynSQL + N' dbo.UDF_PublicLoginOnline(tp.[User]) as Online, '
		SET @DynSQL=@DynSQL + N' tp.Title as Title, '
		SET @DynSQL=@DynSQL + N' tp.Hit as Hit, '
		SET @DynSQL=@DynSQL + N' tp.AttachmentName as AttachmentName, '
		SET @DynSQL=@DynSQL + N' ts.[ID] as TopicStatus, '
		SET @DynSQL=@DynSQL + N' ts.IconName as TopicStatusIconName, '
		SET @DynSQL=@DynSQL + N' dbo.UDF_TopicStatusDescription(' +  convert(nvarchar(20),@ForumID) + ',N'''  + @Culture +  ''',ts.[ID]) as TopicStatusDescription, '
		--SET @DynSQL=@DynSQL + N' ts.Description as TopicStatusDescription, '
		SET @DynSQL=@DynSQL + N' MAX(ISNULL(fu.PostTime,tp.PostTime)) as UpdateTime, '
		SET @DynSQL=@DynSQL + N' COUNT(fu.[ID]) as FollowUp '

		SET @DynSQL=@DynSQL + N' From dbo.Topic tp '
		SET @DynSQL=@DynSQL + N' Left Join dbo.FollowUp fu ON fu.TopicID=tp.[ID] '
		SET @DynSQL=@DynSQL + N' Inner Join dbo.TopicStatus ts ON ts.[ID]=tp.TopicStatus '
		SET @DynSQL=@DynSQL + N' Where tp.ForumID= ' + CONVERT(nvarchar(20),@ForumID) + N' And tp.TopicStatus=6 '	

		SET @DynSQL=@DynSQL + N' group by tp.[ID], tp.[User], tp.Title, tp.Hit, tp.AttachmentName, ts.[ID], ts.IconName, ts.Description '
		SET @DynSQL=@DynSQL + N' order by UpdateTime DESC '

		--=====================================================
		--==如果存在置顶帖，则加一个间隔行（在业务逻辑那里，我们设计了一个 RowHighlightCriteria 机制，可以置顶一个字段名以及该字段的参考值，当该字段的记录值等于参考值的时候，那个记录所在的行加亮显示间隔 ）
		--=====================================================
		IF EXISTS (Select [ID] From dbo.Topic Where ForumID=@ForumID And TopicStatus=6)

		BEGIN

			SET @DynSQL=@DynSQL + N' Insert into @Paging '
	
			SET @DynSQL=@DynSQL + N' ( '
			SET @DynSQL=@DynSQL + N' [ID], '
			SET @DynSQL=@DynSQL + N' TopicUser,  '
			SET @DynSQL=@DynSQL + N' Online, '
			SET @DynSQL=@DynSQL + N' Title, '
			SET @DynSQL=@DynSQL + N' Hit, '
			SET @DynSQL=@DynSQL + N' AttachmentName, '
			SET @DynSQL=@DynSQL + N' TopicStatus,  '
			SET @DynSQL=@DynSQL + N' TopicStatusIconName, '
			SET @DynSQL=@DynSQL + N' TopicStatusDescription, '
			SET @DynSQL=@DynSQL + N' UpdateTime,  '
			SET @DynSQL=@DynSQL + N' FollowUp '
			SET @DynSQL=@DynSQL + N' ) '
	
			SET @DynSQL=@DynSQL + N' Values '
	
			SET @DynSQL=@DynSQL + N' ( '
			SET @DynSQL=@DynSQL + N' 0, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null, '
			SET @DynSQL=@DynSQL + N' null '
			SET @DynSQL=@DynSQL + N' ) '

		END

		--=====================================================
		--==填充分页表 （非置顶贴）
		--=====================================================
		SET @DynSQL=@DynSQL + N' Insert into @Paging '

		SET @DynSQL=@DynSQL + N' Select distinct   '  
		SET @DynSQL=@DynSQL + N' tp.[ID] as [ID], '
		SET @DynSQL=@DynSQL + N' tp.[User] as TopicUser, '
		SET @DynSQL=@DynSQL + N' dbo.UDF_PublicLoginOnline(tp.[User]) as Online, '
		SET @DynSQL=@DynSQL + N' tp.Title as Title, '
		SET @DynSQL=@DynSQL + N' tp.Hit as Hit, '
		SET @DynSQL=@DynSQL + N' tp.AttachmentName as AttachmentName, '
		SET @DynSQL=@DynSQL + N' ts.[ID] as TopicStatus, '
		SET @DynSQL=@DynSQL + N' ts.IconName as TopicStatusIconName, '
		SET @DynSQL=@DynSQL + N' dbo.UDF_TopicStatusDescription(' +  convert(nvarchar(20),@ForumID) + ',N'''  + @Culture +  ''',ts.[ID]) as TopicStatusDescription, '
		--SET @DynSQL=@DynSQL + N' ts.Description as TopicStatusDescription, '
		SET @DynSQL=@DynSQL + N' MAX(ISNULL(fu.PostTime,tp.PostTime)) as UpdateTime, '
		SET @DynSQL=@DynSQL + N' COUNT(fu.[ID]) as FollowUp '

		SET @DynSQL=@DynSQL + N' From dbo.Topic tp '
		SET @DynSQL=@DynSQL + N' Left Join dbo.FollowUp fu ON fu.TopicID=tp.[ID] '
		SET @DynSQL=@DynSQL + N' Inner Join dbo.TopicStatus ts ON ts.[ID]=tp.TopicStatus '
		SET @DynSQL=@DynSQL + N' Where tp.ForumID= ' + CONVERT(nvarchar(20),@ForumID) + N' And tp.TopicStatus<>6 '	


		--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
		--=====================================================
		--==其它动态 WHERE 从句
		--=====================================================
		SET @DynWhere=N''
		
		--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
		--=====================================================
		--==@Keyword 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
		--==根据 @KeywordFlag 决定是从 tp.Title, tp.Content, fu.Content 还是全部中搜索
		--=====================================================
		IF @Keyword IS NOT NULL  
		BEGIN
			--=====================================================
			--==滤掉空格 (因为 @Keyword 可能为NULL,所以将滤除空格的操作放到这里)
			--=====================================================
			SET @Keyword=RTRIM(LTRIM(@Keyword)) 
		
			IF @Keyword<>N'' 
			BEGIN
				--=====================================================
				--==对 @KeywordFlag 分三种情形处理
				--=====================================================
				IF @KeywordFlag=1
		
					--=====================================================
					--==从 Title 中查询
					--=====================================================
					BEGIN
						SET @DynWhere=@DynWhere + N' and tp.Title like N''%' + @Keyword + N'%'' ' 
					END
		
				ELSE IF @KeywordFlag=2
		
					--=====================================================
					--==从 tp.Content 或 fu.Content 中查询
					--=====================================================
					BEGIN
						SET @DynWhere=@DynWhere + N' and (tp.Content like N''%' + @Keyword + N'%'' or fu.Content like N''%' + @Keyword + N'%'') ' 
					END
		
				ELSE
		
					--=====================================================
					--==从tp.Title 或 tp.Content 或 fu.Content 中查询
					--=====================================================
					BEGIN
						SET @DynWhere=@DynWhere + N' and (tp.Title like N''%' + @Keyword + N'%'' or tp.Content like N''%' + @Keyword + N'%'' or fu.Content like N''%' + @Keyword + N'%'') ' 
					END
			END
		END
		
		--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
		--=====================================================
		--==@UserName 统计线索（等于0或者空字符表示不参与统计限制）
		--==根据 @UserFlag 决定是从 Topic, FollowUp 还是二者中搜索
		--=====================================================
		IF @UserName IS NOT NULL  
		BEGIN
			--=====================================================
			--==滤掉空格 (因为 @User 可能为NULL,所以将滤除空格的操作放到这里)
			--=====================================================
			SET @UserName=RTRIM(LTRIM(@UserName)) 
		
			IF @UserName<>N'' 
			BEGIN
				--=====================================================
				--==对 @UserFlag 分三种情形处理
				--=====================================================
				IF @UserFlag=1
		
					--=====================================================
					--==从 Topic 中查询
					--=====================================================
					BEGIN
						SET @DynWhere=@DynWhere + N' and tp.[User] = N''' + @UserName + N''' ' 
					END
		
				ELSE IF @UserFlag=2
		
					--=====================================================
					--==从 FollowUp 中查询

					--=====================================================
					BEGIN
						SET @DynWhere=@DynWhere + N' and fu.[User] = N''' + @UserName + N''' ' 
					END
		
				ELSE
		
					--=====================================================
					--==从Topic 或 FollowUp 中查询
					--=====================================================
					BEGIN
						SET @DynWhere=@DynWhere + N' and (tp.[User] = N''' + @UserName + N''' or fu.[User] = N''' + @UserName + N''') ' 
					END
			END
		END
		
		--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
		--=====================================================
		--==@PostTimeFrom, @PostTimeTo  统计线索（等于0或者NULL表示不参与统计限制）
		--=====================================================
		IF @PostTimeFrom IS NOT NULL AND @PostTimeTo IS NOT NULL
		BEGIN
			set @DynWhere=@DynWhere + N' and tp.PostTime>=N''' + CONVERT(NVARCHAR(20),@PostTimeFrom) + N''' and tp.PostTime<=N''' + CONVERT(NVARCHAR(20),@PostTimeTo) + ''' '
		END
		
		--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
		--===========================================================
		--==@TopicStatus 统计线索（等于0或者NULL表示不参与统计限制）
		--===========================================================
		IF @TopicStatus IS NOT NULL AND @TopicStatus<>0
		BEGIN
			set @DynWhere=@DynWhere + N' and tp.TopicStatus=' + CONVERT(NVARCHAR(20),@TopicStatus) 
				
		END

		--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

		--=====================================================
		--==系统管理员和斑竹可以看到所有状态的主题（包括违禁主题） ，而普通用户不能看到违禁主题（2010-11-21：该机制暂不使用）
		--=====================================================
		--IF dbo.UDF_UserAdmin(@User)<>1 AND dbo.UDF_UserModerator(@User,@ForumID)<>1
		--BEGIN
		--	SET @DynSQL=@DynSQL + N' And tp.TopicStatus<>5 '
		--END
		
		--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
		--===========================================================
		--==前面的 SQL 语句最后加 其它动态 WHERE 从句 （@DynSQL 中已经包含 WHERE 1=1）
		--===========================================================

		SET @DynSQL=@DynSQL + @DynWhere
		
		--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
		--===========================================================
		--==前面的 SQL 语句最后加  GROUP BY
		--===========================================================
		SET @DynSQL=@DynSQL + N' group by tp.[ID], tp.[User], tp.Title, tp.Hit, tp.AttachmentName, ts.[ID], ts.IconName, ts.Description '
		
		--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

		--=====================================================
		--==加上 Order By 从句
		--==如果 OrderBy='' 则，使用缺省 order by UpdateTime DESC
		--=====================================================
		SET @OrderBy=LTRIM(RTRIM(@OrderBy))
		SET @OrderByOrder=LTRIM(RTRIM(@OrderByOrder))
		
		IF LEN(@OrderBy)=0 OR  LEN(@OrderByOrder)=0
			BEGIN
			SET @DynSQL=@DynSQL + N' order by UpdateTime DESC '
			END
		ELSE
			BEGIN
			SET @DynSQL=@DynSQL + N' order by [' + @OrderBy + N'] ' + @OrderByOrder
			END
		
		--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
--=====================================================
--==最后从 @Paging 表变量中获取数据
--=====================================================
Declare @FirstRecord int
Declare @LastRecord int
		
set @FirstRecord=(@CurrentPage - 1) * @PageSize	--当前页第一个记录前
set @LastRecord=(@CurrentPage * @PageSize + 1)	--当前页最后一个记录后
		
--=====================================================
--==总记录数，除以每页的记录数，用Ceiling()处理，得到的为页数 （注意：count(*)  和 @PageSize 都为 INT，它们相除将得到 INT，所以，首先要将它们转换成 Decimal(18,2)）
--=====================================================
set @DynSQL=@DynSQL + N' Select *,PageCount=CEILING (Convert(decimal(18,2),(select count(*) from @Paging)) / Convert(decimal(18,2),' + Convert(nvarchar(20),@PageSize) + N')) From @Paging Where PagingID>' + Convert(nvarchar(20),@FirstRecord) + N' and PagingID<' + Convert(nvarchar(20),@LastRecord)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--============================================
--==检查动态语句的长度，不可以超过系统上限
--============================================
DECLARE @oPassDynSQL INT
EXEC dbo.PublicDynSQLLengthCheck @DynSQL,@oPassDynSQL OUT
IF @oPassDynSQL=0 BEGIN RETURN END

--=====================================================
--==执行动态 SQL 语句， 开始统计
--=====================================================
EXEC(@DynSQL)
RETURN

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicQuery]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PublicDynSQLLengthCheck    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PublicDynSQLLengthCheck]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PublicDynSQLLengthCheck]
GO

--====================================================================================
--==在执行动态 SQL 语句之前，检查其长度，如果达到最长限度 NVARCHAR(4000) ，则报告错误
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28 
--====================================================================================

CREATE PROCEDURE dbo.PublicDynSQLLengthCheck

@DynSQL NVARCHAR(4000),			--动态 SQL 语句
@oPass INT OUT				--输出参数：长度没有超过，返回 1， 否则 0

AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--===============================================
--==长度超过系统上限，报告错误
--==注意：函数 LEN() 在计算字符串长度的时候，会将结尾的空格排除在外，在某些情况下，需要检查的字符串包含结尾的空格，如果将这些空格计算在内，则字符串长度达到 4000，然而用 LEN() 计算，却不够 4000，为了解决这个问题，我们使用 DATALENGTH() 函数代替
--===============================================
IF DATALENGTH(@DynSQL)>=8000

	BEGIN
		SET @oPass=0
		RAISERROR(N'刚才的任务过于庞大，超过了系统的上限。如果您正执行以下操作<li>搜索：您可能输入了过长的搜索线索。</li><li>其他操作：请联系系统管理员。</li>',16,1)
		RETURN
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PublicDynSQLLengthCheck]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicSelect    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicSelect]
GO

--====================================================================================
--==根据给定的 TopicID ，选取 Topic ，同时，将该 Topic  的 Hit 值++
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24 
--====================================================================================

CREATE PROCEDURE dbo.TopicSelect

@User nvarchar(50),	--从 ASPX 端传递过来的当前用户名

@TopicID INT		--指定的 Topic ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据 Topic ID 获得  Forum ID
--=====================================================
DECLARE @ForumID INT
SET @ForumID=dbo.UDF_GetForumIDFromTopicID(@TopicID)

--=====================================================  
--==用户权限检查
--=====================================================  
DECLARE @oPass INT  
EXEC dbo.TopicUserAuthenticationSelect @User,@ForumID,@oPass OUT  
IF @oPass=0 BEGIN RETURN END  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==下面将用到的一些变量
--=====================================================
/*
DECLARE @CurrentUser NVARCHAR(50)
SET @CurrentUser=dbo.UDF_UserCurrent()
*/

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==该 Topic Hit 值++
--=====================================================
UPDATE dbo.Topic SET Hit=Hit+1 WHERE [ID]=@TopicID

--=====================================================
--==选取指定的 Topic 记录
--=====================================================
SELECT

	frm.[ID] as ForumID,
	tps.NameC as TopicStatus,
	tps.[ID] as TopicStatusID,
	tps.IconName as IconName,
	tps.DescriptionC as DescriptionC,
	tp.[ID] as [ID],
	tp.[User] as [User],
	dbo.UDF_PublicLoginOnline(tp.[User]) as Online,
	tp.PostTime as PostTime,
	tp.Title as Title,
	tp.Content as Content,
	tp.AttachmentName as AttachmentName,
	tp.Hit as Hit,

	CanModify=
	CASE 
		WHEN LOWER(RTRIM(LTRIM(tp.[User])))=LOWER(RTRIM(LTRIM(@User))) THEN 1
		WHEN dbo.UDF_UserModerator(@User,@ForumID)=1 THEN 1
		WHEN dbo.UDF_UserAdmin(@User)=1 THEN 1
		ELSE 0
	END,

	CanSetStatus=
	CASE
		WHEN dbo.UDF_UserModerator(@User,@ForumID)=1 THEN 1
		WHEN dbo.UDF_UserAdmin(@User)=1 THEN 1
		ELSE 0
	END,

	CanMoveResource=
	CASE
		WHEN dbo.UDF_UserAdminEditor(@User)=1 THEN 1
		ELSE 0		
	END
	

FROM 	dbo.Topic tp 
INNER JOIN dbo.Forum frm ON frm.[ID]=tp.ForumID
INNER JOIN dbo.TopicStatus tps ON tps.[ID]=tp.TopicStatus

WHERE tp.[ID]=@TopicID

ORDER BY tp.PostTime DESC

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicSave    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicSave]
GO

--====================================================================================
--==保存 Topic
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-12-02 
--====================================================================================

CREATE PROCEDURE dbo.TopicSave

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@ForumID int,					--Forum 的 ID
@Title nvarchar(200),				--主题标题
@Content ntext,					--主题内容 （不限长文本）
@AttachmentName nvarchar(2000),		--主题发附件

@oNewID int OUT				--新记录的 ID ，输出参数

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.TopicUserAuthenticationSave @User,@ForumID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==当前用户，当前时间
--=====================================================
DECLARE @CurrentUser nvarchar(50)
DECLARE @CurrentTime nvarchar(50)

SET @CurrentUser=@User
SET @CurrentTime=GETDATE()

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加
--=====================================================
INSERT INTO dbo.Topic(ForumID,[User],PostTime,Title,Content,AttachmentName) VALUES(@ForumID,@CurrentUser,@CurrentTime,@Title,@Content,@AttachmentName)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==立即捕获刚刚保存的那条消息的 ID
--======================================================
SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（新增了帖子）
--=====================================================
EXEC dbo.SiteLogSave @User, 8, @oNewID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.FollowUpSelect    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FollowUpSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[FollowUpSelect]
GO

--====================================================================================
--==根据给定的 TopicID ，选取 Topic 项下的跟帖
--==如果 @TopicID 是正数，则选取该 TopicID 下所有跟帖；如果是负数，则，取其绝对值为 FollowUp.ID 用，选取单独的 FollowUp 记录
--==同时返回当前 FollowUp 是否可以被当前用户修改（修改，删除）：用户自己可以修改自己的跟贴；版主可以修改所有跟贴；Admin 用户可以修改所有跟贴
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-24 
--====================================================================================

CREATE PROCEDURE dbo.FollowUpSelect

@User nvarchar(50),	--从 ASPX 端传递过来的当前用户名

@TopicID INT		--指定的 Topic ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.FollowUpUserAuthenticationSelect @User,@TopicID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

IF @TopicID>=0

	BEGIN
		--=====================================================
		--==选取指定的 Topic 记录下的所有 FollowUp
		--=====================================================
		SELECT
			
			fu.TopicID as TopicID,
			fu.[ID] as [ID],
			fu.[User] as [User],
			dbo.UDF_PublicLoginOnline(fu.[User]) as Online,
			fu.PostTime as PostTime,
			fu.Content as Content,
			fu.AttachmentName as AttachmentName,

			CanModify=
			CASE 
				WHEN LOWER(RTRIM(LTRIM(fu.[User])))=LOWER(RTRIM(LTRIM(@User))) THEN 1
				WHEN dbo.UDF_UserModerator(@User,dbo.UDF_GetForumIDFromTopicID(fu.TopicID))=1 THEN 1
				WHEN dbo.UDF_UserAdmin(@User)=1 THEN 1
				ELSE 0
			END
		
		FROM 	dbo.FollowUp fu
		
		WHERE fu.TopicID=@TopicID

		ORDER BY fu.PostTime ASC
	END

ELSE
	BEGIN
		--=====================================================
		--==将 TopicID 的绝对值当作 FollowUpID 看待，选取单个 FollowUp 记录
		--=====================================================
		SELECT
		
			fu.TopicID as TopicID,
			fu.[ID] as [ID],
			fu.[User] as [User],
			dbo.UDF_PublicLoginOnline(fu.[User]) as Online,
			fu.PostTime as PostTime,
			fu.Content as Content,
			fu.AttachmentName as AttachmentName,

			CanModify=
			CASE 
				WHEN LOWER(RTRIM(LTRIM(fu.[User])))=LOWER(RTRIM(LTRIM(@User))) THEN 1
				WHEN dbo.UDF_UserModerator(@User,dbo.UDF_GetForumIDFromTopicID(fu.TopicID))=1 THEN 1
				WHEN dbo.UDF_UserAdmin(@User)=1 THEN 1
				ELSE 0
			END	
	
		
		FROM 	dbo.FollowUp fu
		
		WHERE fu.[ID]=ABS(@TopicID)

		ORDER BY fu.PostTime ASC
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[FollowUpSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.FollowUpSave    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FollowUpSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[FollowUpSave]
GO

--====================================================================================
--==保存 FollowUp
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-12-02
--====================================================================================

CREATE PROCEDURE dbo.FollowUpSave

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@TopicID int,					--主题的 ID
@Content ntext,					--跟帖内容
@AttachmentName nvarchar(2000)		--跟贴的附件

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.FollowUpUserAuthenticationSave @User,@TopicID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==当前用户，当前时间
--=====================================================
DECLARE @CurrentUser nvarchar(50)
DECLARE @CurrentTime nvarchar(50)

SET @CurrentUser=@User
SET @CurrentTime=GETDATE()

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加
--=====================================================
INSERT INTO dbo.FollowUp(TopicID,[User],PostTime,Content,AttachmentName) VALUES(@TopicID,@CurrentUser,@CurrentTime,@Content,@AttachmentName)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==删除了跟帖后，检查当前 Topic 下的跟帖总数目，根据跟帖总数目设置主题状态 （空主题，实主题，热门主题）
--=====================================================
EXEC dbo.TopicStatusSet @TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（在 @TopicID 下添加了跟帖）
--=====================================================
EXEC dbo.SiteLogSave @User, 9, @TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[FollowUpSave]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.FollowUpModify    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FollowUpModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[FollowUpModify]
GO

--====================================================================================
--==修改 FollowUp
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-12-02
--====================================================================================

CREATE PROCEDURE dbo.FollowUpModify

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@FollowUpID int,				--跟帖的 ID
@Content ntext,					--跟帖内容
@AttachmentName nvarchar(2000)		--跟贴的附件

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.FollowUpUserAuthenticationModify @User,@FollowUpID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==修改
--=====================================================
UPDATE dbo.FollowUp SET

	Content=@Content, 
	AttachmentName=@AttachmentName

WHERE [ID]=@FollowUpID


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据 FollowUp ID 获得 TopicID
--=====================================================
DECLARE @TopicID INT
SET @TopicID=dbo.UDF_GetTopicIDFromFollowUpID(@FollowUpID)

--=====================================================
--==将当前活动记录在案（修改 @TopicID 下的跟帖）
--=====================================================
EXEC dbo.SiteLogSave @User, 15, @TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[FollowUpModify]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.FollowUpUserAuthenticationModify    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FollowUpUserAuthenticationModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[FollowUpUserAuthenticationModify]
GO

--====================================================================================
--==检查当前用户针对修改指定跟帖的权限
--==跟贴原作者，版主，系统管理员拥有权限
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-24 
--====================================================================================

CREATE PROCEDURE dbo.FollowUpUserAuthenticationModify

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@FollowUpID INT,		--指定的 FollowUp 的 ID
@oPass INT OUT		--输出参数：通过返回 1，否则 0

AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--==========================================
--==先假设 检查通过
--==========================================
SET @oPass=1

--==========================================
--==当前用户和指定 FollowUp 的 用户
--==========================================
DECLARE @CurrentUser NVARCHAR(50)
DECLARE @ThisUser NVARCHAR(50)

SET @CurrentUser=@User
SET @ThisUser=(Select [User] From dbo.FollowUp Where [ID]=@FollowUpID)

--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
--xx对于修改操作，任何用户“只能” 修改自己的数据（系统管理员和斑竹除外）
--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
IF @CurrentUser<>@ThisUser AND dbo.UDF_UserAdmin(@CurrentUser)<>1 AND dbo.UDF_UserModerator(@CurrentUser,dbo.UDF_GetForumIDFromFollowUpID(@FollowUpID))<>1

BEGIN
	SET @oPass=0
	RAISERROR(N'该跟贴的作者为 %s ，用户 %s 无权删除。',16,1,@ThisUser,@CurrentUser)
	RETURN
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[FollowUpUserAuthenticationModify]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicUserAuthenticationModify    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicUserAuthenticationModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicUserAuthenticationModify]
GO

--====================================================================================
--==检查当前用户针对修改指定主题的权限
--==原帖作者，系统管理员和版主有权对帖子进行修改
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24 
--====================================================================================

CREATE PROCEDURE dbo.TopicUserAuthenticationModify

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@TopicID INT,			--指定的 Topic 的 ID
@oPass INT OUT		--输出参数：通过返回 1，否则 0

AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--==========================================
--==先假设 检查通过
--==========================================
SET @oPass=1

--==========================================
--==当前用户和指定 Topic 的 用户
--==========================================
DECLARE @CurrentUser NVARCHAR(50)
DECLARE @ThisUser NVARCHAR(50)

SET @CurrentUser=@User
SET @ThisUser=(Select [User] From dbo.Topic Where [ID]=@TopicID)

--==========================================
--==根据 @TopicID 获得 ForumID
--==========================================
DECLARE @ForumID INT
SELECT @ForumID=dbo.UDF_GetForumIDFromTopicID(@TopicID)

--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
--xx对于修改操作，任何用户“只能” 修改自己的数据（系统管理员和斑竹除外）
--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
IF @CurrentUser<>@ThisUser AND dbo.UDF_UserAdmin(@CurrentUser)<>1 AND dbo.UDF_UserModerator(@CurrentUser,@ForumID)<>1
BEGIN
	SET @oPass=0
	RAISERROR(N'该帖的原作者为 %s ，您未被授权进行修改。只有原帖作者，系统管理员和版主才有权修改。',16,1,@ThisUser)
	RETURN
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicUserAuthenticationModify]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicModify    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicModify]
GO

--====================================================================================
--==修改 Topic
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-12-02 
--====================================================================================

CREATE PROCEDURE dbo.TopicModify

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@TopicID int,					--主题的 ID
@Title nvarchar(200),				--主题标题
@Content ntext,					--主题内容
@AttachmentName nvarchar(2000)		--主题的附件

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.TopicUserAuthenticationModify @User,@TopicID,@oPass OUT
IF @oPass=0 BEGIN RETURN END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==修改
--=====================================================
UPDATE dbo.Topic

SET 
	Title=@Title,
	Content=@Content,
	AttachmentName=@AttachmentName

WHERE [ID]=@TopicID


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（修改了帖子）
--=====================================================
EXEC dbo.SiteLogSave @User, 14, @TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicModify]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicDelete    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicDelete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicDelete]
GO

--====================================================================================
--==删除 Topic
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-12-02
--====================================================================================

CREATE PROCEDURE dbo.TopicDelete

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@TopicID int			--主题的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.TopicUserAuthenticationDelete @User,@TopicID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==删除
--=====================================================
DELETE FROM dbo.Topic WHERE [ID]=@TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（删除了帖子）
--=====================================================
EXEC dbo.SiteLogSave @User, 21, @TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicDelete]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.FollowUpDelete    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FollowUpDelete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[FollowUpDelete]
GO

--====================================================================================
--==删除 FollowUp
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-12-02
--====================================================================================

CREATE PROCEDURE dbo.FollowUpDelete

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@FollowUpID int			--跟帖的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.FollowUpUserAuthenticationDelete @User,@FollowUpID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==删除
--=====================================================
DELETE FROM dbo.FollowUp WHERE [ID]=@FollowUpID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据 FollowUp ID 获得 TopicID
--=====================================================
DECLARE @TopicID INT
SET @TopicID=dbo.UDF_GetTopicIDFromFollowUpID(@FollowUpID)

--=====================================================
--==删除了跟帖后，检查当前 Topic 下的跟帖总数目，根据跟帖总数目设置主题状态 （空主题，实主题，热门主题）
--=====================================================
EXEC dbo.TopicStatusSet @TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==最后，我们将当前的 Activity 记录在案 （删除 @TopicID 下的跟帖）
--=====================================================
EXEC dbo.SiteLogSave @User,22,@TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[FollowUpDelete]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicStatusSet    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicStatusSet]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicStatusSet]
GO

--====================================================================================
--==由系统根据跟帖数量自动设置 Topic Status
--==TopicStatus 中前三个 Status （尚无跟帖，已有跟帖，热门主题）由系统根据跟帖数量自动设置，最后三个 Status （精华主题，禁忌主题，置顶主题）人工设置
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24
--====================================================================================

CREATE PROCEDURE dbo.TopicStatusSet

@TopicID int			--主题的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查（因为该 SP 所谓的设置 TopicStatus 是一些安全的，毫无敏感内容的设置，就是设置帖子的 “空主题”， “非空主题”， “热门主题” 这样一些非主观 Status ，自然不需要权限检查，而 TopicStatusSetElite, TopicStatusSetTaboo, TopicStatusSetSticky, TopicStatusRevoke  则需要）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==首先获得当前 Topic 下的跟帖数量，根据这个数量决定该 Topic 的  Status
--=====================================================
DECLARE @TopicStatus INT

SET @TopicStatus=
(
	Select 
		Case 
			When Count([ID]) IS NULL Then 1 			--空主题
			When Count([ID])<1 Then 1				--空主题
			When Count([ID])>=1 And Count([ID])<10 Then 2		--非空主题
			When Count([ID])>=10 Then 3				--热门主题
		 End 

		From dbo.FollowUp Where TopicID=@TopicID
)

--=====================================================
--==设置（注意：要排除 TopicStatus=4/5/6 三种情形）
--=====================================================
UPDATE dbo.Topic SET TopicStatus=@TopicStatus WHERE [ID]=@TopicID AND TopicStatus NOT IN (4,5,6)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicStatusSet]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicUserAuthenticationSetStatus    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicUserAuthenticationSetStatus]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicUserAuthenticationSetStatus]
GO

--====================================================================================
--==检查当前用户针对修改指定主题 Status 的权限
--==主题的作者，斑竹和系统管理员都可以修改某个主题，然而只有斑竹和系统管理员才可以将某个帖子设置为 Elite 或 Taboo，主题的作者也没有这个权限
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24
--====================================================================================

CREATE PROCEDURE dbo.TopicUserAuthenticationSetStatus

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@TopicID INT,			--指定的 Topic 的 ID

@oPass INT OUT		--输出参数：通过返回 1，否则 0

AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--==========================================
--==先假设 检查通过
--==========================================
SET @oPass=1

--==========================================
--==根据 @TopicID 获得 ForumID
--==========================================
DECLARE @ForumID INT
SELECT @ForumID=dbo.UDF_GetForumIDFromTopicID(@TopicID)

--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
--xx对于 SetElite, SetTaboo 操作（将 Topic 的 Status 设置为精华或违禁主题），只有系统管理员和斑竹才有权限
--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
IF dbo.UDF_UserAdmin(@User)<>1 AND dbo.UDF_UserModerator(@User,@ForumID)<>1

BEGIN
	SET @oPass=0
	RAISERROR(N'很抱歉，您不是系统管理员或版主，不能设置帖子状态。',16,1)
	RETURN
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicUserAuthenticationSetStatus]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicUserAuthenticationDelete    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicUserAuthenticationDelete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicUserAuthenticationDelete]
GO

--====================================================================================
--==检查当前用户针对删除指定主题的权限
--==一个主题的作者可以删除自己的主题，前提是该主题还没有跟帖，一旦有了跟帖，该主题只能由系统管理员和斑竹删除
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24 
--====================================================================================

CREATE PROCEDURE dbo.TopicUserAuthenticationDelete

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@TopicID INT,			--指定的 Topic 的 ID
@oPass INT OUT		--输出参数：通过返回 1，否则 0

AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--==========================================
--==先假设 检查通过
--==========================================
SET @oPass=1

--==========================================
--==当前用户和指定 Topic 的 用户
--==========================================
DECLARE @CurrentUser NVARCHAR(50)
DECLARE @ThisUser NVARCHAR(50)

SET @CurrentUser=@User
SET @ThisUser=(Select [User] From dbo.Topic Where [ID]=@TopicID)

--==========================================
--==根据 @TopicID 获得 ForumID
--==========================================
DECLARE @ForumID INT
SELECT @ForumID=dbo.UDF_GetForumIDFromTopicID(@TopicID)

--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
--xx首先，对于修改操作，任何用户“只能” 修改自己的数据（系统管理员和斑竹除外）
--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
IF @CurrentUser<>@ThisUser AND dbo.UDF_UserAdmin(@CurrentUser)<>1 AND dbo.UDF_UserModerator(@CurrentUser,@ForumID)<>1

BEGIN
	SET @oPass=0
	RAISERROR(N'非常抱歉，您未被授权对本帖进行删除操作。',16,1)
	RETURN
END

--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
--==其次，检查该主题下面是否已经有跟帖，如果有，则作者本人不能删除，但系统管理员可以删除
--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
IF EXISTS (Select [ID] From dbo.FollowUp Where TopicID=@TopicID)

BEGIN
	--==============================================
	--==检查当前用户角色，如果不是系统管理员或者斑竹，则不可以删除
	--==============================================
	IF dbo.UDF_UserAdmin(@CurrentUser)<>1 AND dbo.UDF_UserModerator(@CurrentUser,@ForumID)<>1

	BEGIN
		SET @oPass=0
		RAISERROR(N'非常抱歉，尽管您是本帖的作者，但本帖已经有跟贴，在这种情况下，您不可以进行删除操作。<br/>请联系系统管理员或版主处理。<br/>谢谢。',16,1)
		RETURN
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicUserAuthenticationDelete]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.FollowUpUserAuthenticationDelete    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FollowUpUserAuthenticationDelete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[FollowUpUserAuthenticationDelete]
GO

--====================================================================================
--==检查当前用户针对删除指定跟帖的权限
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-24 
--====================================================================================

CREATE PROCEDURE dbo.FollowUpUserAuthenticationDelete

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@FollowUpID INT,		--指定的 FollowUp 的 ID
@oPass INT OUT		--输出参数：通过返回 1，否则 0

AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--==========================================
--==先假设 检查通过
--==========================================
SET @oPass=1

--==========================================
--==当前用户和指定 FollowUp 的 用户
--==========================================
DECLARE @CurrentUser NVARCHAR(50)
DECLARE @ThisUser NVARCHAR(50)

SET @CurrentUser=@User
SET @ThisUser=(Select [User] From dbo.FollowUp Where [ID]=@FollowUpID)

--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
--xx对于修改操作，任何用户“只能” 删除自己的数据（系统管理员和斑竹除外）
--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
IF @CurrentUser<>@ThisUser AND dbo.UDF_UserAdmin(@CurrentUser)<>1 AND dbo.UDF_UserModerator(@CurrentUser,dbo.UDF_GetForumIDFromFollowUpID(@FollowUpID))<>1

BEGIN
	SET @oPass=0
	RAISERROR(N'该跟贴的作者是 %s ，用户 %s 无权删除。',16,1,@ThisUser,@CurrentUser)
	RETURN
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[FollowUpUserAuthenticationDelete]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PublicDictionaryItemList    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PublicDictionaryItemList]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PublicDictionaryItemList]
GO

--====================================================================================
--==用于 BL 中的 PopulateSelectBox() 
--==从某个字典中提取所有条目
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28 
--====================================================================================

CREATE PROCEDURE dbo.PublicDictionaryItemList

@DictionaryType nvarchar(50),		--字典类别
@ColumnName nvarchar(100),		--将用来作为SlectBox的 Option 的列  (列名最多100字符)
@ValueColumnName nvarchar(100)	--将用来作为SelectBox中 Option Value 的列

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--================================================
--==消除对结果的影响
--================================================
SET NOCOUNT ON

--================================================
--==动态SQL语句
--================================================
DECLARE @DynSQL NVARCHAR(4000)

--================================================
--==开始
--================================================
SET @DynSQL = N' SET NOCOUNT ON '
SET @DynSQL = @DynSQL + N' SELECT DISTINCT '
SET @DynSQL = @DynSQL + N' dt.' + @ValueColumnName + N' AS ' + @ValueColumnName + N', ' 
SET @DynSQL = @DynSQL + N' dt.' + @ColumnName + N' AS ' + @ColumnName + N' '

SET @DynSQL = @DynSQL + N' FROM dbo.' + @DictionaryType + N' dt '

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=======================================
--==开始执行动态语句
--=======================================
EXEC(@DynSQL)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PublicDictionaryItemList]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PublicDictionaryItemListByParentFilter    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PublicDictionaryItemListByParentFilter]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PublicDictionaryItemListByParentFilter]
GO

--====================================================================================
--==用于 BL 中的PopulateHierarchicalSelectBox()
--==将字典中的项目按照给出的父字典过滤定义，返回符合条件的条目
--==父字典过滤定义参数： 直接构造 WHERE 语句
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28 
--====================================================================================

CREATE PROCEDURE dbo.PublicDictionaryItemListByParentFilter

@DictionaryType nvarchar(50),		--字典类别 （Color,Goods等等等）
@ColumnName nvarchar(100),		--将用来作为SlectBox的 Option 的列  (列名最多100字符)
@ValueColumnName nvarchar(100),	--将用来作为SelectBox中 Option Value的列
@ParentFilter nvarchar(100)		--例如： where GoodsColorSize.GoodsID=123 

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--================================================
--==消除对结果的影响
--================================================
SET NOCOUNT ON

--=======================================
--==动态SQL语句
--=======================================
DECLARE @DynSQL NVARCHAR(4000)

--=======================================
--==开始
--=======================================
SET @DynSQL = N' SET NOCOUNT ON '
SET @DynSQL = @DynSQL + N' SELECT DISTINCT ' 
SET @DynSQL = @DynSQL + N' dt.' + @ValueColumnName + N' AS ' + @ValueColumnName + N',' 
SET @DynSQL = @DynSQL + N' dt.' + @ColumnName + N' AS ' + @ColumnName + N' ' 

SET @DynSQL = @DynSQL + N' FROM dbo.' + @DictionaryType + N' dt '

--=======================================
--==父字典限定
--=======================================
IF RTRIM(LTRIM(@ParentFilter))<>N''
BEGIN
	SET @DynSQL = @DynSQL + N' WHERE ' + @ParentFilter + N' '
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=======================================
--==开始执行动态语句
--=======================================
EXEC(@DynSQL)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PublicDictionaryItemListByParentFilter]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicStatusSetTaboo    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicStatusSetTaboo]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicStatusSetTaboo]
GO

--====================================================================================
--==将某个主题设置为违禁主题
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-12-02 
--====================================================================================

CREATE PROCEDURE dbo.TopicStatusSetTaboo

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@TopicID int			--主题的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查（只有系统管理员和斑竹才有权限封锁一个主题）
--=====================================================
DECLARE @oPass INT
EXEC dbo.TopicUserAuthenticationSetStatus @User,@TopicID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==设置
--=====================================================
UPDATE dbo.Topic SET TopicStatus=5 WHERE [ID]=@TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（修改了帖子）
--=====================================================
EXEC dbo.SiteLogSave @User, 14, @TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicStatusSetTaboo]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicStatusSetElite    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicStatusSetElite]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicStatusSetElite]
GO

--====================================================================================
--==将某个主题设置为精华主题
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-12-02 
--====================================================================================

CREATE PROCEDURE dbo.TopicStatusSetElite

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@TopicID int			--主题的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查（只有系统管理员和斑竹才有权限设置一个主题为精华）
--=====================================================
DECLARE @oPass INT
EXEC dbo.TopicUserAuthenticationSetStatus @User,@TopicID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==设置
--=====================================================
UPDATE dbo.Topic SET TopicStatus=4 WHERE [ID]=@TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（修改了帖子）
--=====================================================
EXEC dbo.SiteLogSave @User, 14, @TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicStatusSetElite]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserRoleSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserRoleSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserRoleSelect]
GO

--====================================================================================
--==返回所有 UserRole
--====================================================================================
--==版权所有 2001-2005 ComSharp
--==最新修改 2005-02-18 
--====================================================================================

CREATE PROCEDURE dbo.UserRoleSelect

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

SELECT 
	[ID],
	[Name],
	NameC

FROM dbo.UserRole ORDER BY [ID]

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserRoleSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserAccountSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserAccountSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserAccountSelect]
GO

--====================================================================================
--==从 Users 表获得用户的基本资料
--==用在 UI.Admin.Account.UserAccountUI.cs
--==如果提供了合法的用户名参数，则，只选择该用户，并且要进行权限检查
--==如果提供的用户名参数为空，则选择全部用户，且不用进行权限检查，这种情形仅用于系统数据库恢复时，在这个时候，我们使用的是 BuiltInConnectionString 所使用的用户帐号执行操作
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.UserAccountSelect 

 @Name nvarchar(50)			--用户名

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查（不需要）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================
--==如果给出的用户名合法（非空），则获得该用户的 Profile （实现要检查权限）
--==如果给出的用户名非法（空），则，获得所有用户的 Profile （不必进行权限检查）
--=====================================================
IF LEN(LTRIM(RTRIM(@Name)))>0

	BEGIN

		--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

		SELECT TOP 1
			[Name],
			[Password],
			ISNULL(FirstName,N'') AS FirstName,
			ISNULL(LastName,N'') AS LastName,
			ISNULL(Tel,N'') AS Tel,
			ISNULL(Email,N'') AS Email,
			ISNULL(Mobile,N'') AS Mobile,
			ISNULL(Fax,N'') AS Fax,
			ISNULL(MSN,N'') AS MSN,
			ISNULL(Skype,N'') AS Skype,
			ISNULL(Twitter,N'') AS Twitter,
			ISNULL(QQ,N'') AS QQ,
			ISNULL(Address,N'') AS Address,
			Sex,
			ISNULL(Organization,N'') AS Organization,
			ISNULL([Position],N'') AS [Position],
			ISNULL(Rank,1000000) AS Rank,
			ISNULL(PortraitName,N'') AS PortraitName,
			ISNULL(Remark,N'') AS Remark,
			RegisterDate AS RegisterDate,
			dbo.UDF_UserRoleJoin([Name]) AS UserRoles,
			--IsClient AS IsClient,	//CANCEL
			dbo.UDF_PublicLoginOnline([Name]) AS Online

		FROM dbo.Users

		WHERE [Name]=@Name

		--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
	END
ELSE

	BEGIN

		--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

		SELECT DISTINCT
			[Name],
			[Password],
			ISNULL(FirstName,N'') AS FirstName,
			ISNULL(LastName,N'') AS LastName,
			ISNULL(Tel,N'') AS Tel,
			ISNULL(Email,N'') AS Email,
			ISNULL(Mobile,N'') AS Mobile,
			ISNULL(Fax,N'') AS Fax,
			ISNULL(MSN,N'') AS MSN,
			ISNULL(Skype,N'') AS Skype,
			ISNULL(Twitter,N'') AS Twitter,
			ISNULL(QQ,N'') AS QQ,
			ISNULL(Address,N'') AS Address,
			Sex,
			ISNULL(Organization,N'') AS Organization,
			ISNULL([Position],N'') AS [Position],
			ISNULL(Rank,1000000) AS Rank,
			ISNULL(PortraitName,N'') AS PortraitName,
			ISNULL(Remark,N'') AS Remark,
			RegisterDate AS RegisterDate,
			dbo.UDF_UserRoleJoin([Name]) AS UserRoles,
			--IsClient AS IsClient,	//CANCEL
			dbo.UDF_PublicLoginOnline([Name]) AS Online

		FROM dbo.Users

		--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
	END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserAccountSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserAccountSave    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserAccountSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserAccountSave]
GO

--====================================================================================
--==保存用户账号
--==首先检查当前用户是否已经存在，如果存在，则先删除，再创建 Login, User
--==将该创建用户的资料写入 Users 表
--==如果 @Silent=1 ，表示即将进行的是整个数据库恢复，需要重新建立整个用户系统，这种情形下，我们使用的是 BuiltInConnectionString 中的用户账号，我们不需要检查这个用户的权限 (CANCEL)
--==在安静模式， OverWrite 肯定等于 1 （就是说，添加用户不可能是安静模式）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24 
--====================================================================================

CREATE PROCEDURE dbo.UserAccountSave

@User nvarchar(50),					--从 ASPX 端传递过来的当前用户名

@Name nvarchar(50),					--用户名
@Password nvarchar(20),				--密码原文，可用来帮助判断密码是否为空（因为即使空密码生成的 @EncryptedPassword 长度也大于0  ） （最大长度 20）
@EncryptedPassword nvarchar(200),			--密码的加密形式，这个密码将保存在 Users 表，在 Login 的时候，将用来同登录密码对照 （最大长度 200）
@IgnorePassword int,					--在修改模式，我们使用了一个 checkbox，告诉系统忽略密码（有时候并不想改密码）（1/2）
@FirstName nvarchar(50),				--姓
@LastName nvarchar(50),				--名
@Tel nvarchar(50),					--电话
@Email nvarchar(100),					--电子邮件
@Mobile nvarchar(50),					--移动电话
@Fax nvarchar(50),					--传真
@MSN nvarchar(100),					--MSN
@Skype nvarchar(100),					--Skype
@Twitter nvarchar(100),					--Twitter
@QQ nvarchar(100),					--QQ
@Address nvarchar(200),				--Address
@Sex int,						--性别
@Organization nvarchar(200),				--组合
@Position nvarchar(100),				--职位
@Rank int,						--等级
@PortraitName nvarchar(1000),				--头像逻辑路径（ /Writable/UserAccountPortrait/<GUID>/PortraitName）
@Remark nvarchar(1000),				--备注
@UserGroups nvarchar(4000),				--用户所属组列表 （注意：在保存组成员的时候，我们没敢使用列表字符串，因为一个组内的用户累计起来可能超过4000字符，而一个用户所属组累计起来不太可能超过4000字符）
@UserRoles nvarchar(4000),				--1,2, ... 格式

@OverWrite INT					--等于 1  的话，则，用户存在，就覆盖（用于修改状态）； 等于 0 的话，如果用户存在，举错（用于添加状态）

AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================

IF dbo.UDF_UserAdmin(@User)<>1

BEGIN
	RAISERROR(N'您的权限不允许进行帐号修改和创建操作。',16,1)
	RETURN
END

--=====================================================
--==参数清洁
--=====================================================
SET @Name=LTRIM(RTRIM(@Name))
SET @Password=LTRIM(RTRIM(@Password))
SET @EncryptedPassword=LTRIM(RTRIM(@EncryptedPassword))
SET @UserRoles=LTRIM(RTRIM(@UserRoles))

--=====================================================
--==参数检查
--=====================================================
IF ((@Name=N'') OR (@Name IS NULL) OR (@Password=N'') OR (@Password IS NULL) OR (@EncryptedPassword=N'') OR (@EncryptedPassword IS NULL) OR (@UserRoles=N'') OR (@UserRoles IS NULL)) AND @IgnorePassword<>1
BEGIN
	RAISERROR(N'用户名，密码，不能为空；同时，用户应至少有一个角色。',16,1)
	RETURN
END

--=====================================================
--==如果用户已经存在，且当前是添加模式（@OverWrite=0），则举错
--=====================================================
IF (dbo.UDF_PublicProfileExists(@Name)=1) AND (@OverWrite=0)
BEGIN
	RAISERROR(N'该用户已经存在。',16,1)
	RETURN
END

--=====================================================
--==如果忽略密码（@IgnorePassword=1），则，说明从修改界面那里并没有 Password 传递过来，我们需要先从 Users 表获取该用户的 Password
--=====================================================
IF  @IgnorePassword=1
BEGIN
	SELECT @EncryptedPassword=[Password] FROM dbo.Users WHERE [Name]=@Name
END

--=====================================================
--==首先删除该用户以前在 Users  表中的逻辑存在
--=====================================================
DELETE FROM dbo.Users WHERE [Name]=@Name

--=====================================================
--==如果是修改模式，我们先将 UserForums 中该用户的存在记录删除 （2010-11-24：UserForums 机制已经停用）
--=====================================================
/*
IF @OverWrite=1
BEGIN
	DELETE FROM dbo.UserForums WHERE [User]=@Name
END
*/

--=====================================================
--==为了让写入 users 表达用户的所有 Instances  都拥有一致的时间，我们这里统一缓存当前时间（否则，同一 users 表中同一用户的不同 Instance 的注册时间可能有毫秒级差别，导致 UserAccountQuery 选择出重复的 User 记录）
--=====================================================
DECLARE @RegisterDate datetime
SET @RegisterDate=GETDATE()

--=====================================================
--==本地变量
--=====================================================
DECLARE @UserRole INT 		

--=====================================================
--==设计一个 Cursor ，遍历由 dbo.UDF_PublicSplit( @UserRoles,',') 而获得代表 UserRole 的字符串单元
--=====================================================
DECLARE CursorUserRole CURSOR FOR SELECT Element FROM dbo.UDF_PublicSplit(@UserRoles,N',') FOR READ ONLY
OPEN CursorUserRole

FETCH NEXT FROM CursorUserRole INTO @UserRole
WHILE @@FETCH_STATUS=0
BEGIN

	--=====================================================
	--==保存到 Users 表
	--=====================================================
	INSERT INTO dbo.Users ([Name],[Password],FirstName,LastName,Tel,Email,Mobile,Fax,MSN,Skype,Twitter,QQ,Address,Sex,Organization,[Position],Rank,PortraitName,Remark,RegisterDate,UserRole) values (@Name,@EncryptedPassword,@FirstName,@LastName,@Tel,@Email,@Mobile,@Fax,@MSN,@Skype,@Twitter,@QQ,@Address,@Sex,@Organization,@Position,@Rank,@PortraitName,@Remark,@RegisterDate,@UserRole)
	FETCH NEXT FROM CursorUserRole INTO @UserRole
END

CLOSE CursorUserRole
DEALLOCATE CursorUserRole

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将 @UserGroups 中的用户列表解析成单个 UserGroup 保存到 UserGroups（当然要先从 UserGroups 表将过去的该用户所属组的记录删除）
--=====================================================
DELETE FROM dbo.UserGroups WHERE [User]=@Name
INSERT dbo.UserGroups (UserGroupID,[User]) SELECT [Element],@Name FROM dbo.UDF_PublicSplit(@UserGroups,N',')

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserAccountSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserAccountDelete    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserAccountDelete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserAccountDelete]
GO

--====================================================================================
--==将数据库中的某个用户删除（删除三个实体 login,user,profile）
--==达到的效果，只要给定的用户名在 login,user,profile 中任何地方出现，都要将它们清除干净，这样可以清除 orphan 用户
--==不能删除在线用户
--==2008/11/11 - 现在不必再理会 login, user，只删除 profile 即可
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24 
--====================================================================================

CREATE PROCEDURE dbo.UserAccountDelete

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@Name nvarchar(50),		--用户名（输入）
--@Silent INT,			--安静模式，用在数据库恢复，重建整个用户系统情形，这时，我们使用 BuiltInConnectionString 账号，希望绕过权限检查 （@Silent=0 要检查权限；  @Silent=1 绕过权限检查）
@oSuccess INT OUT		--输出是否成功，因为该 SP 将被 UserAccountSave 调用，那时，删除失败，按道理应当立即停止调用语句后面的所有任务，但实际上，SP 调用的另一个 SP 运行失败，并不影响 SP 的继续进行，只有根据返回的成功与否标志，强行中断

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--========================================
--==先假设运行是成功的
--========================================
SET @oSuccess=1

--=====================================================
--==用户权限检查
--=====================================================

IF dbo.UDF_UserAdmin(@User)<>1

BEGIN
	SET @oSuccess=0
	RAISERROR(N'您的权限不允许进行帐号删除操作。',16,1)
	RETURN
END


--========================================
--==检查输入参数
--========================================
SET @Name=RTRIM(LTRIM(@Name))

--========================================
--==用户名不能为空
--========================================
IF (@Name=N'') OR (@Name IS NULL)
	
BEGIN
	SET @oSuccess=0
	RAISERROR(N'给定的用户名不能为空。',16,1)
	RETURN
END

--========================================
--==用户不存在
--========================================
IF dbo.UDF_PublicProfileExists(@Name)=0

BEGIN
	SET @oSuccess=0
	RAISERROR(N'用户 %s 不存在。',16,1,@Name)
	RETURN
END

--========================================
--==删除用户在 UserForums 中定义的权限 （2010-11-24：UserForums 机制已经停用）
--========================================
/*
IF @Name IN (Select [User] From dbo.UserForums)

BEGIN
	DELETE FROM dbo.UserForums WHERE [User]=@Name
END
*/

--========================================
--==删除用户在 UserGroups 中的记录（组成员）
--========================================
IF @Name IN (Select [User] From dbo.UserGroups)

BEGIN
	DELETE FROM dbo.UserGroups WHERE [User]=@Name
END

--========================================
--==删除用户的 profile
--========================================
IF @Name IN (Select [Name] From dbo.Users)

BEGIN
	DELETE FROM dbo.Users WHERE [Name]=@Name
END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ



/*

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--========================================
--==如果当前用户不在 sysadmin 这个 ServerRole ，则不允许继续进行（只有 sysadmin Server Role 下的用户才有权限修改，创建，删除用户。这个情况一般不会发生，因为创建 Admin 用户的时候，会自动将之加入 sysadmin Server Role）
--==在数据库恢复情形，需要重建整个用户系统，这时，我们使用 BuiltInConnectionString 用户，这个用户属于 sysadmin 权限，所以下列检查不会妨碍这种情形
--========================================
IF IS_SRVROLEMEMBER('sysadmin')=0
	BEGIN
		SET @oSuccess=0
		RAISERROR(N'您的权限不运行进行帐号删除操作。',16,1)
		RETURN
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--========================================
--==用户名为空
--========================================
IF (@Name=N'') OR (@Name IS NULL)
	BEGIN
		SET @oSuccess=0
		RAISERROR(N'给定的用户名不能为空。',16,1)
		RETURN
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--========================================
--==用户不存在
--========================================
IF (dbo.UDF_PublicLoginExists(@Name)=0) AND (dbo.UDF_PublicUserExists(@Name)=0) AND (dbo.UDF_PublicProfileExists(@Name)=0)
	BEGIN
		SET @oSuccess=0
		RAISERROR(N'用户 %s 不存在。',16,1,@Name)
		RETURN
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--========================================
--==用户在线 （分 @Silent=0/1 两种情形）
--========================================
IF dbo.UDF_PublicLoginOnline(@Name)=1
BEGIN

	IF @Silent=0
		BEGIN
			--========================================
			--==常规 @Silent=0 ，举错
			--========================================
			SET @oSuccess=0
			RAISERROR(N'用户 %s 在线，目前不能删除或者修改。',16,1,@Name)
			RETURN
		END
	ELSE
		BEGIN
			--========================================
			--==在 @Silent=1 情形 ，我们要恢复数据库，进行用户系统重建，需要安静模式，如果用户在线，踢他下去就是了
			--==首先找到该用户所有 SPID ，将这些 SPID 逐个杀掉
			--========================================
			DECLARE @Spid SMALLINT

			DECLARE SpidCursor CURSOR FOR SELECT SPID FROM dbo.UDF_PublicLoginSpid(@Name) FOR READ ONLY
			OPEN SpidCursor
			FETCH NEXT FROM SpidCursor INTO @Spid

			WHILE @@FETCH_STATUS = 0
			BEGIN
				DECLARE @DynSql nvarchar(4000)
				SET @DynSql=' KILL '+ convert(nvarchar(20),@Spid)
				EXECUTE(@DynSql)
				FETCH NEXT FROM SpidCursor INTO @Spid
			END

			CLOSE SpidCursor
			DEALLOCATE SpidCursor
		END

END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--========================================
--==开始删除用户
--========================================
ELSE
	BEGIN

		--========================================
		--==删除用户在 UserForums 中定义的权限
		--========================================
		IF @Name IN (Select [User] From dbo.UserForums)
		BEGIN
			DELETE FROM dbo.UserForums WHERE [User]=@Name
		END

		--========================================
		--==删除用户的 profile
		--========================================
		IF @Name IN (Select [Name] From dbo.Users)
		BEGIN
			DELETE FROM dbo.Users WHERE [Name]=@Name
		END

		--========================================
		--==如果成功删除用户 Profile 则，接着撤消用户对数据库的访问权
		--========================================
		IF (@@Error=0) AND (@Name NOT IN (Select [Name] From dbo.Users))
		BEGIN
	
			--========================================
			--==使该用户丧失访问本数据库的权利
			--========================================
			IF dbo.UDF_PublicUserExists(@Name)=1
			BEGIN  
				EXEC sp_revokedbaccess @Name 
			END

			--========================================
			--==如果 “使该用户丧失访问本数据库的权利” 成功，则，接着删除用户的 login
			--==注意，这里的 @@Error 只关乎上面那个 EXEC 语句，至于 sp_revokedbaccess 是否成功，要查看 UDF_PublicUserExists()
			--========================================
			IF (@@Error=0) AND (dbo.UDF_PublicUserExists(@Name)=0)
			BEGIN
				--========================================
				--==将该用户从Login中去掉
				--========================================
				IF dbo.UDF_PublicLoginExists(@Name)=1
				BEGIN  
					EXEC master..sp_droplogin  @Name
				END

				--========================================
				--==如果 “将该用户从Login中去掉” 成功
				--==这里的 @@Error 是关乎上面的那个 EXEC 语句，要查看 sp_droplogin 是否执行成功，需要检查 UDF_PublicLoginExists()
				--========================================
				IF (@@Error=0) AND (dbo.UDF_PublicLoginExists(@Name)=0)

					BEGIN
						--========================================
						--==如果 “将该用户从Login中去掉” 成功，则返回成功标志
						--========================================
						SET @oSuccess=1
						RETURN
					END

				ELSE 
					BEGIN
						--========================================
						--==如果 “将该用户从Login中去掉” 失败，则返回失败标志同时举错
						--========================================
						SET @oSuccess=0
						RAISERROR(N'用户 %s 无法从数据库系统中删除。',16,1,@Name)
						RETURN
					END
			END

			--========================================
			--==如果 “使该用户丧失访问本数据库的权利” 失败
			--========================================
			ELSE
			BEGIN
				SET @oSuccess=0
				RAISERROR(N'用户 % 对当前数据库的访问权无法撤消。',16,1,@Name)
				RETURN
			END
		END

		--========================================
		--==如果删除用户 Profile失败
		--========================================
		ELSE
		BEGIN
			SET @oSuccess=0
			RAISERROR(N'用户 %s 的 Profile 记录无法删除 。',16,1,@Name)
			RETURN
		END

	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ


*/
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserAccountDelete]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PublicGetCommunityIDFromForumID    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PublicGetCommunityIDFromForumID]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PublicGetCommunityIDFromForumID]
GO

--====================================================================================
--==调用 UDF_GetCommunityIDFromForumID ，从 ForumID 获得  CommunityID
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28 
--====================================================================================

CREATE PROCEDURE dbo.PublicGetCommunityIDFromForumID

@ForumID int,			--Forum 的 ID
@CommunityID int OUT		--返回参数, 对应的 Community 的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--================================================
--==获得
--================================================
SELECT @CommunityID=dbo.UDF_GetCommunityIDFromForumID(@ForumID)


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PublicGetCommunityIDFromForumID]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserAccountQuery    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserAccountQuery]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserAccountQuery]
GO

--====================================================================================
--==这个 SP 的作用：根据更多的线索，查询用户账号 (几乎输入的所有用户账号资料都可以组合起来参与检索)
--==参数：所有检索线索作为参数，如果参数为NULL, 则该项不参与检索
--==建立分页机制，先将正常查询结果存入一个结构一样（但多了一个PagingID的表变量），根据PagingID，@PageSize，@CurrentPage选取当前页的记录，并将总页数作为一个追加栏位输出
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2011-06-26
--====================================================================================

CREATE PROCEDURE dbo.UserAccountQuery

@Name nvarchar(50),		--账号名
@FirstName nvarchar(50),	--姓
@LastName nvarchar(50),	--名
@Tel nvarchar(50),		--电话
@Email nvarchar(100),		--电子邮件

@Mobile nvarchar(50),		--移动电话
@Fax nvarchar(50),		--传真
@MSN nvarchar(100),		--MSN
@Skype nvarchar(100),		--Skype
@Twitter nvarchar(100),		--Twitter
@QQ nvarchar(100),		--QQ
@Address nvarchar(200),	--Address

@Sex int,			--性别
@Organization nvarchar(200),	--组合
@Position nvarchar(100),	--职位
@Rank int,			--等级
@Remark nvarchar(2000),	--备注

@RegisterDateYear INT,		--用户注册年份
@RegisterDateMonth INT,	--用户注册月份
@RegisterDateDay INT,		--用户注册日子

@UserRole int,			--用户角色
--@IsClient int,			--是否客户 （1/2） (CANCEL)

@PageSize INT,		--页码机制：每页的尺寸
@CurrentPage INT,		--页码机制：当前页
@OrderBy nvarchar(100),	--进行排序的列名
@OrderByOrder nvarchar(10)	--排序方式 ASC, DESC

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==参数的逃逸处理（仅在存在动态语句的地方使用）
--=====================================================
SET @Name=dbo.UDF_PublicStringEscape(@Name)
SET @FirstName=dbo.UDF_PublicStringEscape(@FirstName)
SET @LastName=dbo.UDF_PublicStringEscape(@LastName)
SET @Tel=dbo.UDF_PublicStringEscape(@Tel)
SET @Email=dbo.UDF_PublicStringEscape(@Email)

SET @Mobile=dbo.UDF_PublicStringEscape(@Mobile)
SET @Fax=dbo.UDF_PublicStringEscape(@Fax)
SET @MSN=dbo.UDF_PublicStringEscape(@MSN)
SET @Skype=dbo.UDF_PublicStringEscape(@Skype)
SET @Twitter=dbo.UDF_PublicStringEscape(@Twitter)
SET @QQ=dbo.UDF_PublicStringEscape(@QQ)
SET @Address=dbo.UDF_PublicStringEscape(@Address)

SET @Organization=dbo.UDF_PublicStringEscape(@Organization)
SET @Position=dbo.UDF_PublicStringEscape(@Position)
SET @Remark=dbo.UDF_PublicStringEscape(@Remark)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==权限检查（不需要）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==动态查询语句中可能出现 Unicode 字符（比如：FirstName='刘'），nvarchar()不能超过4000，而下面两个动态语句最后还要连接到一起，所以定义为 nvarchar(4000)
--==用动态SQL语句来完成统计(注意：要加上Set Nocount on 消除对最终输出记录集的影响)
--==用来构建Where从句
--=====================================================
DECLARE @DynSQL NVARCHAR(4000)      
DECLARE @DynWhere NVARCHAR(4000) 

--=====================================================
--==创建分页表 
--=====================================================
SET @DynSQL=N' SET NOCOUNT ON   '
SET @DynSQL=@DynSQL + N' Declare @Paging table '
SET @DynSQL=@DynSQL + N' ( '
SET @DynSQL=@DynSQL + N' PagingID int identity(1,1), '
SET @DynSQL=@DynSQL + N' [Name] nvarchar(50) COLLATE database_default,  '
SET @DynSQL=@DynSQL + N' FirstName nvarchar(50) COLLATE database_default,  '
SET @DynSQL=@DynSQL + N' LastName nvarchar(50) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' Sex nvarchar(50) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' Tel nvarchar(50) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' Email varchar(100) COLLATE database_default, '	--UDF_PublicLoginOnline

SET @DynSQL=@DynSQL + N' Mobile nvarchar(50) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' Fax nvarchar(50) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' MSN nvarchar(100) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' Skype nvarchar(100) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' Twitter nvarchar(100) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' QQ nvarchar(100) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' Address nvarchar(200) COLLATE database_default, '

SET @DynSQL=@DynSQL + N' Organization nvarchar(200) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' [Position] nvarchar(100) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' Rank int, '
SET @DynSQL=@DynSQL + N' Remark nvarchar(2000) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' RegisterDate datetime, '
--SET @DynSQL=@DynSQL + N' IsClient INT, '					--CANCEL
SET @DynSQL=@DynSQL + N' OnLine INT '	
SET @DynSQL=@DynSQL + N' ) '

--=====================================================
--==填充分页表 
--=====================================================
SET @DynSQL=@DynSQL + N' Insert into @Paging '

SET @DynSQL=@DynSQL + N' Select distinct   '  
SET @DynSQL=@DynSQL + N' us.[Name] as [Name], '
SET @DynSQL=@DynSQL + N' us.FirstName as FirstName, '
SET @DynSQL=@DynSQL + N' us.LastName as LastName, '
SET @DynSQL=@DynSQL + N' sex.NameC as Sex, '
SET @DynSQL=@DynSQL + N' us.Tel as Tel, '
SET @DynSQL=@DynSQL + N' us.Email as Email, '

SET @DynSQL=@DynSQL + N' us.Mobile as Mobile, '
SET @DynSQL=@DynSQL + N' us.Fax as Fax, '
SET @DynSQL=@DynSQL + N' us.MSN as MSN, '
SET @DynSQL=@DynSQL + N' us.Skype as Skype, '
SET @DynSQL=@DynSQL + N' us.Twitter as Twitter, '
SET @DynSQL=@DynSQL + N' us.QQ as QQ, '
SET @DynSQL=@DynSQL + N' us.Address as Address, '

SET @DynSQL=@DynSQL + N' us.Organization as Organization, '
SET @DynSQL=@DynSQL + N' us.[Position] as [Position], '
SET @DynSQL=@DynSQL + N' us.Rank as Rank, '
SET @DynSQL=@DynSQL + N' us.Remark as Remark, '
SET @DynSQL=@DynSQL + N' us.RegisterDate as RegisterDate, '
--SET @DynSQL=@DynSQL + N' us.IsClient as IsClient, '				--CANCEL
SET @DynSQL=@DynSQL + N' dbo.UDF_PublicLoginOnline(us.[Name]) as OnLine '

SET @DynSQL=@DynSQL + N' From dbo.Users us '
SET @DynSQL=@DynSQL + N' inner join dbo.Sex sex on sex.[ID]=us.Sex '

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==WHERE 1=1 巧妙地避免了下面动态 WHERE 从句中的 ‘AND’ 问题
--=====================================================
SET @DynSQL=@DynSQL + N' WHERE 1=1 '

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==其它动态 WHERE 从句
--=====================================================
SET @DynWhere=N''

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@Name 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--=====================================================
IF @Name IS NOT NULL   
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @Name 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @Name=RTRIM(LTRIM(@Name)) 
	IF @Name<>N'' 
	BEGIN
		If CHARINDEX (N'*' , @Name) >=1
		Begin   set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.[Name])) like ''' + REPLACE(@Name,N'*',N'%') + N'''' End
		Else
		Begin   set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.[Name]))=''' + @Name + N'''' End
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@FirstName 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--=====================================================
IF @FirstName IS NOT NULL 
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @FirstName 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @FirstName=RTRIM(LTRIM(@FirstName))  
	IF @FirstName<>N'' 
	BEGIN
		If CHARINDEX (N'*' , @FirstName) >=1
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.FirstName)) like ''' + REPLACE(@FirstName,N'*',N'%') + N'''' 	End
		Else

		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.FirstName))=''' + @FirstName + N''''	End
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@LastName 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--=====================================================
IF @LastName IS NOT NULL 
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @LastName 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @LastName=RTRIM(LTRIM(@LastName)) 
	IF @LastName<>N'' 
	BEGIN
		If CHARINDEX (N'*' , @LastName) >=1
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.LastName)) like ''' + REPLACE(@LastName,N'*',N'%') + N'''' 	End
		Else
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.LastName))=''' + @LastName + N''''	End
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@Tel 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--=====================================================
IF @Tel IS NOT NULL 
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @Tel 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @Tel=RTRIM(LTRIM(@Tel)) 
	IF @Tel<>N'' 
	BEGIN
		If CHARINDEX (N'*' , @Tel) >=1
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Tel)) like ''' + REPLACE(@Tel,N'*',N'%') + N'''' 	End
		Else
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Tel))=''' + @Tel + N''''	End
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@Email 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--=====================================================
IF @Email IS NOT NULL  
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @Email 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @Email=RTRIM(LTRIM(@Email)) 
	IF @Email<>N'' 
	BEGIN
		If CHARINDEX (N'*' , @Email) >=1
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Email)) like ''' + REPLACE(@Email,N'*',N'%') + N'''' 	End
		Else
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Email))=''' + @Email + N''''	End
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@Mobile 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--=====================================================
IF @Mobile IS NOT NULL  
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @Mobile 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @Mobile=RTRIM(LTRIM(@Mobile)) 
	IF @Mobile<>N'' 
	BEGIN
		If CHARINDEX (N'*' , @Mobile) >=1
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Mobile)) like ''' + REPLACE(@Mobile,N'*',N'%') + N'''' 	End
		Else
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Mobile))=''' + @Mobile + N''''	End
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@Fax 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--=====================================================
IF @Fax IS NOT NULL  
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @Fax 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @Fax=RTRIM(LTRIM(@Fax)) 
	IF @Fax<>N'' 
	BEGIN
		If CHARINDEX (N'*' , @Fax) >=1
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Fax)) like ''' + REPLACE(@Fax,N'*',N'%') + N'''' 	End
		Else
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Fax))=''' + @Fax + N''''	End
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@MSN 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--=====================================================
IF @MSN IS NOT NULL  
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @MSN 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @MSN=RTRIM(LTRIM(@MSN)) 
	IF @MSN<>N'' 
	BEGIN
		If CHARINDEX (N'*' , @MSN) >=1
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.MSN)) like ''' + REPLACE(@MSN,N'*',N'%') + N'''' 	End
		Else
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.MSN))=''' + @MSN + N''''	End
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@Skype 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--=====================================================
IF @Skype IS NOT NULL  
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @Skype 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @Skype=RTRIM(LTRIM(@Skype)) 
	IF @Skype<>N'' 
	BEGIN
		If CHARINDEX (N'*' , @Skype) >=1
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Skype)) like ''' + REPLACE(@Skype,N'*',N'%') + N'''' 	End
		Else
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Skype))=''' + @Skype + N''''	End
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@Twitter 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--=====================================================
IF @Twitter IS NOT NULL  
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @Twitter 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @Twitter=RTRIM(LTRIM(@Twitter)) 
	IF @Twitter<>N'' 
	BEGIN
		If CHARINDEX (N'*' , @Twitter) >=1
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Twitter)) like ''' + REPLACE(@Twitter,N'*',N'%') + N'''' 	End
		Else
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Twitter))=''' + @Twitter + N''''	End
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@QQ 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--=====================================================
IF @QQ IS NOT NULL  
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @QQ 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @QQ=RTRIM(LTRIM(@QQ)) 
	IF @QQ<>N'' 
	BEGIN
		If CHARINDEX (N'*' , @QQ) >=1
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.QQ)) like ''' + REPLACE(@QQ,N'*',N'%') + N'''' 	End
		Else
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.QQ))=''' + @QQ + N''''	End
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@Address 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--=====================================================
IF @Address IS NOT NULL  
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @Address 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @Address=RTRIM(LTRIM(@Address)) 
	IF @Address<>N'' 
	BEGIN
		If CHARINDEX (N'*' , @Address) >=1
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Address)) like ''' + REPLACE(@Address,N'*',N'%') + N'''' 	End
		Else
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Address))=''' + @Address + N''''	End
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@Sex 统计线索（等于0或者NULL表示不参与统计限制）
--=====================================================
IF @Sex IS NOT NULL AND @Sex<>0 
BEGIN
	set @DynWhere=@DynWhere + N' and us.Sex=' + CONVERT(NVARCHAR(20),@Sex)
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@Organization 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--=====================================================
IF @Organization IS NOT NULL  
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @Organization 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @Organization=RTRIM(LTRIM(@Organization)) 
	IF @Organization<>N'' 
	BEGIN
		If CHARINDEX (N'*' , @Organization) >=1
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Organization)) like ''' + REPLACE(@Organization,N'*',N'%') + N'''' 	End
		Else
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Organization))=''' + @Organization + N''''	End
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@Position 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--=====================================================
IF @Position IS NOT NULL  
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @Position 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @Position=RTRIM(LTRIM(@Position)) 
	IF @Position<>N'' 
	BEGIN
		If CHARINDEX (N'*' , @Position) >=1
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.[Position])) like ''' + REPLACE(@Position,N'*',N'%') + N'''' 	End
		Else
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.[Position]))=''' + @Position + N''''	End
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@Rank 统计线索（等于0或者NULL表示不参与统计限制）
--=====================================================
IF @Rank IS NOT NULL  AND @Rank<>0 
BEGIN
	set @DynWhere=@DynWhere + N' and us.Rank=' + CONVERT(NVARCHAR(20),@Rank)
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@Remark 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--=====================================================
IF @Remark IS NOT NULL  
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @Remark 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @Remark=RTRIM(LTRIM(@Remark)) 
	IF @Remark<>N'' 
	BEGIN
		If CHARINDEX (N'*' , @Remark) >=1
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Remark)) like ''' + REPLACE(@Remark,N'*',N'%') + N'''' 	End
		Else
		Begin	set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(us.Remark))=''' + @Remark + N''''	End
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--===========================================================
--==@RegisterDate(Y/M/D)统计线索（等于0或者NULL表示不参与统计限制）
--===========================================================
IF @RegisterDateYear IS NOT NULL AND @RegisterDateMonth IS NOT NULL AND @RegisterDateDay IS NOT NULL  
BEGIN
	If @RegisterDateYear<>0 Begin set @DynWhere=@DynWhere + N' and Year(us.RegisterDate)=' + CONVERT(NVARCHAR(20),@RegisterDateYear) End
	If @RegisterDateMonth<>0 Begin set @DynWhere=@DynWhere + N' and Month(us.RegisterDate)=' + CONVERT(NVARCHAR(20),@RegisterDateMonth) End
	If @RegisterDateDay<>0 Begin set @DynWhere=@DynWhere + N' and Day(us.RegisterDate)=' + CONVERT(NVARCHAR(20),@RegisterDateDay) End
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@UserRole 统计线索（等于0或者NULL表示不参与统计限制）
--=====================================================
IF @UserRole IS NOT NULL AND @UserRole<>0 
BEGIN
	set @DynWhere=@DynWhere + N' and us.UserRole=' + CONVERT(NVARCHAR(20),@UserRole)
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@IsClient 统计线索（等于0或者NULL表示不参与统计限制）
--==2009-04-12 : CANCEL
--=====================================================
/*
IF @IsClient IS NOT NULL AND @IsClient<>0 
BEGIN
	set @DynWhere=@DynWhere + N' and us.IsClient=' + CONVERT(NVARCHAR(20),@IsClient)
END
*/

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--===========================================================
--==前面的 SQL 语句最后加 其它动态 WHERE 从句 （@DynSQL 中已经包含 WHERE 1=1）
--===========================================================
SET @DynSQL=@DynSQL + @DynWhere

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==加上 Order By 从句
--==如果 OrderBy='' 则，使用缺省 order by Name ASC
--=====================================================
SET @OrderBy=LTRIM(RTRIM(@OrderBy))
SET @OrderByOrder=LTRIM(RTRIM(@OrderByOrder))

IF LEN(@OrderBy)=0 OR  LEN(@OrderByOrder)=0

	BEGIN
	SET @DynSQL=@DynSQL + N' order by [Name] ASC '
	END
ELSE
	BEGIN
	SET @DynSQL=@DynSQL + N' order by [' + @OrderBy + N'] ' + @OrderByOrder
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==最后从 @Paging 表变量中获取数据
--===================================================== 
Declare @FirstRecord int
Declare @LastRecord int

set @FirstRecord=(@CurrentPage - 1) * @PageSize	--当前页第一个记录前
set @LastRecord=(@CurrentPage * @PageSize + 1)	--当前页最后一个记录后

--=====================================================
--==总记录数，除以每页的记录数，用Ceiling()处理，得到的为页数 （注意：count(*)  和 @PageSize 都为 INT，它们相除将得到 INT，所以，首先要将它们转换成 Decimal(18,2)）
--=====================================================
set @DynSQL=@DynSQL + N' Select *,PageCount=CEILING (Convert(decimal(18,2),(select count(*) from @Paging)) / Convert(decimal(18,2),' + Convert(nvarchar(20),@PageSize) + N')) From @Paging Where PagingID>' + Convert(nvarchar(20),@FirstRecord) + N' and PagingID<' + Convert(nvarchar(20),@LastRecord)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--============================================
--==检查动态语句的长度，不可以超过系统上限
--============================================
DECLARE @oPassDynSQL INT
EXEC dbo.PublicDynSQLLengthCheck @DynSQL,@oPassDynSQL OUT
IF @oPassDynSQL=0 BEGIN RETURN END

--=====================================================
--==执行动态 SQL 语句， 开始统计
--=====================================================
EXEC(@DynSQL)
RETURN

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserAccountQuery]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicFollowUpSelect    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicFollowUpSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicFollowUpSelect]
GO

--====================================================================================
--==根据给定的 TopicID ，选取 Topic 以及其下的所有 FollowUp （分别调用 SP TopicSelect 和 SP FollowUpSelect）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-21
--====================================================================================

CREATE PROCEDURE dbo.TopicFollowUpSelect

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@Culture nvarchar(50),		--从 ASPX 端传递过来的当前语种

@TopicID INT			--指定的 Topic ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查（已经集成到 TopicSelect 和 FollowUpSelect 中了）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==选取该 TopicID 所对应的 Forum 中的 TopicCommand<xxx> 
--=====================================================
SELECT 

	fuc.TopicCommandSetEliteTopic AS  TopicCommandSetEliteTopic,
	fuc.TopicCommandSetTabooTopic AS TopicCommandSetTabooTopic,
	fuc.TopicCommandSetStickyTopic AS TopicCommandSetStickyTopic

FROM dbo.View_ForumUiCustomization fuc

WHERE fuc.ForumID=dbo.UDF_GetForumIDFromTopicID(@TopicID) AND fuc.Culture=@Culture

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==选取该 TopicID 下的 Topic 记录
--=====================================================
EXEC dbo.TopicSelect @User,@TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==选取该 TopicID 下的 FollowUp 记录
--=====================================================
EXEC dbo.FollowUpSelect @User,@TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（在 @TopicID 下添加了跟帖）
--==注意：必须检查 @User 是否为空（排除未登录用户也能浏览的情形）
--=====================================================
IF (@User<>N'') AND (@User IS NOT NULL)
BEGIN
	EXEC dbo.SiteLogSave @User, 2, @TopicID
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicFollowUpSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ModeratorList    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ModeratorList]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ModeratorList]
GO

--====================================================================================
--==根据给定的 ForumID ，选取当前 Forum 的斑竹列表
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-24 
--==该 SP 仅被 TopicQuery.cs.ModeratorList() 调用，但该方法暂时未启用
--====================================================================================

CREATE PROCEDURE dbo.ModeratorList

@ForumID INT		--指定的 Forum ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查（不需要）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==首先获得给定 Forum 的 Moderator 属性
--=====================================================
DECLARE @Moderator NVARCHAR(4000)
SELECT @Moderator=fp.Moderator FROM dbo.View_ForumPermission fp WHERE fp.ForumID=@ForumID

--SET @Moderator=(Select Top 1 Moderator From dbo.Forum Where [ID]=@ForumID)

--=====================================================
--==用户权限检查（不需要）
--=====================================================
SELECT DISTINCT

	Element as [Name]

FROM dbo.UDF_PublicSplit(@Moderator,N',')

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ModeratorList]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PublicGetTopicIDFromFollowUpID    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PublicGetTopicIDFromFollowUpID]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PublicGetTopicIDFromFollowUpID]
GO

--====================================================================================
--==调用 UDF_GetTopicIDFromFollowUpID ，从 FollowUpID 获得  TopicID
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28 
--====================================================================================

CREATE PROCEDURE dbo.PublicGetTopicIDFromFollowUpID

@FollowUpID int,			--FollowUp 的 ID
@TopicID int OUT			--返回参数, 对应的 Topic 的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--================================================
--==获得
--================================================
SELECT @TopicID=dbo.UDF_GetTopicIDFromFollowUpID(@FollowUpID)


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PublicGetTopicIDFromFollowUpID]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeTreeSelect    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeTreeSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeTreeSelect]
GO

--====================================================================================
--==从 View_KnowledgeTree 中获取全部或指定的记录
--==如果参数 KnowledgeDirectory 和 KnowledgeItem 是 NULL，则返回全部记录； 否则，返回指定的记录
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28 
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeTreeSelect

@KnowledgeDirectory NVARCHAR(4000),		--Knowledge 目录（列表）
@KnowledgeItem INT,					--Knowledge ID
@Culture nvarchar(100)					--指定文化

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果 @KnowledgeDirectory 和 @KnowledgeItem 都是 NULL
--=====================================================
IF @KnowledgeDirectory IS NULL AND @KnowledgeItem IS NULL

	--=====================================================
	--==返回整个 View_KnowledgeTree
	--=====================================================
	BEGIN
		SELECT * FROM dbo.View_KnowledgeTree WHERE Culture=@Culture ORDER BY Serial
	END

ELSE

	--=====================================================
	--==如果 @KnowledgeDirectory 和 @KnowledgeItem 都不是 NULL
	--=====================================================
	IF @KnowledgeDirectory IS NOT NULL AND @KnowledgeItem IS NOT NULL

		--=====================================================
		--==返回指定的 @KnowledgeDirectory 下的指定 Item
		--=====================================================
		BEGIN
			SELECT * FROM dbo.View_KnowledgeTree WHERE Directory IN (Select Element From dbo.UDF_PublicSplit(@KnowledgeDirectory,N',')) AND [ID]=@KnowledgeItem AND Culture=@Culture ORDER BY Serial
		END

	ELSE

		--=====================================================
		--==返回指定的 @KnowledgeDirectory 下的所有 Item
		--=====================================================
		BEGIN
			SELECT * FROM dbo.View_KnowledgeTree WHERE Directory IN (Select Element From dbo.UDF_PublicSplit(@KnowledgeDirectory,N',')) AND Culture=@Culture ORDER BY Serial
		END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeTreeSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PageDirectorySelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PageDirectorySelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PageDirectorySelect]
GO

--====================================================================================
--==根据给定的  KnowledgeItem (PageDirectory ID) 获得 PageDirectory 表中的指定记录
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-10-05
--====================================================================================

CREATE PROCEDURE dbo.PageDirectorySelect

@KnowledgeItem INT				--PageDirectory 记录 ID

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择
--====================================================================================
SELECT
	pd.[ID] AS [ID],
	pd.SubDirectoryID AS SubDirectoryID,
	pd.Serial AS Serial,
	pd.[Name] AS [Name],
	pd.PageSize AS PageSize,
	ISNULL(pd.NewWindow,0) AS NewWindow,
	ISNULL(pd.Overview,0) AS Overview,
	ISNULL(pd.FastAccess,0) AS FastAccess,
	ISNULL(pd.Home,0) AS Home,

	ISNULL(pd.RightIndent,0) AS RightIndent,

	ISNULL(pd.jQuery,0) AS jQuery,

	ISNULL(pd.LogoHide,0) AS LogoHide,
	ISNULL(pd.MainMenuHide,0) AS MainMenuHide,
	ISNULL(pd.BannerHide,0) AS BannerHide,
	ISNULL(pd.BreadcrumbHide,0) AS BreadcrumbHide,
	ISNULL(pd.PageMenuHide,0) AS PageMenuHide,
	ISNULL(pd.PageBarHide,0) AS PageBarHide,
	ISNULL(pd.CopyrightHide,0) AS CopyrightHide,

	pd.Type AS Type,
	pd.Presentation AS Presentation,
	pd.JumpToContent AS JumpToContent,

	pd.ShowTitle AS ShowTitle,
	pd.ShowAuthor AS ShowAuthor,
	pd.ShowUpdateTime AS ShowUpdateTime,
	pd.ShowHitCount AS ShowHitCount,
	pd.ShowComments AS ShowComments,
	pd.ShowStaticUrl AS ShowStaticUrl,
	pd.ShowKnowledgeHtml AS ShowKnowledgeHtml,
	pd.ShowRelative AS ShowRelative,

	pd.Editor AS Editor,
	pd.DedicatedTo AS DedicatedTo,
	pd.CommentsPermission AS CommentsPermission


FROM dbo.PageDirectory pd

WHERE pd.[ID]=@KnowledgeItem

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PageDirectorySelect]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.SubDirectorySelect    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SubDirectorySelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SubDirectorySelect]
GO

--====================================================================================
--==根据给定的  KnowledgeItem (SubDirectory ID) 获得 SubDirectory 表中的指定记录
--====================================================================================
--==版权所有 2001-2014 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2013-09-04 （本次修改未涉及具体代码的修改）
--====================================================================================

CREATE PROCEDURE dbo.SubDirectorySelect

@KnowledgeItem INT				--SubDirectory 记录 ID

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择
--====================================================================================
SELECT
	sd.[ID] AS [ID],
	sd.MainDirectoryID AS MainDirectoryID,
	sd.Serial AS Serial,
	sd.[Name] AS [Name],
	dbo.UDF_GetOverviewPageDirectory(N'SubDirectory',sd.[ID]) AS OverviewPageDirectoryItem,
	dbo.UDF_GetOverviewPageDirectoryName(N'SubDirectory',sd.[ID]) AS OverviewPageDirectoryName,
	ISNULL(sd.NewWindow,0) AS NewWindow,
	ISNULL(sd.Overview,0) AS Overview,
	ISNULL(sd.Wizard,0) AS Wizard,

	sd.Editor AS Editor,
	sd.DedicatedTo AS DedicatedTo,
	sd.CommentsPermission AS CommentsPermission

FROM dbo.SubDirectory sd

WHERE sd.[ID]=@KnowledgeItem

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[SubDirectorySelect]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.MainDirectorySelect    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MainDirectorySelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[MainDirectorySelect]
GO

--====================================================================================
--==根据给定的  KnowledgeItem (MainDirectory ID) 获得 MainDirectory 表中的指定记录
--====================================================================================
--==版权所有 2001-2014 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2013-09-04 （本次修改未涉及具体代码的修改）
--====================================================================================

CREATE PROCEDURE dbo.MainDirectorySelect

@KnowledgeItem INT				--MainDirectory 记录 ID

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择
--====================================================================================
SELECT
	md.[ID] AS [ID],
	md.Serial AS Serial,
	md.[Name] AS [Name],
	dbo.UDF_GetOverviewPageDirectory(N'MainDirectory',md.[ID]) AS OverviewPageDirectoryItem,
	dbo.UDF_GetOverviewPageDirectoryName(N'MainDirectory',md.[ID]) AS OverviewPageDirectoryName,
	ISNULL(md.NewWindow,0) AS NewWindow,
	ISNULL(md.[System],0) AS [System],
	md.InActiveMainMenuIconMap AS InActiveMainMenuIconMap,
	md.ActiveMainMenuIconMap AS ActiveMainMenuIconMap,
	md.BannerMap AS BannerMap,
	md.BannerContentLayer AS BannerContentLayer,
	md.Editor AS Editor,
	md.DedicatedTo AS DedicatedTo,
	md.CommentsPermission AS CommentsPermission

FROM dbo.MainDirectory md

WHERE md.[ID]=@KnowledgeItem

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[MainDirectorySelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.AdminUserAuthentication    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AdminUserAuthentication]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[AdminUserAuthentication]
GO

--====================================================================================
--==检查当前用户是否可以对 Knowledge （各 Level）进行保存，修改
--==表 Users 中的用户角色如果不是 Admin 则不能进行保存修改
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28 
--====================================================================================

CREATE PROCEDURE dbo.AdminUserAuthentication

@User NVARCHAR(50),		--参数：指定用户
@oPass INT OUT		--输出参数：通过返回 1，否则 0

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

/*
--=========================================
--==临时变量
--=========================================
DECLARE @CurrentUser NVARCHAR(50)
SET @CurrentUser=dbo.UDF_UserCurrent()
*/

--=========================================
--==如果当前用户不是系统管理员(不是位于 Admin 角色)，则举错，并退出
--=========================================
IF dbo.UDF_UserAdmin(@User)<>1
BEGIN
	SET @oPass=0
	RAISERROR(N'很抱歉，您不是网站管理员，不允许进行该操作。',16,1)
	RETURN
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[AdminUserAuthentication]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeSave    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeSave]
GO

--====================================================================================
--==保存 Knowledge
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-12-30
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeSave

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@PageDirectoryID int,			--当前 Knowledge 对应的 PageDirectory 的 ID

@Serial int,				--当前 Knowledge 的序列号（每条 Knowledge 的显示次序由该 Serial 决定，序列号越小，越先显示）
@UpdateTime datetime,			--当前 Knowledge 的发布时间（允许用户自行调整）
@Editor ntext,				--当前 Knowledge 的编辑权限 （如果为空字符或 NULL，则只有 Admin, ChiefEditor, 以及当前 Knowledge 继承的上级 Directory 的编辑才可以编辑，如果输入具体编辑名字，则这些编辑可以编辑）
@DedicatedTo ntext,			--该页权限分配给哪些用户 （如果是空字符或 NULL，则任何人都可以访问；如果是 "*" 则只有客户才可以访问； 如果是 “abc,efg,...”，则指定用户可以访问）
@CommentsPermission ntext,		--该页是否允许评论 （如果空字符或 NULL，则任何人可以评论，如果是 "*" 则任何客户可以评论， 如果是 “abc,efg,...” 则给定客户可以评论，如果是 "none" 则任何人不准评论）

@KnowledgeType int,			--当前内容类型（OrdinaryContent, MultiMedia, Map, FreeCode）

@oNewID int OUT			--新记录的 ID ，输出参数

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'PageDirectory',@PageDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ  
  
--=====================================================  
--==当前用户，当前时间  
--=====================================================  
--DECLARE @CurrentTime nvarchar(50)  
DECLARE @CurrentUser nvarchar(50)  
 
--SET @CurrentTime=GETDATE()  
SET @CurrentUser=@User

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加 Knowledge
--=====================================================
INSERT INTO dbo.Knowledge(PageDirectoryID,Serial,Editor,DedicatedTo,CommentsPermission,UpdateTime,Author,KnowledgeType) VALUES(@PageDirectoryID,@Serial,@Editor,@DedicatedTo,@CommentsPermission,@UpdateTime,@CurrentUser,@KnowledgeType)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==立即捕获刚刚保存的那条消息的 ID
--======================================================
SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（添加了 KnowledgeContent -  KnowledgeContentID = @oNewID）
--=====================================================
EXEC dbo.SiteLogSave @User, 6, @oNewID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeModify    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeModify]
GO

--====================================================================================
--==修改 Knowledge
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-12-30
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeModify

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@KnowledgeID int,			--当前 Knowledge 的 ID

@Serial int,				--当前 Knowledge 的序列号（每条 Knowledge 的显示次序由该 Serial 决定，序列号越小，越先显示）
@UpdateTime datetime,			--当前 Knowledge 的发布时间（允许用户自行调整）
@Editor ntext,				--当前 Knowledge  的编辑权限 （如果是空字符或 NULL，则只有 Admin, ChiefEditor, 当前 Knowledge  继承的上级目录的编辑有权限，如果输入了具体编辑名（可以多个），则这些编辑有权限）
@DedicatedTo ntext,			--该页权限分配给哪些用户 （如果是空字符或 NULL，则任何人都可以访问；如果是 "*" 则只有客户才可以访问； 如果是 “abc,efg,...”，则指定用户可以访问）
@CommentsPermission ntext		--该页是否允许评论 （如果是空字符或 NULL，则任何人都可以评论；如果是 "*"，则任何客户都可以评论； 如果是 "abc,efg,..."，则指定客户可以评论，如果是 "none" 则任何人都不可评论）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'Knowledge',@KnowledgeID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==修改 Knowledge
--=====================================================
UPDATE dbo.Knowledge SET 

	Serial=@Serial,
	UpdateTime=@UpdateTime,
	Editor=@Editor,
	DedicatedTo=@DedicatedTo,
	CommentsPermission=@CommentsPermission

WHERE [ID]=@KnowledgeID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（添加了 KnowledgeContent -  KnowledgeContentID = @oNewID）
--=====================================================
EXEC dbo.SiteLogSave @User, 13, @KnowledgeID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeModify]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PageDirectorySave    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PageDirectorySave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PageDirectorySave]
GO

--====================================================================================
--==保存 PageDirectory
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-12-31
--====================================================================================

CREATE PROCEDURE dbo.PageDirectorySave

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@SubDirectoryID int,			--当前 PageDirectory 对应的 SubDirectory 的 ID

@Serial int,				--当前 PageDirectory 的序列号（每条 Knowledge 的显示次序由该 Serial 决定，序列号越小，越先显示）
@Name nvarchar(100),			--当前 PageDirectory 的名字
@PageSize int,				--当前页在分页机制中的分页大小
@NewWindow bit,			--当前 PageDirectory 的 NewWindow Flag
@Overview bit,				--当前 PageDirectory 是否当前批 PageDirectories 的概述
@FastAccess bit,			--当前 PageDirectory 的 FastAccess Flag
@Home bit,				--当前 PageDirectory 的 Home Flag

@RightIndent int,			--当前 PageDirectory 的 RightIndent

@jQuery bit,				--是否加载 jQuery 库

@LogoHide bit,				--是否隐藏 Logo 区 				
@MainMenuHide bit,			--是否隐藏主菜单条 
@BannerHide bit,			--是否隐藏 Banner 
@BreadcrumbHide bit,			--是否隐藏面包屑
@PageMenuHide bit,			--是否隐藏当前页面的 Page Menu 侧条 （一般在首页，通过这个扩大首页的实际工作面积）
@PageBarHide bit,			--是否隐藏 PageBar 
@CopyrightHide bit,			--是否隐藏版权联系区

@Type int,				--当前 PageDirectory 下的知识的类型 （1 - 普通知识      2 - 基于时间的知识      3 - 分门别类的知识）
@Presentation int,			--当前 PageDirectory 下的知识的展示方式 （1 - 正常显示     2 - 显示标题 （点击进入具体内容）     3 - 显示摘要 （点击进入详细内容））
@JumpToContent bit,			--当前 PageDirectory 页在显示的时候，是否直接跳到内容 #Bookmark

@ShowTitle bit,				--当前 PageDirectory 的 ShowTitle Flag
@ShowAuthor int,			--当前 PageDirectory 的 ShowAuthor Flag
@ShowUpdateTime bit,			--当前 PageDirectory 的 ShowUpdateTime Flag
@ShowHitCount bit,			--当前 PageDirectory 的 ShowHitCount Flag
@ShowComments bit,			--当前 PageDirectory 的 ShowComments Flag
@ShowStaticUrl bit,			--当前 PageDirectory 的 ShowStaticUrl Flag
@ShowKnowledgeHtml bit,		--当前 PageDirectory 的 ShowKnowledgeHtml Flag
@ShowRelative bit,			--当前 PageDirectory 的 ShowRelative Flag

@Editor ntext,				--当前 PageDirectory 的编辑权限 （输入空字符或 NULL，则只有 Admin 和 ChiefEditor，以及本人继承的上级 Directory  的编辑 可以编辑；如果输入了具体编辑名（可以多个），则指定编辑可以编辑）
@DedicatedTo ntext,			--当前 PageDirectory 的访问权限 （如果为空字符或 NULL，则人人可访问，如果是指定用户和组，则指定用户和指定组下的用户可访问）
@CommentsPermission ntext,		--当前 PageDirectory 的评论权限 （如果是空字符或 NULL，则人人可评论，如果是指定用户和组，则指定用户和组下的用户可评论）

@oNewID int OUT			--新记录的 ID ，输出参数

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查（需要其上级权限）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'SubDirectory',@SubDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==检查 @Name 参数，看看是不是已经被用
--=====================================================
IF  EXISTS (Select [ID] From dbo.PageDirectory Where [Name]=@Name)
BEGIN
	RAISERROR(N'页目录的名字 %s 已被占用',16,1,@Name)
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==在添加 PageDirectory 记录之前，首先看看本记录的 @Home 属性是不是为 "true"，如果是，则将数据库中其他为 “true” 的记录改为 'false' ，因为只能有一个 true，就是说系统中同时只能有一个页是 Home Page
--=====================================================
IF @Home=1
BEGIN
	UPDATE dbo.PageDirectory SET Home=0 WHERE Home=1
END

--=====================================================
--==添加 PageDirectory 记录
--=====================================================
INSERT INTO dbo.PageDirectory(SubDirectoryID,Serial,[Name],PageSize,NewWindow,Overview,FastAccess,Home,RightIndent,jQuery,LogoHide,MainMenuHide,BannerHide,BreadcrumbHide,PageMenuHide,PageBarHide,CopyrightHide,Type,Presentation,JumpToContent,ShowTitle,ShowAuthor,ShowUpdateTime,ShowHitCount,ShowComments,ShowStaticUrl,ShowKnowledgeHtml,ShowRelative,Editor,DedicatedTo,CommentsPermission) VALUES(@SubDirectoryID,@Serial,@Name,@PageSize,@NewWindow,@Overview,@FastAccess,@Home,@RightIndent,@jQuery,@LogoHide,@MainMenuHide,@BannerHide,@BreadcrumbHide,@PageMenuHide,@PageBarHide,@CopyrightHide,@Type,@Presentation,@JumpToContent,@ShowTitle,@ShowAuthor,@ShowUpdateTime,@ShowHitCount,@ShowComments,@ShowStaticUrl,@ShowKnowledgeHtml,@ShowRelative,@Editor,@DedicatedTo,@CommentsPermission)


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==立即捕获刚刚保存的那条消息的 ID
--======================================================
SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==如果当前 @Overview 参数为 true，则调用 SP PageDirectorySetOverview 将当前 PageDirectory 设置为 Overview 状态
--======================================================
IF @Overview=1

BEGIN
	EXEC dbo.PageDirectorySetOverview @User,@oNewID
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果当前 PageDirectory 提供的 Serial 小于等于 Overview 项目的 Serial，则自动将 Overview 项目的 Serial 设置为比当前 Serial 小 1
--=====================================================
IF EXISTS (Select [ID] From dbo.PageDirectory Where SubDirectoryID=@SubDirectoryID And Overview=1)
BEGIN
	DECLARE @OverviewID INT, @OverviewSerial INT
	SELECT @OverviewID=[ID], @OverviewSerial=Serial FROM dbo.PageDirectory Where SubDirectoryID=@SubDirectoryID And Overview=1

	IF (@Serial<=@OverviewSerial)
	BEGIN
		UPDATE dbo.PageDirectory SET Serial=@Serial-1 WHERE [ID]=@OverviewID
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（添加了页目录）
--=====================================================
EXEC dbo.SiteLogSave @User, 5, @oNewID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PageDirectorySave]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PageDirectoryModify    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PageDirectoryModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PageDirectoryModify]
GO

--====================================================================================
--==修改 PageDirectory
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-12-30
--====================================================================================

CREATE PROCEDURE dbo.PageDirectoryModify

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@PageDirectoryID int,			--当前 PageDirectory 的 ID

@Serial int,				--当前 PageDirectory 的序列号（每条 Knowledge 的显示次序由该 Serial 决定，序列号越小，越先显示）
@Name nvarchar(100),			--当前 PageDirectory 的名字
@PageSize int,				--当前页在页码机制中分页大小
@NewWindow bit,			--当前 PageDirectory 的 NewWindow Flag
@Overview bit,				--当前 PageDirectory 是否本批 PageDirectories 的概述
@FastAccess bit,			--当前 PageDirectory 的 FastAccess Flag
@Home bit,				--当前 PageDirectory 的 Home Flag

@RightIndent int,			--当前 PageDirectory 的 RightIndent

@jQuery bit,				--是否加载 jQuery 库

@LogoHide bit,				--是否隐藏 Logo 区 				
@MainMenuHide bit,			--是否隐藏主菜单条 
@BannerHide bit,			--是否隐藏 Banner 
@BreadcrumbHide bit,			--是否隐藏面包屑
@PageMenuHide bit,			--是否隐藏当前页面的 Page Menu 侧条 （一般在首页，通过这个扩大首页的实际工作面积）
@PageBarHide bit,			--是否隐藏 PageBar 
@CopyrightHide bit,			--是否隐藏版权联系区

@Type int,				--当前 PageDirectory 下面知识的 类型（1 - 普通知识     2 - 基于时间的知识（博客，新闻）    3 - 分门别类知识（术语表，FAQ，招聘））
@Presentation int,			--当前 PageDirectory 下面的知识的展示方式 （1 - 正常展示     2 - 显示标题 （点击进入具体内容）    3 - 显示摘要 （如博客内容显示摘要，点击进入具体内容））
@JumpToContent bit,			--当前页进入后是否直接跳转到内容 #Bookmark

@ShowTitle bit,				--当前 PageDirectory 的 ShowTitle Flag
@ShowAuthor bit,			--当前 PageDirectory 的 ShowAuthor Flag
@ShowUpdateTime bit,			--当前 PageDirectory 的 ShowUpdateTime Flag
@ShowHitCount bit,			--当前 PageDirectory 的 ShowHitCount Flag
@ShowComments bit,			--当前 PageDirectory 的 ShowComments Flag
@ShowStaticUrl bit,			--当前 PageDirectory 的 ShowStaticUrl Flag
@ShowKnowledgeHtml bit,		--当前 PageDirectory 的 ShowKnowledgeHtml Flag
@ShowRelative bit,			--当前 PageDirectory 的 ShowRelative Flag

@Editor ntext,				--当前 PageDirectory 的编辑权限 （如果输入空字符或 NULL，则只有 Admin, ChiefEditor, 以及本人继承的上级 Directory 的 Editor 可以编辑了；如果输入了具体编辑的名字（可以多个），则指定编辑可以编辑）
@DedicatedTo ntext,			--当前 PageDirectory 的访问权限 （如果为空字符或 NULL，则人人可访问，如果是指定用户和组，则指定用户和指定组下的用户可访问）
@CommentsPermission ntext		--当前 PageDirectory 的评论权限 （如果是空字符或 NULL，则人人可评论，如果是指定用户和组，则指定用户和组下的用户可评论）


AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'PageDirectory',@PageDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==检查 @Name 参数，看看是不是已经被用 （但排除被自己用的情形）
--=====================================================
IF  EXISTS (Select [ID] From dbo.PageDirectory Where [Name]=@Name AND [ID]<>@PageDirectoryID)
BEGIN
	RAISERROR(N'页目录的名字 %s 已被占用',16,1,@Name)
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==在修改 PageDirectory 记录之前，首先看看本记录的 @Home 属性是不是为 "true"，如果是，则将数据库中其他为 “true” 的记录改为 'false' ，因为只能有一个 true，就是说系统中同时只能有一个页是 Home Page
--=====================================================
IF @Home=1
BEGIN
	UPDATE dbo.PageDirectory SET Home=0 WHERE Home=1
END

--=====================================================
--==修改 PageDirectory
--=====================================================
UPDATE dbo.PageDirectory SET

	Serial=@Serial,
	[Name]=@Name,
	PageSize=@PageSize,
	NewWindow=@NewWindow,
	Overview=@Overview,
	FastAccess=@FastAccess,
	Home=@Home,

	RightIndent=@RightIndent,

	jQuery=@jQuery,

	LogoHide=@LogoHide, 
	MainMenuHide=@MainMenuHide,
	BannerHide=@BannerHide,
	BreadcrumbHide=@BreadcrumbHide,
	PageMenuHide=@PageMenuHide,
	PageBarHide=@PageBarHide,
	CopyrightHide=@CopyrightHide,

	Type=@Type,
	Presentation=@Presentation,
	JumpToContent=@JumpToContent,

	ShowTitle=@ShowTitle,
	ShowAuthor=@ShowAuthor,
	ShowUpdateTime=@ShowUpdateTime,

	ShowHitCount=@ShowHitCount,
	ShowComments=@ShowComments,
	ShowStaticUrl=@ShowStaticUrl,
	ShowKnowledgeHtml=@ShowKnowledgeHtml,
	ShowRelative=@ShowRelative,

	Editor=@Editor,
	DedicatedTo=@DedicatedTo,
	CommentsPermission=@CommentsPermission

WHERE [ID]=@PageDirectoryID

--=====================================================
--==如果 @Overview 参数为 “true”，则将本 PageDirectory 的所有兄弟 PageDirectory 重新排队，从 2 开始，最后，将当前 PageDirectory 的 Serial 设置为 1，这样就实现了将 Overview=“true” 的 PageDirectory 置首的目的
--=====================================================
IF @Overview=1

BEGIN
	EXEC dbo.PageDirectorySetOverview @User,@PageDirectoryID
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果当前 PageDirectory 提供的 Serial 小于等于 Overview 项目的 Serial，则自动将 Overview 项目的 Serial 设置为比当前 Serial 小 1
--=====================================================
DECLARE @SubDirectoryID INT
SELECT @SubDirectoryID=SubDirectoryID FROM dbo.PageDirectory WHERE [ID]=@PageDirectoryID

IF EXISTS (Select [ID] From dbo.PageDirectory Where SubDirectoryID=@SubDirectoryID And Overview=1)
BEGIN
	DECLARE @OverviewID INT, @OverviewSerial INT
	SELECT @OverviewID=[ID], @OverviewSerial=Serial FROM dbo.PageDirectory Where SubDirectoryID=@SubDirectoryID And Overview=1

	IF (@Serial<=@OverviewSerial)
	BEGIN
		UPDATE dbo.PageDirectory SET Serial=@Serial-1 WHERE [ID]=@OverviewID
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（修改了页目录）
--=====================================================
EXEC dbo.SiteLogSave @User, 12, @PageDirectoryID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PageDirectoryModify]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.SubDirectorySave    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SubDirectorySave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SubDirectorySave]
GO


--====================================================================================
--==保存 SubDirectory
--====================================================================================
--==版权所有 2001-2014 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2013-09-05
--====================================================================================

CREATE PROCEDURE dbo.SubDirectorySave

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@MainDirectoryID int,				--当前 SubDirectory 对应的 MainDirectory 的 ID

@Serial int,					--当前 SubDirectory 的序列号（每条 Knowledge 的显示次序由该 Serial 决定，序列号越小，越先显示）
@Name nvarchar(100),				--当前 SubDirectory 的名字
@OverviewPageDirectoryName nvarchar(100),	--当前 SubDirectory 的 OverviewPageDirectory 的名字
@NewWindow bit,				--当前 SubDirectory 的 NewWindow Flag
@Overview bit,					--当前 SubDirectory 是否本批 SubDirectories 的概述
@Wizard bit,					--当前 SubDirectory 下的 PageDirectory 是否以向导形式输出

@Editor ntext,					--当前 SubDirectory 的编辑权限（如果输入空字符或 NULL，则只有  Admin, ChiefEditor 以及本人继承的上级目录的编辑可以编辑；如果具体输入编辑的名字（可以多个）；则这些指定的编辑也可以编辑）
@DedicatedTo ntext,				--当前 SubDirectory 的访问权限 （如果为空字符或 NULL，则人人可访问，如果是指定用户和组，则指定用户和指定组下的用户可访问）
@CommentsPermission ntext,			--当前 SubDirectory 的评论权限 （如果是空字符或 NULL，则人人可评论，如果是指定用户和组，则指定用户和组下的用户可评论）

@oNewID int OUT				--新记录的 ID ，输出参数

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查  （需要 MainDirectory 权限）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'MainDirectory',@MainDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==检查 @Name 参数，看看是不是已经被用 （由于保存 SubDirectory 的时候，同时会生成一个 Overview PageDirectory，会继承这个 @Name 作为他的名字，因此，我们需要从全部 SubDirectory, PageDirectory 中检查是否重名）
--==该机制暂缓启用
--=====================================================
/*
IF  (EXISTS (Select [ID] From dbo.SubDirectory Where [Name]=@Name)) OR  (EXISTS (Select [ID] From dbo.PageDirectory Where [Name]=@Name))
*/

--=====================================================
--==检查 Name 是否 已被占用
--=====================================================
IF  EXISTS (Select [ID] From dbo.SubDirectory Where [Name]=@Name)
BEGIN
	RAISERROR(N'子目录的名字 %s 已被占用',16,1,@Name)
END

IF  EXISTS (Select [ID] From dbo.PageDirectory Where [Name]=@OverviewPageDirectoryName)
BEGIN
	RAISERROR(N'内容页目录的名字 %s 已被占用',16,1,@OverviewPageDirectoryName)
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加 SubDirectory
--=====================================================
INSERT INTO dbo.SubDirectory(MainDirectoryID,Serial,[Name],NewWindow,Overview,Wizard,Editor,DedicatedTo,CommentsPermission) VALUES(@MainDirectoryID,@Serial,@Name,@NewWindow,@Overview,@Wizard,@Editor,@DedicatedTo,@CommentsPermission)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==立即捕获刚刚保存的那条消息的 ID
--======================================================
SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果 @Overview 参数为 1，则将本 SubDirectory 的所有兄弟 SubDirectory 重新排队，从 2 开始，最后，将当前 SubDirectory 的 Serial 设置为 1，这样就实现了将 Overview=“true” 的 SubDirectory 置首的目的
--=====================================================
IF @Overview=1

BEGIN
	EXEC dbo.SubDirectorySetOverview @User,@oNewID
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==下面自动创建 Overview PageDirectory, PageDirectoryContent 的新 ID
--======================================================
DECLARE @oOverviewPageDirectoryNewID INT
DECLARE @oOverviewPageDirectoryContentNewID INT

--======================================================
--==在新创建的 SubDirectory 记录下面自动创建 Overview PageDirectory （以及它的 Content）
--==注：在执行下面的 SP 的时候，SubDirectoryContentSave 还没有来得及执行，因此，在 SP SubDirectoryCreateOverviewPageDirectoryContent 中所谓的继承 SubDirectoryContent 中的 Title 个 Description 其实继承到的是空值，我们还要在 SubDirectoryContentSave 中明确地将 Title 和 Description 值传递给其 Overview PageDirectoryContent
--======================================================

EXEC dbo.SubDirectoryCreateOverviewPageDirectory @User, @oNewID, @OverviewPageDirectoryName, @oOverviewPageDirectoryNewID OUT
EXEC dbo.SubDirectoryCreateOverviewPageDirectoryContent @User, @oOverviewPageDirectoryNewID, @oOverviewPageDirectoryContentNewID OUT

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果当前 SubDirectory 提供的 Serial 小于等于 Overview 项目的 Serial，则自动将 Overview 项目的 Serial 设置为比当前 Serial 小 1
--=====================================================
IF EXISTS (Select [ID] From dbo.SubDirectory Where MainDirectoryID=@MainDirectoryID And Overview=1)
BEGIN
	DECLARE @OverviewID INT, @OverviewSerial INT
	SELECT @OverviewID=[ID], @OverviewSerial=Serial FROM dbo.SubDirectory Where MainDirectoryID=@MainDirectoryID And Overview=1

	IF (@Serial<=@OverviewSerial)
	BEGIN
		UPDATE dbo.SubDirectory SET Serial=@Serial-1 WHERE [ID]=@OverviewID
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（添加子目录）
--=====================================================
EXEC dbo.SiteLogSave @User, 4, @oNewID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[SubDirectorySave]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.SubDirectoryModify    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SubDirectoryModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SubDirectoryModify]
GO

--====================================================================================
--==修改 SubDirectory
--====================================================================================
--==版权所有 2001-2014 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2013-09-10
--====================================================================================

CREATE PROCEDURE dbo.SubDirectoryModify

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@SubDirectoryID int,				--当前 SubDirectory 的 ID

@Serial int,					--当前 SubDirectory 的序列号（每条 Knowledge 的显示次序由该 Serial 决定，序列号越小，越先显示）
@Name nvarchar(100),				--当前 SubDirectory 的名字
@OverviewPageDirectoryName nvarchar(100),	--直属内容页名字 （从 SubDirectory UI 现场传递来）
@NewWindow bit,				--当前 SubDirectory 的 NewWindow Flag
@Overview bit,					--当前 SubDirectory 是否本批 SubDirectories 的概述
@Wizard bit,					--当前 SubDirectory 下的 PageDircetory 内容是否以向导的形式输出

@Editor ntext,					--当前 SubDirectory 的编辑权限（如果输入空字符或 NULL，则只有 Admin 和 ChiefEditor，以及本人继承的上级目录的编辑可以编辑；如果输入具体编辑名字（可以多个），则这些编辑可以编辑）
@DedicatedTo ntext,				--当前 SubDirectory 的访问权限 （如果为空字符或 NULL，则人人可访问，如果是指定用户和组，则指定用户和指定组下的用户可访问）
@CommentsPermission ntext			--当前 SubDirectory 的评论权限 （如果是空字符或 NULL，则人人可评论，如果是指定用户和组，则指定用户和组下的用户可评论）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'SubDirectory',@SubDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==获取当前 SubDirectory 的 Overview PageDirectory 的 ID
--==该机制暂缓启用
--=====================================================
/*
DECLARE @OverviewPageDirectoryID INT
SELECT @OverviewPageDirectoryID=dbo.UDF_GetOverviewPageDirectory(N'SubDirectory',@SubDirectoryID)

--=====================================================
--==检查 @Name 参数，看看是不是已经被用 （但排除被自己用的情形）；或者被《非》自己的 Overview PageDirectory 占用
--=====================================================
IF  (EXISTS (Select [ID] From dbo.SubDirectory Where [Name]=@Name And [ID]<>@SubDirectoryID)) OR (EXISTS (Select [ID] From dbo.PageDirectory Where [Name]=@Name And [ID]<>@OverviewPageDirectoryID))
*/

--=====================================================
--==检查 Name / OverviewPageDirectoryName 是否已被占用 
--=====================================================
IF  EXISTS (Select [ID] From dbo.SubDirectory Where [Name]=@Name And [ID]<>@SubDirectoryID)
BEGIN
	RAISERROR(N'子目录的名字 %s 已被占用',16,1,@Name)
END

DECLARE @OverviewPageDirectoryID INT
SELECT @OverviewPageDirectoryID=dbo.UDF_GetOverviewPageDirectory(N'SubDirectory',@SubDirectoryID)

IF  EXISTS (Select [ID] From dbo.PageDirectory Where [Name]=@OverviewPageDirectoryName And [ID]<>@OverviewPageDirectoryID)
BEGIN
	RAISERROR(N'子目录的直属内容页名字 %s 已被占用',16,1,@OverviewPageDirectoryName)
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==修改 SubDirectory
--=====================================================
UPDATE dbo.SubDirectory SET

	Serial=@Serial,
	[Name]=@Name,
	NewWindow=@NewWindow,
	Overview=@Overview,
	Wizard=@Wizard,
	Editor=@Editor,
	DedicatedTo=@DedicatedTo,
	CommentsPermission=@CommentsPermission


WHERE [ID]=@SubDirectoryID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==修改其 Overview PageDirectory 的 Name 
--=====================================================
UPDATE dbo.PageDirectory SET [Name]=@OverviewPageDirectoryName WHERE [ID]=@OverviewPageDirectoryID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==修改其 Overview PageDirectory 的 NewWindow （SubDirectory 和 其 Overview PageDirectory 的 NewWindow 应该保持一致）（似乎不是非常必要）
--=====================================================
/*
DECLARE @OverviewPageDirectoryID INT
SELECT @OverviewPageDirectoryID=dbo.UDF_GetOverviewPageDirectory(N'SubDirectory',@SubDirectoryID)
UPDATE dbo.PageDirectory SET [NewWindow]=@NewWindow WHERE [ID]=@OverviewPageDirectoryID
*/

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==修改其 Overview PageDirectory 的 Name （SubDirectory 和 其 Overview PageDirectory 的 Name 应该保持一致）
--==这是自上而下的 Propaganda
--==该机制暂缓启用
--=====================================================
/*
UPDATE dbo.PageDirectory SET [Name]=@Name WHERE [ID]=@OverviewPageDirectoryID
*/

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果 @Overview 参数为 1，则将本 SubDirectory 的所有兄弟 SubDirectory 重新排队，从 2 开始，最后，将当前 SubDirectory 的 Serial 设置为 1，这样就实现了将 Overview=“true” 的 SubDirectory 置首的目的
--==另外，需要检查当前 SubDirectory 下的 PageDirectory 数目是否 >1，如果是，举错，因为作为概述 SubDirectory, 其下属的 PageDirectory 数只能为 1 个
--=====================================================
IF @Overview=1

BEGIN
	--=====================================================
	--==获得当前 SubDirectory 下的 PageDirectory 数目，如 >1 则举错
	--=====================================================
	DECLARE @Count INT
	SELECT @Count=COUNT(pd.[ID]) FROM dbo.PageDirectory pd WHERE pd.SubDirectoryID=@SubDirectoryID

	IF @Count>1

		BEGIN
			UPDATE dbo.SubDirectory SET Overview=0  WHERE [ID]=@SubDirectoryID
			RAISERROR(N'您当前子目录下的页目录数量多余1个，如果您想将当前子目录设置为其上级主目录的概述内容，则，该子目录下属的页目录数目不应该超过1个。因为设为概述的含义为，当前子目录下的第1个页目录下的内容将直接显示在该子目录的上级主目录下。',16,1)
		END

	ELSE

		BEGIN	
			EXEC dbo.SubDirectorySetOverview @User,@SubDirectoryID
		END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果当前 SubDirectory 提供的 Serial 小于等于 Overview 项目的 Serial，则自动将 Overview 项目的 Serial 设置为比当前 Serial 小 1
--=====================================================
DECLARE @MainDirectoryID INT
SELECT @MainDirectoryID=MainDirectoryID FROM dbo.SubDirectory WHERE [ID]=@SubDirectoryID

IF EXISTS (Select [ID] From dbo.SubDirectory Where MainDirectoryID=@MainDirectoryID And Overview=1)
BEGIN
	DECLARE @OverviewID INT, @OverviewSerial INT
	SELECT @OverviewID=[ID], @OverviewSerial=Serial FROM dbo.SubDirectory Where MainDirectoryID=@MainDirectoryID And Overview=1

	IF (@Serial<=@OverviewSerial)
	BEGIN
		UPDATE dbo.SubDirectory SET Serial=@Serial-1 WHERE [ID]=@OverviewID
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（修改了子目录）
--=====================================================
EXEC dbo.SiteLogSave @User, 11, @SubDirectoryID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[SubDirectoryModify]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.MainDirectorySave    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MainDirectorySave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[MainDirectorySave]
GO


--====================================================================================
--==保存 MainDirectory
--====================================================================================
--==版权所有 2001-2014 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2013-09-05
--====================================================================================

CREATE PROCEDURE dbo.MainDirectorySave

@User nvarchar(50),					--从 ASPX 端传递过来的当前用户名

@Serial int,						--当前 MainDirectory 的序列号（每条 Knowledge 的显示次序由该 Serial 决定，序列号越小，越先显示）
@Name nvarchar(100),					--当前 MainDirectory 的名字
@OverviewPageDirectoryName nvarchar(100),		--内容页名字 （从 MainDirectory UI 现场传递来）
@NewWindow bit,					--当前 MainDirectory 的 NewWindow Flag
@System bit,						--当前 MainDirectory 的 System Flag
@InActiveMainMenuIconMap ntext,			--当前 MainDirectory 的 InActiveMainMenuIconMap
@ActiveMainMenuIconMap ntext,			--当前 MainDirectory 的 ActiveMainMenuIconMap
@BannerMap ntext,					--当前 MainDirectory 的 BannerMap
@BannerContentLayer ntext,				--当前 MainDirectory 的 BannerContentLayer

@Editor ntext,						--当前 MainDirectory 的编辑权限 （如果为空字符或 NULL，则只有 Admin 和 ChiefEditor 可以编辑；如果输入了具体编辑的名字（可以多个），则指定编辑可以编辑）
@DedicatedTo ntext,					--当前 MainDirectory 的访问权限 （如果为空字符或 NULL，则人人可访问，如果是指定用户和组，则指定用户和指定组下的用户可访问）
@CommentsPermission ntext,				--当前 MainDirectory 的评论权限 （如果是空字符或 NULL，则人人可评论，如果是指定用户和组，则指定用户和组下的用户可评论）

@oNewID int OUT					--新记录的 ID ，输出参数

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （这里需要 Admin 或  ChiefEditor 权限）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'',0,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==检查 @Name 参数，看看是不是已经被用 （由于保存 MainDirectory 的时候，同时会生成一个 Overview SubDirectory，继而生成一个 Overview PageDirectory，而后两个都会继承这个 @Name 作为他们的名字，因此，我们需要从全部 MainDirectory, SubDirectory, PageDirectory 中检查是否重名）
--==该机制暂缓启用
--=====================================================
--IF (EXISTS (Select [ID] From dbo.MainDirectory Where [Name]=@Name)) OR  (EXISTS (Select [ID] From dbo.SubDirectory Where [Name]=@Name)) OR  (EXISTS (Select [ID] From dbo.PageDirectory Where [Name]=@Name))

--=====================================================
--==检查 MainDirectory 的名字是否已被占用
--==检查 OverviewPageDirectory 的名字是否已被占用
--=====================================================
IF EXISTS (Select [ID] From dbo.MainDirectory Where [Name]=@Name)
BEGIN
	RAISERROR(N'主目录的名字 %s 已被占用',16,1,@Name)
END

IF EXISTS (Select [ID] From dbo.PageDirectory Where [Name]=@OverviewPageDirectoryName)
BEGIN
	RAISERROR(N'内容页目录的名字 %s 已被占用',16,1,@OverviewPageDirectoryName)
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==在修改 MainDirectory 记录之前，首先看看本记录的 @System 属性是不是为 "true"，如果是，则将数据库中其他为 “true” 的记录改为 'false' ，因为只能有一个 true，就是说系统中同时只能有一个主菜单是 System Menu
--=====================================================
IF @System=1
BEGIN
	UPDATE dbo.MainDirectory SET [System]=0 WHERE [System]=1
END

--=====================================================
--==添加 MainDirectory 记录
--=====================================================
INSERT INTO dbo.MainDirectory(Serial,[Name],NewWindow,[System],InActiveMainMenuIconMap,ActiveMainMenuIconMap,BannerMap,BannerContentLayer,Editor,DedicatedTo,CommentsPermission) VALUES(@Serial,@Name,@NewWindow,@System,@InActiveMainMenuIconMap,@ActiveMainMenuIconMap,@BannerMap,@BannerContentLayer,@Editor,@DedicatedTo,@CommentsPermission)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==立即捕获刚刚保存的那条消息的 ID
--======================================================
SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==下面自动创建 Overview SubDirectory, SubDirectoryContent  （注： Overview PageDirectory, PageDirectoryContent  的创建会在 SP MainDirectoryCreateOverviewSubDirectory 中通过调用 SubDirectorySave 实现）
--======================================================
DECLARE @oOverviewSubDirectoryNewID INT
DECLARE @oOverviewSubDirectoryContentNewID INT

--======================================================
--==在新创建的 MainDirectory 记录下面自动创建 Overview SubDirectory （以及它的 Content）
--==注：事实上，在执行下面代码的时候，SP MainDirectoryContentSave 还没有开始执行，因此，下面的 SP MainDirectoryCreateOverviewSubDirectoryContent 中所谓继承 MainDirectoryContent 的 Title 和 Description，继承到的其实是 NULL 或空值，因此在 SP MainDirectoryContentSave 我们还要明确地为其 OverviewSubDirectoryContent 传递 Title, Description 属性
--======================================================
EXEC dbo.MainDirectoryCreateOverviewSubDirectory @User, @oNewID, @OverviewPageDirectoryName, @oOverviewSubDirectoryNewID OUT
EXEC dbo.MainDirectoryCreateOverviewSubDirectoryContent @User, @oOverviewSubDirectoryNewID, @oOverviewSubDirectoryContentNewID OUT

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（添加了主目录 @oNewID）
--=====================================================
EXEC dbo.SiteLogSave @User, 3, @oNewID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[MainDirectorySave]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.MainDirectoryModify    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MainDirectoryModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[MainDirectoryModify]
GO

--====================================================================================
--==修改 MainDirectory
--====================================================================================
--==版权所有 2001-2014 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2013-09-10
--====================================================================================

CREATE PROCEDURE dbo.MainDirectoryModify

@User nvarchar(50),					--从 ASPX 端传递过来的当前用户名

@MainDirectoryID int,					--当前 MainDirectory 的 ID

@Serial int,						--当前 MainDirectory 的序列号（每条 Knowledge 的显示次序由该 Serial 决定，序列号越小，越先显示）
@Name nvarchar(100),					--当前 MainDirectory 的名字
@OverviewPageDirectoryName nvarchar(100),		--直属内容页名字 （从 MainDirectory UI 现场传递来）
@NewWindow bit,					--当前 MainDirectory 的 NewWindow Flag
@System bit,						--当前 MainDirectory 的 System Flag
@InActiveMainMenuIconMap ntext,			--当前 MainDirectory 的 InActiveMainMenuIconMap
@ActiveMainMenuIconMap ntext,			--当前 MainDirectory 的 ActiveMainMenuIconMap
@BannerMap ntext,					--当前 MainDirectory 的 BannerMap 
@BannerContentLayer ntext,				--当前 MainDirectory 的 BannerContentLayer

@Editor ntext,						--当前 MainDirectory 的编辑权限 （如果为空字符或 NULL，则只有 Admin 和 ChiefEditor 可以编辑；如果输入了具体编辑的名字（可以是英文逗号隔开的多个编辑），则这些编辑可以编辑）
@DedicatedTo ntext,					--当前 MainDirectory 的访问权限 （如果为空字符或 NULL，则人人可访问，如果是指定用户和组，则指定用户和指定组下的用户可访问）
@CommentsPermission ntext				--当前 MainDirectory 的评论权限 （如果是空字符或 NULL，则人人可评论，如果是指定用户和组，则指定用户和组下的用户可评论）



AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'MainDirectory',@MainDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==获取当前 MainDirectory 的 Overview SubDirectory 和 OverviewPageDirectory 的 ID
--==该机制暂缓启用
--=====================================================
/*
DECLARE @OverviewSubDirectoryID INT
SELECT @OverviewSubDirectoryID=dbo.UDF_GetOverviewSubDirectory(@MainDirectoryID)

DECLARE @OverviewPageDirectoryID INT
SELECT @OverviewPageDirectoryID=dbo.UDF_GetOverviewPageDirectory(N'MainDirectory',@MainDirectoryID)

--=====================================================
--==检查 @Name 参数，看看是不是已经被用 （但排除被自己用的情形）；或者被《非》自己的 Overview SubDirectory 占用；或者被《非》自己的 Overview PageDirectory 占用
--=====================================================
IF  (EXISTS (Select [ID] From dbo.MainDirectory Where [Name]=@Name And [ID]<>@MainDirectoryID)) OR (EXISTS (Select [ID] From dbo.SubDirectory Where [Name]=@Name And [ID]<>@OverviewSubDirectoryID)) OR (EXISTS (Select [ID] From dbo.PageDirectory Where [Name]=@Name And [ID]<>@OverviewPageDirectoryID))
*/

--=====================================================
--==主目录名称及其专属内容页名称检查
--=====================================================
IF  EXISTS (Select [ID] From dbo.MainDirectory Where [Name]=@Name And [ID]<>@MainDirectoryID)
BEGIN
	RAISERROR(N'主目录的名字 %s 已被占用',16,1,@Name)
END

DECLARE @OverviewPageDirectoryID INT
SELECT @OverviewPageDirectoryID=dbo.UDF_GetOverviewPageDirectory(N'MainDirectory',@MainDirectoryID)

IF  EXISTS (Select [ID] From dbo.PageDirectory Where [Name]=@OverviewPageDirectoryName And [ID]<>@OverviewPageDirectoryID)
BEGIN
	RAISERROR(N'主目录直属内容页面的名字 %s 已被占用',16,1,@OverviewPageDirectoryName)
END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==在修改 MainDirectory 记录之前，首先看看本记录的 @System 属性是不是为 "true"，如果是，则将数据库中其他为 “true” 的记录改为 'false' ，因为只能有一个 true，就是说系统中同时只能有一个主菜单是 System Menu
--=====================================================
IF @System=1
BEGIN
	UPDATE dbo.MainDirectory SET [System]=0 WHERE [System]=1
END

--=====================================================
--==修改 MainDirecytory
--=====================================================
UPDATE dbo.MainDirectory SET

	Serial=@Serial,
	[Name]=@Name,
	NewWindow=@NewWindow,
	[System]=@System,
	InActiveMainMenuIconMap=@InActiveMainMenuIconMap,
	ActiveMainMenuIconMap=@ActiveMainMenuIconMap,
	BannerMap=@BannerMap,
	BannerContentLayer=@BannerContentLayer,
	Editor=@Editor,
	DedicatedTo=@DedicatedTo,
	CommentsPermission=@CommentsPermission

WHERE [ID]=@MainDirectoryID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==修改其 Overview PageDirectory 的 Name 
--=====================================================
UPDATE dbo.PageDirectory SET [Name]=@OverviewPageDirectoryName WHERE [ID]=@OverviewPageDirectoryID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==修改其 Overview SubDirectory 和 Overview PageDirectory 的 Name （MainDirectory 和 其 Overview SubDirectory 以及 Overview PageDirectory 的 Name 应该保持一致）
--==该机制暂缓启用
--=====================================================
/*
UPDATE dbo.SubDirectory SET [Name]=@Name WHERE [ID]=@OverviewSubDirectoryID
UPDATE dbo.PageDirectory SET [Name]=@Name WHERE [ID]=@OverviewPageDirectoryID
*/

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（修改了 @MainDirectoryID  对应的 md）
--=====================================================
EXEC dbo.SiteLogSave @User, 10, @MainDirectoryID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[MainDirectoryModify]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.MainDirectoryDelete    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MainDirectoryDelete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[MainDirectoryDelete]
GO

--====================================================================================
--==删除 MainDirectory 条目
--==删除 MainDirectory 条目的同时，会触发 Trigger 删除该 MainDirectory 对应的 SubDirectory 和 MainDirectoryContent
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-12-02
--====================================================================================

CREATE PROCEDURE dbo.MainDirectoryDelete

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@MainDirectoryID int				--即将被删除的 MainDirectory  条目的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查  （需要 Admin 或 ChiefEditor 权限）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'',0,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加
--=====================================================
DELETE FROM dbo.MainDirectory WHERE [ID]=@MainDirectoryID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（删除了 @MainDirectoryID  对应的 md）
--=====================================================
EXEC dbo.SiteLogSave @User, 16, @MainDirectoryID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[MainDirectoryDelete]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.SubDirectoryDelete    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SubDirectoryDelete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SubDirectoryDelete]
GO

--====================================================================================
--==删除 SubDirectory 条目
--==删除 SubDirectory 条目，触发 Trigger 同时删除 SubDirectoryContent 和 PageDirectory 中的相应项目
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-16
--====================================================================================

CREATE PROCEDURE dbo.SubDirectoryDelete

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@SubDirectoryID int,				--即将被删除的 SubDirectory  条目的 ID

@IsSystemMenu bit 				--删除是来自系统菜单吗？对于系统菜单，当本子菜单是系统主菜单（系统菜单整体表现为主菜单）下唯一的子菜单的时候，删除本项目，将同时删除整个系统主菜单

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据 SubDirectoryID 获得 MainDirectoryID
--=====================================================
DECLARE @MainDirectoryID INT
SELECT @MainDirectoryID=sd.MainDirectoryID FROM dbo.SubDirectory sd WHERE sd.[ID]=@SubDirectoryID

--=====================================================
--==用户权限检查（需要其上级权限）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'MainDirectory',@MainDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据 SubDirectoryID 获得对应的 MainDirectoryID，看看当前 MainDirectory 下是否只有这一个 SubDirectory，如果是，则举错（因为一个 MainDirectory 下应该至少有一个 SubDirectory）
--=====================================================
--DECLARE @MainDirectoryID INT
DECLARE @Count INT

--SELECT @MainDirectoryID=sd.MainDirectoryID FROM dbo.SubDirectory sd WHERE sd.[ID]=@SubDirectoryID
SELECT @Count=COUNT(sd.[ID]) FROM dbo.SubDirectory sd WHERE sd.MainDirectoryID=@MainDirectoryID

--=====================================================
--==如果是唯一的 SubDirectory 项目，则举错，否则，则正常删除
--=====================================================
IF @Count<=1

	BEGIN

		--=====================================================
		--==是否删除系统子菜单项目
		--=====================================================
		IF @IsSystemMenu=1

		BEGIN
			--=====================================================
			--==如果是删除系统子菜单，则，在当前系统子菜单是整个系统主菜单下唯一子项目的时候，我们同时删除整个系统主菜单
			--=====================================================
			DELETE FROM dbo.MainDirectory WHERE [ID]=@MainDirectoryID

			--=====================================================
			--==将当前活动记录在案（删除了整个系统主目录）
			--=====================================================
			EXEC dbo.SiteLogSave @User, 16, @MainDirectoryID
		END

		ELSE

		BEGIN
			--=====================================================
			--==举错（本情形不太可能发生）
			--=====================================================
			RAISERROR(N'您即将删除的子目录是其上级目录（主目录）下唯一子条目，不可以删除',16,1)
		END
	END
ELSE

	BEGIN
		--=====================================================
		--==删除
		--=====================================================
		DELETE FROM dbo.SubDirectory WHERE [ID]=@SubDirectoryID

		--=====================================================
		--==将当前活动记录在案（删除了子目录）
		--=====================================================
		EXEC dbo.SiteLogSave @User, 17, @SubDirectoryID
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[SubDirectoryDelete]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PageDirectoryDelete    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PageDirectoryDelete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PageDirectoryDelete]
GO

--====================================================================================
--==删除 PageDirectory 条目
--==删除 PageDirectory 条目，触发 Trigger 同时删除 Knowledge 和 PageDirectoryContent 条目
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-12-02
--====================================================================================

CREATE PROCEDURE dbo.PageDirectoryDelete

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@PageDirectoryID int				--即将被删除的 PageDirectory  条目的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据 PageDirectoryID 获得其上级 SubDirectoryID
--=====================================================
DECLARE @SubDirectoryID INT
SELECT @SubDirectoryID=pd.SubDirectoryID FROM dbo.PageDirectory pd WHERE pd.[ID]=@PageDirectoryID

--=====================================================
--==用户权限检查 （需要其上级权限）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'SubDirectory',@SubDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据 PageDirectoryID 获得对应的 SubDirectoryID，看看当前 SubDirectory 下是否只有这一个 PageDirectory，如果是，则举错（因为一个 SubDirectory 下应该至少有一个 PageDirectory）
--=====================================================
--DECLARE @SubDirectoryID2 INT
DECLARE @Count INT

--SELECT @SubDirectoryID2=pd.SubDirectoryID FROM dbo.PageDirectory pd WHERE pd.[ID]=@PageDirectoryID
SELECT @Count=COUNT(pd.[ID]) FROM dbo.PageDirectory pd WHERE pd.SubDirectoryID=@SubDirectoryID

--=====================================================
--==如果是唯一的 PageDirectory 项目，则举错，否则，则正常删除
--=====================================================
IF @Count<=1

	BEGIN
		--=====================================================
		--==举错
		--=====================================================
		RAISERROR(N'您即将删除的页目录是其上级目录（子目录）下唯一子条目，不可以删除',16,1)
	END

ELSE

	BEGIN
		--=====================================================
		--==删除
		--=====================================================
		DELETE FROM dbo.PageDirectory WHERE [ID]=@PageDirectoryID

		--=====================================================
		--==将当前活动记录在案（删除了页目录）
		--=====================================================
		EXEC dbo.SiteLogSave @User, 18, @PageDirectoryID
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PageDirectoryDelete]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeDelete    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeDelete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeDelete]
GO

--====================================================================================
--==删除 Knowledge 条目
--==删除 Knowledge 条目的时候， Knowledge 中的 Trigger 会被触发，执行对 KnowledgeContent 相应条目的删除
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-12-02
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeDelete

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@KnowledgeID int				--即将被删除的 Knowledge  条目的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据 @KnowledgeID 返回对应的 PageDirectoryID
--=====================================================
DECLARE @PageDirectoryID INT
SELECT @PageDirectoryID=now.PageDirectoryID FROM dbo.Knowledge now WHERE now.[ID]=@KnowledgeID

--=====================================================
--==用户权限检查 （删除权限要检查其上级）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'PageDirectory',@PageDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==删除
--=====================================================
DELETE FROM dbo.Knowledge WHERE [ID]=@KnowledgeID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（删除了 Knowledge -  KnowledgeContentID = @oNewID）
--=====================================================
EXEC dbo.SiteLogSave @User, 19, @KnowledgeID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeDelete]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.RegisterSave    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[RegisterSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[RegisterSave]
GO

--====================================================================================
--==保存用户注册
--==首先检查当前用户是否已经存在，如果存在，举错
--==将该创建用户的资料写入 Users 表（以 Community 角色）
--==注意：注册用户并不提供 Rank 参数，因此默认使用 1000000 作为其 Rank 值
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-24 
--====================================================================================

CREATE PROCEDURE dbo.RegisterSave

@Name nvarchar(50),					--用户名
@Password nvarchar(20),				--密码原文，这个密码用来建立数据库用户 （最大长度 20）
@EncryptedPassword nvarchar(200),			--密码的加密形式，这个密码将保存在 Users 表，在 Login 的时候，将用来同登录密码对照 （最大长度 200）
@FirstName nvarchar(50),				--姓
@LastName nvarchar(50),				--名
@Tel nvarchar(50),					--电话
@Email nvarchar(100),					--电子邮件
@Mobile nvarchar(50),					--移动电话
@Fax nvarchar(50),					--传真
@MSN nvarchar(100),					--MSN
@Skype nvarchar(100),					--Skype
@Twitter nvarchar(100),					--Twitter
@QQ nvarchar(100),					--QQ
@Address nvarchar(200),				--Address
@Sex int,						--性别
@Organization nvarchar(200),				--组织
@Position nvarchar(100),				--职位
@PortraitName nvarchar(1000),				--头像逻辑路径（ /Writable/UserAccountPortrait/<GUID>/PortraitName）
@Remark nvarchar(1000)				--备注

AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （不需要）
--=====================================================


--=====================================================
--==参数检查
--=====================================================
SET @Name=LTRIM(RTRIM(@Name))
SET @Password=LTRIM(RTRIM(@Password))
SET @EncryptedPassword=LTRIM(RTRIM(@EncryptedPassword))


--=====================================================
--==某些参数为空
--=====================================================
IF (@Name=N'') OR (@Name IS NULL) OR (@Password=N'') OR (@Password IS NULL) OR (@EncryptedPassword=N'') OR (@EncryptedPassword IS NULL)
BEGIN
	RAISERROR(N'用户名和密码不可为空。',16,1)
	RETURN
END


--=====================================================
--==如果用户已经存在
--=====================================================
IF dbo.UDF_PublicProfileExists(@Name)=1
BEGIN
	RAISERROR(N'您选择的用户名已经存在，请另选择一个名字。',16,1)
	RETURN
END


--=====================================================
--==本地变量  
--==新注册自动进入 UserRole (2 - Community)
--==新注册用户的 IsClient 属性自动为 2 (CANCEL)
--=====================================================
DECLARE @UserRole INT 	
SET @UserRole=dbo.UDF_UserRoleID(N'Community')

--=====================================================
--==将 UserRole 连同共同的 Name,Password,.... 保存到 Users 表
--=====================================================
INSERT INTO dbo.Users ([Name],[Password],FirstName,LastName,Tel,Email,Mobile,Fax,MSN,Skype,Twitter,QQ,Address,Sex,Organization,[Position],PortraitName,Remark,RegisterDate,UserRole) VALUES (@Name,@EncryptedPassword,@FirstName,@LastName,@Tel,@Email,@Mobile,@Fax,@MSN,@Skype,@Twitter,@QQ,@Address,@Sex,@Organization,@Position,@PortraitName,@Remark,GETDATE(),@UserRole)

--=====================================================
--==将该用户的 ReadEnabled, TopicWriteEnabled, FollowUpWriteEnabled 权限分配给所有 Public Forum
--=====================================================
--INSERT INTO dbo.UserForums ([User],Forum,ReadEnabled,TopicWriteEnabled,FollowUpWriteEnabled) SELECT @Name,[ID],1,1,1 FROM dbo.Forum WHERE [Public]=N'true'

--=====================================================
--==将用户加到注册默认组
--=====================================================
INSERT INTO dbo.UserGroups (UserGroupID,[User]) SELECT ug.[ID], @Name FROM dbo.UserGroup ug WHERE ug.RegisterDefault=1

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[RegisterSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.CommunityTreeSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CommunityTreeSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CommunityTreeSelect]
GO

--====================================================================================
--==从 View_CommunityTree 中获取全部或指定的记录
--==如果参数 CommunityDirectory 和 CommunityItem 是 NULL，则返回全部记录； 否则，返回指定的记录
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28 
--====================================================================================

CREATE PROCEDURE dbo.CommunityTreeSelect

@CommunityDirectory NVARCHAR(4000),		--Community 目录
@CommunityItem INT,					--Community ID
@Culture nvarchar(100)     				--指定文化  


AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果 @CommunityDirectory 和 @CommunityItem 都是 NULL
--=====================================================
IF @CommunityDirectory IS NULL AND @CommunityItem IS NULL

	--=====================================================
	--==返回整个 View_CommunityTree
	--=====================================================
	BEGIN
		SELECT * FROM dbo.View_CommunityTree WHERE Culture=@Culture ORDER BY Serial
	END

ELSE

	--=====================================================
	--==如果 @CommunityDirectory 和 @CommunityItem 都不是 NULL
	--=====================================================
	IF @CommunityDirectory IS NOT NULL AND @CommunityItem IS NOT NULL

		--=====================================================
		--==返回指定的 @CommunityDirectory 下的指定 Item
		--=====================================================
		BEGIN
			SELECT * FROM dbo.View_CommunityTree WHERE Directory IN (Select Element From dbo.UDF_PublicSplit(@CommunityDirectory,N',')) AND [ID]=@CommunityItem AND Culture=@Culture ORDER BY Serial
		END

	ELSE

		--=====================================================
		--==返回指定的 @CommunityDirectory 下的所有 Item
		--=====================================================
		BEGIN
			SELECT * FROM dbo.View_CommunityTree WHERE Directory IN (Select Element From dbo.UDF_PublicSplit(@CommunityDirectory,N',')) AND Culture=@Culture ORDER BY Serial
		END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[CommunityTreeSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.CommunitySelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CommunitySelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CommunitySelect]
GO

--====================================================================================
--==根据给定的  CommunityItem (Community ID) 获得 Community 表中的指定记录
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-22 
--====================================================================================

CREATE PROCEDURE dbo.CommunitySelect

@CommunityItem INT				--Community 记录 ID

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择
--====================================================================================
SELECT
	[ID] AS [ID],
	Serial AS Serial,
	[Name] AS [Name],
	Moderator AS Moderator,
	ISNULL([Public],N'false') AS [Public],
	InActiveMainMenuIconMap AS InActiveMainMenuIconMap,
	ActiveMainMenuIconMap AS ActiveMainMenuIconMap,
	BannerMap AS BannerMap,
	BannerContentLayer AS BannerContentLayer,
	ReadPermission AS ReadPermission,
	TopicWritePermission AS TopicWritePermission,
	FollowUpWritePermission AS FollowUpWritePermission

FROM dbo.Community

WHERE [ID]=@CommunityItem

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[CommunitySelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ForumSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ForumSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ForumSelect]
GO

--====================================================================================
--==根据给定的  CommunityItem (Forum ID) 获得 Forum 表中的指定记录
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-22 
--====================================================================================

CREATE PROCEDURE dbo.ForumSelect

@CommunityItem INT				--Forum 记录 ID

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择 Forum 表
--====================================================================================
SELECT
	[ID] AS [ID],
	CommunityID AS CommunityID,
	Serial AS Serial,
	[Name] AS [Name],
	Moderator AS Moderator,
	ISNULL([Public],N'true') AS [Public],
	ReadPermission AS ReadPermission,
	TopicWritePermission AS TopicWritePermission,
	FollowUpWritePermission AS FollowUpWritePermission

FROM dbo.Forum

WHERE [ID]=@CommunityItem


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ForumSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.CommunitySave    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CommunitySave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CommunitySave]
GO

--====================================================================================
--==保存 Community
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-22 
--====================================================================================

CREATE PROCEDURE dbo.CommunitySave

@User nvarchar(50),					--从 ASPX 端传递过来的当前用户名

@Serial int,						--当前 Community 的序列号（每条 Community  的显示次序由该 Serial 决定，序列号越大，越先显示）
@Name nvarchar(50),					--当前 Community 的名字
@Moderator NVARCHAR(1000),				--当前 Community 的 Moderator 属性
@Public NVARCHAR(50),				--当前 Community 的 Public 属性
@InActiveMainMenuIconMap ntext,			--当前 Community 的 InActiveMainMenuIconMap
@ActiveMainMenuIconMap ntext,			--当前 Community 的 ActiveMainMenuIconMap
@BannerMap ntext,					--当前 Community 的 BannerMap
@BannerContentLayer ntext,				--当前 Community 的 BannerContentLayer
@ReadPermission ntext,					--当前 Community 的 ReadPermission
@TopicWritePermission ntext,				--当前 Community 的 TopicWritePermission
@FollowUpWritePermission ntext,				--当前 Community 的 FollowUpWritePermission

@oNewID int OUT					--新记录的 ID ，输出参数

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加
--=====================================================
INSERT INTO dbo.Community(Serial,[Name],Moderator,[Public],InActiveMainMenuIconMap,ActiveMainMenuIconMap,BannerMap,BannerContentLayer,ReadPermission,TopicWritePermission,FollowUpWritePermission) VALUES(@Serial,@Name,dbo.UDF_ModeratorClean(@Moderator),@Public,@InActiveMainMenuIconMap,@ActiveMainMenuIconMap,@BannerMap,@BannerContentLayer,@ReadPermission,@TopicWritePermission,@FollowUpWritePermission)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==立即捕获刚刚保存的那条消息的 ID
--======================================================
SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Session 内的本表）

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[CommunitySave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ForumSave    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ForumSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ForumSave]
GO

--====================================================================================
--==保存 Forum
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-22 
--====================================================================================

CREATE PROCEDURE dbo.ForumSave

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@CommunityID int,			--当前 Forum 对应的 Community 的 ID

@Serial int,				--当前 Forum 的序列号（每条 Forum  的显示次序由该 Serial 决定，序列号越大，越先显示）
@Name nvarchar(50),			--当前 Forum 的名字
@Moderator nvarchar(1000),		--当前 Forum 的斑竹列表（以“，”隔开）
@Public nvarchar(50),			--当前 Forum 是否 Public
@ReadPermission ntext,			--当前 Forum 是否 ReadPermission
@TopicWritePermission ntext,		--当前 Forum 是否 TopicWritePermission
@FollowUpWritePermission ntext,		--当前 Forum 是否 FollowUpWritePermission

@oNewID int OUT			--新记录的 ID ，输出参数

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加 
--=====================================================
INSERT INTO dbo.Forum(CommunityID,Serial,[Name],Moderator,[Public],ReadPermission,TopicWritePermission,FollowUpWritePermission) VALUES(@CommunityID,@Serial,@Name,dbo.UDF_ModeratorClean(@Moderator),@Public,@ReadPermission,@TopicWritePermission,@FollowUpWritePermission)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==立即捕获刚刚保存的那条消息的 ID
--======================================================
SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Session 内的本表）

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ForumSave]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.CommunityModify    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CommunityModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CommunityModify]
GO

--====================================================================================
--==修改 Community
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-22 
--====================================================================================

CREATE PROCEDURE dbo.CommunityModify

@User nvarchar(50),					--从 ASPX 端传递过来的当前用户名

@CommunityID int,					--当前 Community 的 ID

@Serial int,						--当前 Community 的序列号（每条 Community 的显示次序由该 Serial 决定，序列号越大，越先显示）
@Name nvarchar(50),					--当前 Community 的名字
@Moderator NVARCHAR(1000),				--当前 Community 的 Moderator 属性
@Public NVARCHAR(50),				--当前 Community 的 Public 属性
@InActiveMainMenuIconMap ntext,			--当前 Community 的 InActiveMainMenuIconMap
@ActiveMainMenuIconMap ntext,			--当前 Community 的 ActiveMainMenuIconMap
@BannerMap ntext,					--当前 Community 的 BannerMap
@BannerContentLayer ntext,				--当前 Community 的 BannerContentLayer
@ReadPermission ntext,					--当前 Community 的 ReadPermission
@TopicWritePermission ntext,				--当前 Community 的 TopicWritePermission
@FollowUpWritePermission ntext				--当前 Community 的 FollowUpWritePermission


AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加
--=====================================================
UPDATE dbo.Community SET

	Serial=@Serial,
	[Name]=@Name,
	Moderator=dbo.UDF_ModeratorClean(@Moderator),
	[Public]=@Public,
	InActiveMainMenuIconMap=@InActiveMainMenuIconMap,
	ActiveMainMenuIconMap=@ActiveMainMenuIconMap,
	BannerMap=@BannerMap,
	BannerContentLayer=@BannerContentLayer,
	ReadPermission=@ReadPermission,
	TopicWritePermission=@TopicWritePermission,
	FollowUpWritePermission=@FollowUpWritePermission

WHERE [ID]=@CommunityID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[CommunityModify]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ForumModify    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ForumModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ForumModify]
GO

--====================================================================================
--==修改 Forum
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-22 
--====================================================================================

CREATE PROCEDURE dbo.ForumModify

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@ForumID int,				--当前 Forum 的 ID

@Serial int,				--当前 Forum 的序列号（每条 Forum 的显示次序由该 Serial 决定，序列号越大，越先显示）
@Name nvarchar(50),			--当前 Forum 的名字
@Moderator nvarchar(1000),		--当前 Forum 的斑竹列表（用 “，” 隔开）
@Public nvarchar(50),			--当前 Forum 是否 Public （创建用户的时候，会自动为新建用户分配 Public Forum 的浏览，发帖，回帖权限）
@ReadPermission ntext,			--当前 Forum 的 ReadPermission
@TopicWritePermission ntext,		--当前 Forum 的 TopicWritePermission
@FollowUpWritePermission ntext		--当前 Forum 的 FollowUpWritePermission


AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==修改 
--=====================================================
UPDATE dbo.Forum SET

	Serial=@Serial,
	[Name]=@Name,
	Moderator=dbo.UDF_ModeratorClean(@Moderator),
	[Public]=@Public,
	ReadPermission=@ReadPermission,
	TopicWritePermission=@TopicWritePermission,
	FollowUpWritePermission=@FollowUpWritePermission

WHERE [ID]=@ForumID


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ForumModify]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.CommunityDelete    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CommunityDelete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CommunityDelete]
GO

--====================================================================================
--==删除 Community 条目
--==删除 Community 条目会引发 Trigger 同时删除 CommunityContent 和 Forum 中对应的记录
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-11-08 
--====================================================================================

CREATE PROCEDURE dbo.CommunityDelete

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@CommunityID int				--即将被删除的 Community  条目的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加
--=====================================================
DELETE FROM dbo.Community WHERE [ID]=@CommunityID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[CommunityDelete]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ForumDelete    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ForumDelete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ForumDelete]
GO

--====================================================================================
--==删除 Forum 条目
--==删除该条目，引发 Trigger 会同时删除 Topic 中相应记录
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-04-05
--====================================================================================

CREATE PROCEDURE dbo.ForumDelete

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@ForumID int				--即将被删除的 Forum  条目的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据 @ForumID 获得对应的 CommunityID
--=====================================================
DECLARE @CommunityID INT
SELECT @CommunityID=dbo.UDF_GetCommunityIDFromForumID(@ForumID)

--=====================================================
--==看看当前 Community 下是否只有这一个 Forum，如果是，则举错（因为一个 Community 下应该至少有一个 Forum）
--=====================================================
DECLARE @Count INT
SELECT @Count=COUNT(fo.[ID]) FROM dbo.Forum fo WHERE fo.CommunityID=@CommunityID

--=====================================================
--==如果是唯一的 Forum  项目，则举错，否则，则正常删除
--=====================================================
IF @Count<=1

	BEGIN
		--=====================================================
		--==举错
		--=====================================================
		RAISERROR(N'您即将删除的论坛（Forum）是其所属社区（Community）下唯一论坛，不可以删除',16,1)
	END

ELSE

	BEGIN
		--=====================================================
		--==删除
		--=====================================================
		DELETE FROM dbo.Forum WHERE [ID]=@ForumID
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ForumDelete]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeQuery    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeQuery]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeQuery]
GO

--====================================================================================
--==这个 SP 的作用：根据给定线索，查询 Knowledge 
--==参数：搜索 Keyword，如果参数为NULL, 则该项不参与检索
--==参数：Culture ，只搜索给定文化下的内容
--==建立分页机制，先将正常查询结果存入一个结构一样（但多了一个PagingID的表变量），根据PagingID，@PageSize，@CurrentPage选取当前页的记录，并将总页数作为一个追加栏位输出
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-09-06
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeQuery

@User nvarchar(50),			--从 ASPX 传递过来的当前用户

@Keyword nvarchar(50),			--搜索关键词 （最多50字，可以防止恶意搜索）
@Culture nvarchar(100),			--指定文化

@PageSize INT,			--页码机制：每页的尺寸
@CurrentPage INT,			--页码机制：当前页
@OrderBy nvarchar(100),		--进行排序的列名
@OrderByOrder nvarchar(10)		--排序方式 ASC, DESC

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==参数的逃逸处理（仅在存在动态语句的地方使用）
--=====================================================
SET @Keyword=dbo.UDF_PublicStringEscape(@Keyword)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==权限检查（不需要）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用来构建 Where 从句
--=====================================================
DECLARE @DynSQL NVARCHAR(4000)    
DECLARE @DynWhere NVARCHAR(4000)

--=====================================================
--==创建分页表 
--=====================================================
SET @DynSQL=N' SET NOCOUNT ON   '
SET @DynSQL=@DynSQL + N' Declare @Paging table '
SET @DynSQL=@DynSQL + N' ( '
SET @DynSQL=@DynSQL + N' PagingID int identity(1,1), '
SET @DynSQL=@DynSQL + N' [ID] int, '
SET @DynSQL=@DynSQL + N' Title nvarchar(2000) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' Content ntext COLLATE database_default, '
SET @DynSQL=@DynSQL + N' PageDirectoryName nvarchar(100) COLLATE database_default '
SET @DynSQL=@DynSQL + N' ) '

--=====================================================
--==从 Option 表返回 KnowledgeApprove 属性
--=====================================================
SET @DynSQL=@DynSQL + N' Declare @KnowledgeApprove nvarchar(50) '
SET @DynSQL=@DynSQL + N' Select @KnowledgeApprove=convert(nvarchar(50),opt.[Value]) From dbo.[Option] opt Where opt.[Key]=N''KnowledgeApprove'' '

--=====================================================
--==填充分页表 
--=====================================================
SET @DynSQL=@DynSQL + N' Insert into @Paging '

SET @DynSQL=@DynSQL + N' Select    '  
SET @DynSQL=@DynSQL + N' now.[ID] as [ID], '
SET @DynSQL=@DynSQL + N' Case nowc.Title When Null Then N''No Title'' When N'''' Then N''No Title'' Else nowc.Title End as Title, '
SET @DynSQL=@DynSQL + N' nowc.Content as Content, '
SET @DynSQL=@DynSQL + N' pd.[Name] as PageDirectoryName '

SET @DynSQL=@DynSQL + N' From dbo.Knowledge now '
SET @DynSQL=@DynSQL + N' Left Join dbo.KnowledgeContent nowc on nowc.KnowledgeID=now.[ID] And nowc.Culture='''  + @Culture +  N''''
SET @DynSQL=@DynSQL + N' Left Join dbo.PageDirectory pd on pd.[ID]=now.PageDirectoryID '

--=====================================================
--==根据当前用户权限，使用不同条件 
--=====================================================
IF dbo.UDF_UserAdminEditor(@User)=1

	BEGIN
		SET @DynSQL=@DynSQL + N' WHERE 1=1 '
	END

ELSE

	BEGIN
		SET @DynSQL=@DynSQL + N' Left Join dbo.View_KnowledgePermission nowp on nowp.KnowledgeID=now.[ID] '
		SET @DynSQL=@DynSQL + N' WHERE (REPLACE(nowp.DedicatedTo,N'','',N'''')=N''''  or dbo.UDF_UserDedicatedTo(N''' + @User + N''',nowp.DedicatedTo)=1)  AND nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N''false'') '
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
--=====================================================
--==其它动态 WHERE 从句
--=====================================================
SET @DynWhere=N''
		
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
--=====================================================
--==@Keyword 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--==注意：这里分别从 Title 和 Content 中进行搜索
--=====================================================
IF @Keyword IS NOT NULL  
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @Keyword 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @Keyword=RTRIM(LTRIM(@Keyword)) 
		
	IF @Keyword<>N'' 
	BEGIN		
		SET @DynWhere=@DynWhere + N' and (nowc.Title like N''%' + @Keyword + N'%'' or nowc.Content like N''%' + @Keyword + N'%'') ' 
	END
END
	
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
--===========================================================
--==前面的 SQL 语句最后加 其它动态 WHERE 从句 （@DynSQL 中已经包含 WHERE 1=1）
--===========================================================
SET @DynSQL=@DynSQL + @DynWhere
		
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--===========================================================
--==加上 Order By 从句
--==如果 OrderBy='' 则，使用缺省 order by UpdateTime DESC
--===========================================================
SET @OrderBy=LTRIM(RTRIM(@OrderBy))
SET @OrderByOrder=LTRIM(RTRIM(@OrderByOrder))
		
IF LEN(@OrderBy)=0 OR  LEN(@OrderByOrder)=0
	BEGIN
	SET @DynSQL=@DynSQL + N' order by Title DESC '
	END
ELSE
	BEGIN
	SET @DynSQL=@DynSQL + N' order by [' + @OrderBy + N'] ' + @OrderByOrder
	END
		

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
--=====================================================
--==最后从 @Paging 表变量中获取数据
--=====================================================
Declare @FirstRecord int
Declare @LastRecord int
		
set @FirstRecord=(@CurrentPage - 1) * @PageSize	--当前页第一个记录前
set @LastRecord=(@CurrentPage * @PageSize + 1)	--当前页最后一个记录后
		
--=====================================================
--==总记录数，除以每页的记录数，用Ceiling()处理，得到的为页数 （注意：count(*)  和 @PageSize 都为 INT，它们相除将得到 INT，所以，首先要将它们转换成 Decimal(18,2)）
--=====================================================
set @DynSQL=@DynSQL + N' Select *,PageCount=CEILING (Convert(decimal(18,2),(select count(*) from @Paging)) / Convert(decimal(18,2),' + Convert(nvarchar(20),@PageSize) + N')) From @Paging Where PagingID>' + Convert(nvarchar(20),@FirstRecord) + N' and PagingID<' + Convert(nvarchar(20),@LastRecord)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--============================================
--==检查动态语句的长度，不可以超过系统上限
--============================================
DECLARE @oPassDynSQL INT
EXEC dbo.PublicDynSQLLengthCheck @DynSQL,@oPassDynSQL OUT
IF @oPassDynSQL=0 BEGIN RETURN END

--=====================================================
--==执行动态 SQL 语句， 开始统计
--=====================================================
EXEC(@DynSQL)
RETURN

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeQuery]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserAccountOnlineList    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserAccountOnlineList]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserAccountOnlineList]
GO

--====================================================================================
--==从 Users 表获得当前在线用户列表
--==调用 UDF_PublicLoginOnline 以检查某个用户是否在线
--==该 SP 用于 DataRestoreUI.cs 以判断当前是否可以进行 Restore ，进行 Restore 的一个安全措施是，必须保证当前没有用户在线
--==2008/11/19 在目前的情势下，UDF_PublicLoginOnline 始终返回 0， 所以，这里的 UserAccountOnlineList 始终返回空 （因为我们不再使用数据库级用户系统，而是 Table 级用户系统，目前 UserOnLine 机制只所以还继续保留（虽然已经没用），是希望以后在 Table 级也实现用户是否在线跟踪，比如，一个用户登陆后，在其 Profile 中设置一个 online 标志，离开后，设置一个 offline 标志，但这是以后的计划）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-11-08 
--====================================================================================

CREATE PROCEDURE dbo.UserAccountOnlineList

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

SELECT DISTINCT
		usr.[Name] AS [Name]

FROM dbo.Users usr
WHERE dbo.UDF_PublicLoginOnline(usr.[Name])=1

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserAccountOnlineList]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.MainDirectoryContentSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MainDirectoryContentSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[MainDirectoryContentSelect]
GO

--====================================================================================
--==根据给定的  KnowledgeItem (MainDirectory ID) 获得 MainDirectoryContent 表中 所有 Culture 下的记录的指定记录
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-22
--====================================================================================

CREATE PROCEDURE dbo.MainDirectoryContentSelect

@KnowledgeItem INT				--MainDirectory 记录 ID

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择
--====================================================================================
SELECT
	mdc.[ID] AS [ID],
	mdc.MainDirectoryID AS MainDirectoryID,
	mdc.Culture AS Culture,
	mdc.Title AS Title,
	mdc.[Description] AS [Description],
	mdc.Hidden AS Hidden,
	mdc.HiddenInNavigationOnly AS HiddenInNavigationOnly,
	mdc.PageHeader AS PageHeader,
	mdc.PageFooter AS PageFooter,

	mdc.Url AS Url,
	ISNULL(mdc.ThisIsLink,0) AS ThisIsLink,

	mdc.Title AS ActionIndicatorTitle

FROM dbo.MainDirectoryContent mdc 

WHERE mdc.MainDirectoryID=@KnowledgeItem

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[MainDirectoryContentSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.SubDirectoryContentSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SubDirectoryContentSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SubDirectoryContentSelect]
GO

--====================================================================================
--==根据给定的  KnowledgeItem (SubDirectory ID) 获得 SubDirectoryContent 表中所有 Culture 下的记录
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-22
--====================================================================================

CREATE PROCEDURE dbo.SubDirectoryContentSelect

@KnowledgeItem INT				--SubDirectory 记录 ID

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择
--====================================================================================
SELECT
	sdc.[ID] AS [ID],
	sdc.SubDirectoryID AS SubDirectoryID,
	sdc.Culture AS Culture,
	sdc.Title AS Title,
	sdc.[Description] AS [Description],
	sdc.WizardPreviousTitle AS WizardPreviousTitle,
	sdc.WizardNextTitle AS WizardNextTitle,
	sdc.Hidden AS Hidden,
	sdc.HiddenInNavigationOnly AS HiddenInNavigationOnly,
	sdc.PageHeader,
	sdc.PageFooter,

	sdc.Url AS Url,
	ISNULL(sdc.ThisIsLink,0) AS ThisIsLink,

	mdc.Title + N' / ' + sdc.title AS ActionIndicatorTitle


FROM dbo.SubDirectoryContent sdc 
LEFT JOIN dbo.SubDirectory sd ON sd.[ID]=sdc.SubDirectoryID
LEFT JOIN dbo.MainDirectory md ON md.[ID]=sd.MainDirectoryID
LEFT JOIN dbo.MainDirectoryContent mdc ON md.[ID]=mdc.MainDirectoryID AND mdc.Culture=sdc.Culture

WHERE sdc.SubDirectoryID=@KnowledgeItem

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[SubDirectoryContentSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PageDirectoryContentSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PageDirectoryContentSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PageDirectoryContentSelect]
GO

--====================================================================================
--==根据给定的  KnowledgeItem (PageDirectory ID) 获得 PageDirectoryContent 表中所有记录下的记录
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-22
--====================================================================================

CREATE PROCEDURE dbo.PageDirectoryContentSelect

@KnowledgeItem INT				--PageDirectory 记录 ID

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择
--====================================================================================
SELECT
	pdc.[ID] AS [ID],
	pdc.PageDirectoryID AS PageDirectoryID,
	pdc.Culture AS Culture,
	pdc.SeoTitle AS SeoTitle,
	pdc.SeoDescription AS SeoDescription,
	pdc.SeoKeywords AS SeoKeywords,
	pdc.Title AS Title,
	pdc.[Description] AS [Description],
	pdc.Template AS Template,
	pdc.Hidden AS Hidden,
	pdc.HiddenInNavigationOnly AS HiddenInNavigationOnly,
	pdc.PageHeader AS PageHeader,
	pdc.PageFooter AS PageFooter,

	pdc.Url AS Url,
	ISNULL(pdc.ThisIsLink,0) AS ThisIsLink,

	--mdc.Title + N' / ' + sdc.Title + N' / ' + pdc.Title AS ActionIndicatorTitle

	ActionIndicatorTitle=

	CASE
		WHEN (sd.Overview=1) AND (pd.Overview=1) THEN mdc.Title
		WHEN pd.Overview=1 THEN mdc.Title + N' / ' + sdc.Title
		ELSE mdc.Title + N' / ' + sdc.Title + N' / ' + pdc.Title
	END

FROM dbo.PageDirectoryContent pdc
LEFT JOIN dbo.PageDirectory pd ON pd.[ID]=pdc.PageDirectoryID
LEFT JOIN dbo.SubDirectory sd ON sd.[ID]=pd.SubDirectoryID
LEFT JOIN dbo.SubDirectoryContent sdc ON sd.[ID]=sdc.SubDirectoryID AND sdc.Culture=pdc.Culture
LEFT JOIN dbo.MainDirectory md ON md.[ID]=sd.MainDirectoryID
LEFT JOIN dbo.MainDirectoryContent mdc ON md.[ID]=mdc.MainDirectoryID AND mdc.Culture=pdc.Culture

WHERE pdc.PageDirectoryID=@KnowledgeItem

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PageDirectoryContentSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeContentSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeContentSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeContentSelect]
GO

--====================================================================================
--==根据给定的  Knowledge ID 以 获得 KnowledgeContent 表中所有文化下的记录
--====================================================================================
--==版权所有 2001-2011 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-04-08
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeContentSelect

@KnowledgeItem INT				--Knowledge 记录 ID

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择
--====================================================================================
SELECT
	nowc.[ID] AS [ID],
	nowc.KnowledgeID AS KnowledgeID,
	nowc.Culture AS Culture,
	--nowc.Template AS Template,
	nowc.Title AS Title,
	--nowc.TitleShow AS TitleShow,
	nowc.Content AS Content,
	nowc.Tag AS Tag,
	nowc.Hidden AS Hidden,
	nowc.Approved AS Approved,
	nowc.ApproveMessage AS ApproveMessage,
	nowc.ApprovedBy AS ApprovedBy,
	nowc.Abstract AS Abstract,

	--mdc.Title + N' / ' + sdc.Title + N' / ' + pdc.title + N'  / ' + nowc.Title AS ActionIndicatorTitle

	ActionIndicatorTitle=

	CASE
		WHEN (sd.Overview=1) AND (pd.Overview=1) THEN mdc.Title + N' / ' + nowc.Title
		WHEN pd.Overview=1 THEN mdc.Title + N' / ' + sdc.Title + N' / ' + nowc.Title
		ELSE mdc.Title + N' / ' + sdc.Title + N' / ' + pdc.title + N'  / ' + nowc.Title
	END

FROM dbo.KnowledgeContent nowc
LEFT JOIN dbo.Knowledge now ON now.[ID]=nowc.KnowledgeID
LEFT JOIN dbo.PageDirectory pd ON pd.[ID]=now.PageDirectoryID
LEFT JOIN dbo.PageDirectoryContent pdc ON pd.[ID]=pdc.PageDirectoryID AND pdc.Culture=nowc.Culture
LEFT JOIN dbo.SubDirectory sd ON sd.[ID]=pd.SubDirectoryID
LEFT JOIN dbo.SubDirectoryContent sdc ON sd.[ID]=sdc.SubDirectoryID AND sdc.Culture=nowc.Culture
LEFT JOIN dbo.MainDirectory md ON md.[ID]=sd.MainDirectoryID
LEFT JOIN dbo.MainDirectoryContent mdc ON md.[ID]=mdc.MainDirectoryID AND mdc.Culture=nowc.Culture

WHERE nowc.KnowledgeID=@KnowledgeItem

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeContentSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.MainDirectoryContentModify    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MainDirectoryContentModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[MainDirectoryContentModify]
GO

--====================================================================================
--==修改 MainDirectoryContent 记录
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-22
--====================================================================================

CREATE PROCEDURE dbo.MainDirectoryContentModify

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@MainDirectoryID int,			--当前 MainDirectory 的 ID

@Title nvarchar(200),			--当前 MainDirectory Content的标题
@Description nvarchar(1000),		--当前 MainDirectory Content的描述
@Hidden bit,				--当前 MainDirectory Content 是否隐藏
@HiddenInNavigationOnly bit,		--这种隐藏是否只限于在导航中隐藏（在这种情形，被隐藏的内容被引用或链接的时候仍然会显示，但不会出现在导航中）

@PageHeader ntext,			--当前 mainDirectoryContent 级的 PageHeader （将向下继承）
@PageFooter ntext,			--当前 mainDirectoryContent 级的 PageFooter （将向下继承）

@Url nvarchar(2000),			--当前 MainDirectory Content 的 Url
@ThisIsLink bit,				--当前 MainDirectory Content 的 ThisIsLink

@Culture nvarchar(100)			--当前 MainDirectory Content 的文化


AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'MainDirectory',@MainDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果当前 @MainDirectoryID 当前 @Culture 下的 MainDirecytoryContent 记录存在，则修改之，否则，添加之 （因为一个站点可能在后来添加新的文化）
--=====================================================
IF EXISTS (Select [ID] From dbo.MainDirectoryContent Where MainDirectoryID=@MainDirectoryID And Culture=@Culture)

	BEGIN
		--=====================================================
		--==修改 MainDirectoryContent
		--=====================================================
		UPDATE dbo.MainDirectoryContent SET

			Title=@Title,
			[Description]=@Description,
			Hidden=@Hidden,
			HiddenInNavigationOnly=@HiddenInNavigationOnly,
			PageHeader=@PageHeader,
			PageFooter=@PageFooter,
			Url=@Url,
			ThisIsLink=@ThisIsLink

		WHERE MainDirectoryID=@MainDirectoryID AND Culture=@Culture
	END

ELSE

	BEGIN
		--=====================================================
		--==添加 MainDirectoryContent
		--=====================================================
		INSERT INTO dbo.MainDirectoryContent 

		(
			MainDirectoryID,
			Culture,
			Title,
			[Description],
			Hidden,
			HiddenInNavigationOnly,
			PageHeader,
			PageFooter,
			Url,
			ThisIsLink
		)

		VALUES

		(
			@MainDirectoryID,
			@Culture,
			@Title,
			@Description,
			@Hidden,
			@HiddenInNavigationOnly,
			@PageHeader,
			@PageFooter,
			@Url,
			@ThisIsLink
		)
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==同时让其 Overview SubDirectoryContent 继承 Title 和 Description 属性
--=====================================================
DECLARE @OverviewSubDirectoryID INT
SELECT @OverviewSubDirectoryID=dbo.UDF_GetOverviewSubDirectory(@MainDirectoryID)

UPDATE dbo.SubDirectoryContent SET [Title]=@Title, [Description]=@Description WHERE SubDirectoryID=@OverviewSubDirectoryID AND [Culture]=@Culture

--=====================================================
--==同时让其 Overview PageDirectoryContent 继承 Title 和 Description 属性
--=====================================================
DECLARE @OverviewPageDirectoryID INT
SELECT @OverviewPageDirectoryID=dbo.UDF_GetOverviewPageDirectory(N'MainDirectory',@MainDirectoryID)

UPDATE dbo.PageDirectoryContent SET [Title]=@Title, [Description]=@Description WHERE PageDirectoryID=@OverviewPageDirectoryID AND [Culture]=@Culture

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[MainDirectoryContentModify]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.SubDirectoryContentModify    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SubDirectoryContentModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SubDirectoryContentModify]
GO

--====================================================================================
--==修改 SubDirectoryContent
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS
--==最新修改 2010-08-22
--====================================================================================

CREATE PROCEDURE dbo.SubDirectoryContentModify

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@SubDirectoryID int,			--当前 SubDirectory 的 ID

@Title nvarchar(200),			--当前 SubDirectory Content 的标题
@Description nvarchar(1000),		--当前 SubDirectory Content 的描述
@WizardPreviousTitle nvarchar(200),	--当前 SubDirectory 的 Wizard 属性为 true 的时候， SubDirectory 下的 PageDirectory 内容的后面，加一段 Wizard 导航，这里是导航中 “Previous” 链接的标签文字
@WizardNextTitle nvarchar(200),		--当前 SubDirectory 的 Wizard 属性为 true 的时候， SubDirectory 下的 PageDirectory 内容的后面，加一段 Wizard 导航，这里是导航中 "Next" 链接的标签文字
@Hidden bit,				--前前 SubDirectory Content 是否隐藏
@HiddenInNavigationOnly bit,		--这种隐藏是否只限于在导航中隐藏（在这种情形，被隐藏的内容被引用或链接的时候仍然会显示，但不会出现在导航中）

@PageHeader ntext,			--当前 SubDirectory 级的 PageHeader （将向下继承）
@PageFooter ntext,			--当前 SubDirectory 级的 PageFooter （将向下继承）

@Url nvarchar(2000),			--当前 SubDirectory Content 的 Url 字符串
@ThisIsLink bit,				--当前 SubDirectory Content 的 ThisIsLink Flag

@Culture nvarchar(100)			--当前 SubDirectory Content 的文化

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'SubDirectory',@SubDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果当前 @SubDirectoryID 当前 @Culture 下的 SubDirectoryContent 记录存在，则修改之，否则，添加之 （因为一个站点可能在后来添加新的文化）
--=====================================================
IF EXISTS (Select [ID] From dbo.SubDirectoryContent Where SubDirectoryID=@SubDirectoryID And Culture=@Culture)

	BEGIN
		--=====================================================
		--==修改 SubDirectoryContent
		--=====================================================
		UPDATE dbo.SubDirectoryContent SET

			Title=@Title,
			[Description]=@Description,
			WizardPreviousTitle=@WizardPreviousTitle,
			WizardNextTitle=@WizardNextTitle,
			Hidden=@Hidden,
			HiddenInNavigationOnly=@HiddenInNavigationOnly,
			PageHeader=@PageHeader,
			PageFooter=@PageFooter,
			Url=@Url,
			ThisIsLink=@ThisIsLink

		WHERE SubDirectoryID=@SubDirectoryID AND Culture=@Culture
	END

ELSE

	BEGIN
		--=====================================================
		--==添加 SubDirectoryContent
		--=====================================================
		INSERT INTO dbo.SubDirectoryContent 

		(
			SubDirectoryID,
			Culture,
			Title,
			[Description],
			WizardPreviousTitle,
			WizardNextTitle,
			Hidden,
			HiddenInNavigationOnly,
			PageHeader,
			PageFooter,
			Url,
			ThisIsLink
		)

		VALUES

		(
			@SubDirectoryID,
			@Culture,
			@Title,
			@Description,
			@WizardPreviousTitle,
			@WizardNextTitle,
			@Hidden,
			@HiddenInNavigationOnly,
			@PageHeader,
			@PageFooter,
			@Url,
			@ThisIsLink
		)
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==同时让其 Overview PageDirectoryContent 继承 Title 和 Description 属性
--=====================================================
DECLARE @OverviewPageDirectoryID INT
SELECT @OverviewPageDirectoryID=dbo.UDF_GetOverviewPageDirectory(N'SubDirectory',@SubDirectoryID)

UPDATE dbo.PageDirectoryContent SET [Title]=@Title, [Description]=@Description WHERE PageDirectoryID=@OverviewPageDirectoryID AND [Culture]=@Culture

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[SubDirectoryContentModify]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PageDirectoryContentModify    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PageDirectoryContentModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PageDirectoryContentModify]
GO

--====================================================================================
--==修改 PageDirectoryContent
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-22
--====================================================================================

CREATE PROCEDURE dbo.PageDirectoryContentModify

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@PageDirectoryID int,			--当前 PageDirectory 的 ID

@SeoTitle nvarchar(200),		--当前 PageDirectory Content 的 SeoTitle
@SeoDescription ntext,			--当前 PageDirectory Content 的 SeoDescription
@SeoKeywords ntext,			--当前 PageDirectory Content 的 SeoKeywords
@Title nvarchar(200),			--当前 PageDirectory Content 的标题
@Description nvarchar(1000),		--当前 PageDirectory Content 的描述
@Template nvarchar(200),		--当前 PageDirectory Content 的 Template
@Hidden bit,				--当前 PageDirectory Content 是否隐藏
@HiddenInNavigationOnly bit,		--这种隐藏是否只限于在导航中隐藏（在这种情形，被隐藏的内容被引用或链接的时候仍然会显示，但不会出现在导航中）
@PageHeader ntext,			--当前 PageDirectory Content 的 PageHeader 部分
@PageFooter ntext,			--当前 PageDirectory Content 的 PageFooter 部分

@Url nvarchar(2000),			--当前 PageDirectory Content 的 Url 字符串
@ThisIsLink bit,				--当前 PageDirectory Content 的 ThisIsLink Flag

@Culture nvarchar(100)			--当前 PageDirectory Content 的文化


AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'PageDirectory',@PageDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果当前 @PageDirectoryID 当前 @Culture 下的 PageDirectoryContent 记录存在，则修改之，否则，添加之 （因为一个站点可能在后来添加新的文化）
--=====================================================
IF EXISTS (Select [ID] From dbo.PageDirectoryContent Where PageDirectoryID=@PageDirectoryID And Culture=@Culture)

	BEGIN
		--=====================================================
		--==修改 PageDirectory Content
		--=====================================================
		UPDATE dbo.PageDirectoryContent SET

			SeoTitle=@SeoTitle,
			SeoDescription=@SeoDescription,
			SeoKeywords=@SeoKeywords,
			Title=@Title,
			[Description]=@Description,
			Template=@Template,
			Hidden=@Hidden,
			HiddenInNavigationOnly=@HiddenInNavigationOnly,
			PageHeader=@PageHeader,
			PageFooter=@PageFooter,
			Url=@Url,
			ThisIsLink=@ThisIsLink

		WHERE PageDirectoryID=@PageDirectoryID AND Culture=@Culture
	END

ELSE

	BEGIN
		--=====================================================
		--==添加 PageDirectory Content 记录
		--=====================================================
		INSERT INTO dbo.PageDirectoryContent 

		(
			PageDirectoryID,
			Culture,
			SeoTitle,
			SeoDescription,
			SeoKeywords,
			Title,
			[Description],
			Template,
			Hidden,
			HiddenInNavigationOnly,
			PageHeader,
			PageFooter,
			Url,
			ThisIsLink
		)

		VALUES

		(
			@PageDirectoryID,
			@Culture,
			@SeoTitle,
			@SeoDescription,
			@SeoKeywords,
			@Title,
			@Description,
			@Template,
			@Hidden,
			@HiddenInNavigationOnly,
			@PageHeader,
			@PageFooter,
			@Url,
			@ThisIsLink
		)
	END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PageDirectoryContentModify]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeContentModify    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeContentModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeContentModify]
GO

--====================================================================================
--==修改 KnowledgeContent
--====================================================================================
--==版权所有 2001-2011 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-30
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeContentModify

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@KnowledgeID int,			--当前 Knowledge 的 ID

--@Template nvarchar(200),		--当前 KnowledgeContent 使用的 Template
@Title nvarchar(2000),			--当前 KnowledgeContent 的标题
--@TitleShow nvarchar(50),		--是否将标题显示在正文中（比如博客）
@Content ntext,				--当前 KnowledgeContent 的内容
@Tag nvarchar(500),			--当前 KnowledgeContent 的标签
@Hidden bit,				--是否隐藏当前 Culture 下的内容
@Abstract ntext,				--当前 KnowledgeContent 的内容摘要（用在“引用”或“摘要显示”）
@Culture nvarchar(100)			--当前 KnowledgeContent 的文化代码（如 zh-cn）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'Knowledge',@KnowledgeID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果当前 @KnowledgeID 当前 @Culture 下的 KnowledgeContent 记录存在，则修改之，否则，添加之 （因为一个站点可能在后来添加新的文化）
--=====================================================
IF EXISTS (Select [ID] From dbo.KnowledgeContent Where KnowledgeID=@KnowledgeID And Culture=@Culture)

	BEGIN
		--=====================================================
		--==修改 KnowledgeContent
		--=====================================================
		UPDATE dbo.KnowledgeContent SET 

			--Template=@Template,
			Title=@Title, 
			--TitleShow=@TitleShow,
			Content=@Content,
			Tag=@Tag,
			Hidden=@Hidden,
			Abstract=@Abstract

		WHERE KnowledgeID=@KnowledgeID AND Culture=@Culture

		--=====================================================
		--==根据 @KnowledgeID 和 @Culture 返回 KnowledgeContentID
		--=====================================================
		DECLARE @KnowledgeContentID INT
		SELECT @KnowledgeContentID=nowc.[ID] FROM dbo.KnowledgeContent nowc WHERE nowc.KnowledgeID=@KnowledgeID AND nowc.Culture=@Culture

		--=====================================================
		--==首先将 KnowledgeTags 中当前 KnowledgeContentID 下的 Tag 删除，再加入新的 Tag
		--=====================================================
		DELETE FROM dbo.KnowledgeTags WHERE KnowledgeContentID=@KnowledgeContentID
		INSERT INTO dbo.KnowledgeTags (KnowledgeContentID,Tag) SELECT @KnowledgeContentID,Element FROM dbo.UDF_PublicSplit(@Tag,N',')

		--=====================================================
		--==将当前活动记录在案（修改了 KnowledgeContent）
		--==这里可以不记录，而在 KnowledgeSave 中体现
		--=====================================================
		--EXEC dbo.SiteLogSave @User, 13, @KnowledgeContentID

	END
ELSE

	BEGIN
		--=====================================================
		--==Approved 默认值（如果 Option.KnowledgeApprove=N'true' ，说明内容需要审批，则这里自动为 0，否则为 1）（注意：因为 [Value] 的数据类型已经修改为 ntext， 因此这里在使用 [Value]=N'true' 条件的时候，必须先 CONVERT 成 NVARCHAR 数据类型）
		--=====================================================
		DECLARE @Approved INT
		
		IF EXISTS (Select [ID] From dbo.[Option] Where [Key]=N'KnowledgeApprove' And CONVERT(NVARCHAR(4000),[Value])=N'true')
		BEGIN
			SET @Approved=0
		END
		ELSE
		BEGIN
			SET @Approved=1
		END

		--=====================================================
		--==添加 KnowledgeContent
		--=====================================================
		INSERT INTO dbo.KnowledgeContent 

		(
			KnowledgeID,
			Culture,
			--Template,
			Title,
			--TitleShow,
			Content,
			Tag,
			Hidden,
			Approved,
			ApproveMessage,
			ApprovedBy,
			Abstract
		) 

		VALUES

		(
			@KnowledgeID,
			@Culture,
			--@Template,
			@Title, 
			--@TitleShow,
			@Content,
			@Tag,
			@Hidden,
			@Approved,
			N'',
			N'',
			@Abstract
		)

		--======================================================
		--==立即捕获刚刚保存的那条消息的 ID
		--======================================================
		DECLARE @oNewID INT
		SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）

		--======================================================
		--==将 Tag （可能是“,” 隔开的列表）分解，保存在 KnowledgeTags 表
		--======================================================
		INSERT INTO dbo.KnowledgeTags(KnowledgeContentID,Tag) SELECT @oNewID, Element FROM dbo.UDF_PublicSplit(@Tag,N',')

		--=====================================================
		--==将当前活动记录在案（添加了 KnowledgeContent -  KnowledgeContentID = @oNewID）
		--==这里可以不记录，而在 KnowledgeModify 中体现
		--=====================================================
		--EXEC dbo.SiteLogSave @User, 6, @oNewID
		
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeContentModify]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.MainDirectoryContentSave    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MainDirectoryContentSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[MainDirectoryContentSave]
GO

--====================================================================================
--==保存 MainDirectoryContent
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-22
--====================================================================================

CREATE PROCEDURE dbo.MainDirectoryContentSave

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@MainDirectoryID INT,			--当前 MainDirectory 的 ID

@Title nvarchar(200),			--当前 MainDirectory Content 的标题
@Description nvarchar(1000),		--当前 MainDirectory Content 的描述
@Hidden bit,				--当前 MainDirectory Content 是否隐藏
@HiddenInNavigationOnly bit,		--这种隐藏是否只限于在导航中隐藏（在这种情形，被隐藏的内容被引用或链接的时候仍然会显示，但不会出现在导航中）

@PageHeader ntext,			--当前 mainDirectoryContent 级的 PageHeader （将向下继承）
@PageFooter ntext,			--当前 mainDirectoryContent 级的 PageFooter （将向下继承）

@Url nvarchar(2000),			--当前 MainDirectory Content 的 Url
@ThisIsLink bit,				--当前 MainDirectory Content 的 ThisIsLink

@Culture nvarchar(100),			--当前 MainDirectory Content 的文化

@oNewID int OUT			--新记录的 ID ，输出参数

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查  (KnowledgeDirectory=N'' 则需要 Admin 或 ChiefEditor 权限)
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'',0,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加 MainDirectoryContent 记录
--=====================================================
INSERT INTO dbo.MainDirectoryContent(MainDirectoryID,Culture,Title,[Description],Hidden,HiddenInNavigationOnly,PageHeader,PageFooter,Url,ThisIsLink) VALUES(@MainDirectoryID,@Culture,@Title,@Description,@Hidden,@HiddenInNavigationOnly,@PageHeader,@PageFooter,@Url,@ThisIsLink)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==同时让其 Overview SubDirectoryContent 继承 Title 和 Description 属性
--=====================================================
DECLARE @OverviewSubDirectoryID INT
SELECT @OverviewSubDirectoryID=dbo.UDF_GetOverviewSubDirectory(@MainDirectoryID)

UPDATE dbo.SubDirectoryContent SET [Title]=@Title, [Description]=@Description WHERE SubDirectoryID=@OverviewSubDirectoryID AND [Culture]=@Culture

--=====================================================
--==同时让其 Overview PageDirectoryContent 继承 Title 和 Description 属性
--=====================================================
DECLARE @OverviewPageDirectoryID INT
SELECT @OverviewPageDirectoryID=dbo.UDF_GetOverviewPageDirectory(N'MainDirectory',@MainDirectoryID)

UPDATE dbo.PageDirectoryContent SET [Title]=@Title, [Description]=@Description WHERE PageDirectoryID=@OverviewPageDirectoryID AND [Culture]=@Culture

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==立即捕获刚刚保存的那条消息的 ID
--======================================================
SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[MainDirectoryContentSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.SubDirectoryContentSave    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SubDirectoryContentSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SubDirectoryContentSave]
GO

--====================================================================================
--==保存 SubDirectoryContent
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-22
--====================================================================================

CREATE PROCEDURE dbo.SubDirectoryContentSave

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@SubDirectoryID int,			--当前 SubDirectory  的 ID

@Title nvarchar(200),			--当前 SubDirectory Content 的标题
@Description nvarchar(1000),		--当前 SubDirectory Content 的描述
@WizardPreviousTitle nvarchar(200),	--当前 SubDirectory 的 Wizard 属性为 true 的时候， SubDirectory 下的 PageDirectory 内容的后面，加一段 Wizard 导航，这里是导航中 “Previous” 链接的标签文字
@WizardNextTitle nvarchar(200),		--当前 SubDirectory 的 Wizard 属性为 true 的时候， SubDirectory 下的 PageDirectory 内容的后面，加一段 Wizard 导航，这里是导航中 "Next" 链接的标签文字
@Hidden bit,				--当前 SubDirectory Content 是否隐藏
@HiddenInNavigationOnly bit,		--这种隐藏是否只限于在导航中隐藏（在这种情形，被隐藏的内容被引用或链接的时候仍然会显示，但不会出现在导航中）

@PageHeader ntext,			--当前 SubDirectory 级的 PageHeader （将向下继承）
@PageFooter ntext,			--当前 SubDirectory 级的 PageFooter （将向下继承）

@Url nvarchar(2000),			--当前 SubDirectoryContent  的 Url 字符串
@ThisIsLink bit,				--当前 SubDirectoryContent  的 ThisIsLink Flag

@Culture nvarchar(100),			--当前 SubDirectory Content 的文化

@oNewID int OUT			--新记录的 ID ，输出参数

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据 @SubDirectoryID 获取对应的 MainDirectoryID
--=====================================================
DECLARE @MainDirectoryID INT
SELECT @MainDirectoryID=sd.MainDirectoryID FROM dbo.SubDirectory sd WHERE sd.[ID]=@SubDirectoryID

--=====================================================
--==用户权限检查（需要其上级权限）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'MainDirectory',@MainDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加 SubDirectoryContent
--=====================================================
INSERT INTO dbo.SubDirectoryContent(SubDirectoryID,Culture,Title,[Description],WizardPreviousTitle,WizardNextTitle,Hidden,HiddenInNavigationOnly,PageHeader,PageFooter,Url,ThisIsLink) VALUES(@SubDirectoryID,@Culture,@Title,@Description,@WizardPreviousTitle,@WizardNextTitle,@Hidden,@HiddenInNavigationOnly,@PageHeader,@PageFooter,@Url,@ThisIsLink)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==同时让其 Overview PageDirectoryContent 继承 Title 和 Description 属性
--=====================================================
DECLARE @OverviewPageDirectoryID INT
SELECT @OverviewPageDirectoryID=dbo.UDF_GetOverviewPageDirectory(N'SubDirectory',@SubDirectoryID)

UPDATE dbo.PageDirectoryContent SET [Title]=@Title, [Description]=@Description WHERE PageDirectoryID=@OverviewPageDirectoryID AND [Culture]=@Culture

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==立即捕获刚刚保存的那条消息的 ID
--======================================================
SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[SubDirectoryContentSave]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PageDirectoryContentSave    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PageDirectoryContentSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PageDirectoryContentSave]
GO

--====================================================================================
--==保存 PageDirectoryContent
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-22
--====================================================================================

CREATE PROCEDURE dbo.PageDirectoryContentSave

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@PageDirectoryID int,			--当前 PageDirectory  的 ID

@SeoTitle nvarchar(200),		--当前 PageDirectory Content 的 SeoTitle
@SeoDescription ntext,			--当前 PageDirectory Content 的 SeoDescription
@SeoKeywords ntext,			--当前 PageDirectory Content 的 SeoKeywords
@Title nvarchar(200),			--当前 PageDirectory Content 的标题
@Description nvarchar(1000),		--当前 PageDirectory Content 的描述
@Template nvarchar(200),		--当前 PageDirectory Content 的 Template
@Hidden bit,				--当前 PageDirectory Content 是否隐藏
@HiddenInNavigationOnly bit,		--这种隐藏是否只限于在导航中隐藏（在这种情形，被隐藏的内容被引用或链接的时候仍然会显示，但不会出现在导航中）
@PageHeader ntext,			--当前 PageDirectory Content 的 Header 部分
@PageFooter ntext,			--当前 PageDirectory Content 的 Footer 部分

@Url nvarchar(2000),			--当前 PageDirectory 的 Url 字符串
@ThisIsLink bit,				--当前 PageDirectory 的 ThisIsLink Flag

@Culture nvarchar(100),			--当前 PageDirectory Content 的文化

@oNewID int OUT			--新记录的 ID ，输出参数

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据 @PageDirectoryID 获得其对应的 SubDirectoryID （这里需要 SubDirectory 编辑权限）
--=====================================================
DECLARE @SubDirectoryID INT
SELECT @SubDirectoryID=pd.SubDirectoryID FROM dbo.PageDirectory pd WHERE pd.[ID]=@PageDirectoryID

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'SubDirectory',@SubDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加 PageDirectoryContent 记录
--=====================================================
INSERT INTO dbo.PageDirectoryContent(PageDirectoryID,Culture,SeoTitle,SeoDescription,SeoKeywords,Title,[Description],Template,Hidden,HiddenInNavigationOnly,PageHeader,PageFooter,Url,ThisIsLink) VALUES(@PageDirectoryID,@Culture,@SeoTitle,@SeoDescription,@SeoKeywords,@Title,@Description,@Template,@Hidden,@HiddenInNavigationOnly,@PageHeader,@PageFooter,@Url,@ThisIsLink)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==立即捕获刚刚保存的那条消息的 ID
--======================================================
SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PageDirectoryContentSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeContentSave    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeContentSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeContentSave]
GO

--====================================================================================
--==保存 KnowledgeContent
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-08-30
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeContentSave

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@KnowledgeID int,			--当前 Knowledge 的 ID

--@Template nvarchar(200),		--当前 KnowledgeContent 使用的 Template
@Title nvarchar(2000),			--当前 Knowledge Content 的标题
--@TitleShow nvarchar(50),		--标题是否显示在正文中（比如博客）
@Content ntext,				--当前 Knowledge Content 的内容
@Tag nvarchar(500),			--当前 Knowledge Content 的标签
@Hidden bit,				--是否隐藏当前 Culture 下的内容
@Abstract ntext,				--当前 Knowledge Content 的内容摘要
@Culture nvarchar(100),			--当前 Knowledge Content 的文化

@oNewID int OUT			--新记录的 ID ，输出参数

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据 @KnowledgeID 获得 PageDirectoryID
--=====================================================
DECLARE @PageDirectoryID INT
SELECT @PageDirectoryID=now.PageDirectoryID FROM dbo.Knowledge now WHERE now.[ID]=@KnowledgeID

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'PageDirectory',@PageDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==Approved 默认值（如果 Option.KnowledgeApprove=N'true' ，说明内容需要审批，则这里自动为 0，否则为 1）（注意：我们已经将 [Value] 的数据类型改为 ntext，因此下面的 ,Value]=N'true' 必须先用 CONVERT(NVARCHAR(4000) 处理 [Value]）
--=====================================================
DECLARE @Approved INT
		
IF EXISTS (Select [ID] From dbo.[Option] Where [Key]=N'KnowledgeApprove' And CONVERT(NVARCHAR(4000),[Value])=N'true')
BEGIN
	SET @Approved=0
END
ELSE
BEGIN
	SET @Approved=1
END

--=====================================================
--==添加 Knowledge Content
--=====================================================
--INSERT INTO dbo.KnowledgeContent(KnowledgeID,Culture,Template,Title,TitleShow,Content,Tag,Hidden, Approved, ApproveMessage, ApprovedBy, Abstract) VALUES(@KnowledgeID,@Culture,@Template,@Title,@TitleShow,@Content,@Tag,@Hidden,@Approved,N'',N'',@Abstract)
INSERT INTO dbo.KnowledgeContent(KnowledgeID,Culture,Title,Content,Tag,Hidden,Approved, ApproveMessage, ApprovedBy, Abstract) VALUES(@KnowledgeID,@Culture,@Title,@Content,@Tag,@Hidden,@Approved,N'',N'',@Abstract)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==立即捕获刚刚保存的那条消息的 ID
--======================================================
SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==将 Tag （可能是“,” 隔开的列表）分解，保存在 KnowledgeTags 表
--======================================================
INSERT INTO dbo.KnowledgeTags(KnowledgeContentID,Tag) SELECT @oNewID, Element FROM dbo.UDF_PublicSplit(@Tag,N',')

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（添加了 KnowledgeContent -  KnowledgeContentID = @oNewID）
--==这里可以不记录，而在 KnowledgeSave 中体现
--=====================================================
--EXEC dbo.SiteLogSave @User, 6, @oNewID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeContentSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.CommunityContentModify    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CommunityContentModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CommunityContentModify]
GO

--====================================================================================
--==修改 CommunityContent
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-24
--====================================================================================

CREATE PROCEDURE dbo.CommunityContentModify

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名

@CommunityID int,						--当前 Community 的 ID

@Culture nvarchar(100),						--当前 CommunityContent 的文化代码（如 zh-cn）

@Title nvarchar(200),						--当前 CommunityContent 的标题
@Description nvarchar(1000),					--当前 CommunityContent 的描述
@Hidden bit,							--当前 CommunityContent 是否隐藏

@CommandTitleTaskList nvarchar(100),				--当前 CommunityContent 的  “当前主题” 命令标签 
@CommandTitleTaskListDescription nvarchar(200),		--当前 CommunityContent 的  “当前主题” 命令标签的描述
@CommandTitleAdd nvarchar(100),				--当前 CommunityContent 的  “新主题” 命令标签 
@CommandTitleAddDescription nvarchar(200),			--当前 CommunityContent 的  “新主题” 命令标签的描述
@CommandTitleQuery nvarchar(100),				--当前 CommunityContent 的  “搜索” 命令标签 
@CommandTitleQueryDescription nvarchar(200),			--当前 CommunityContent 的  “搜索” 命令标签的描述

@TopicStatusCustomizationEmptyTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 尚无跟贴主题
@TopicStatusCustomizationSolidTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 已有跟贴主题
@TopicStatusCustomizationHotTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 热帖主题
@TopicStatusCustomizationEliteTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 精华主题
@TopicStatusCustomizationTabooTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 违禁主题
@TopicStatusCustomizationStickyTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 置顶主题
@TopicCommandSetEliteTopic nvarchar(50),			--当前 CommunityContent 的   主题命令 - 设置精华
@TopicCommandSetTabooTopic nvarchar(50),			--当前 CommunityContent 的   主题命令 - 设置违禁
@TopicCommandSetStickyTopic nvarchar(50)			--当前 CommunityContent 的   主题命令 - 置顶

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果当前 @CommunityID 当前 @Culture 下的 CommunityContent 记录存在，则修改之，否则，添加之 （因为一个站点可能在后来添加新的文化）
--=====================================================
IF EXISTS (Select [ID] From dbo.CommunityContent Where CommunityID=@CommunityID And Culture=@Culture)

	BEGIN
		--=====================================================
		--==修改 CommunityContent
		--=====================================================
		UPDATE dbo.CommunityContent SET 

			Title=@Title, 
			[Description]=@Description,
			Hidden=@Hidden,

			CommandTitleTaskList=@CommandTitleTaskList,
			CommandTitleTaskListDescription=@CommandTitleTaskListDescription,
			CommandTitleAdd=@CommandTitleAdd,
			CommandTitleAddDescription=@CommandTitleAddDescription,
			CommandTitleQuery=@CommandTitleQuery,
			CommandTitleQueryDescription=@CommandTitleQueryDescription,			

			TopicStatusCustomizationEmptyTopic=@TopicStatusCustomizationEmptyTopic,
			TopicStatusCustomizationSolidTopic=@TopicStatusCustomizationSolidTopic,
			TopicStatusCustomizationHotTopic=@TopicStatusCustomizationHotTopic,
			TopicStatusCustomizationEliteTopic=@TopicStatusCustomizationEliteTopic,
			TopicStatusCustomizationTabooTopic=@TopicStatusCustomizationTabooTopic,
			TopicStatusCustomizationStickyTopic=@TopicStatusCustomizationStickyTopic,
			TopicCommandSetEliteTopic=@TopicCommandSetEliteTopic,
			TopicCommandSetTabooTopic=@TopicCommandSetTabooTopic,
			TopicCommandSetStickyTopic=@TopicCommandSetStickyTopic			

		WHERE CommunityID=@CommunityID AND Culture=@Culture
	END
ELSE

	BEGIN
		--=====================================================
		--==添加 CommunityContent
		--=====================================================
		INSERT INTO dbo.CommunityContent 

		(
			CommunityID,

			Culture,

			Title,
			[Description],
			Hidden,

			CommandTitleTaskList,
			CommandTitleTaskListDescription,
			CommandTitleAdd,
			CommandTitleAddDescription,
			CommandTitleQuery,
			CommandTitleQueryDescription,

			TopicStatusCustomizationEmptyTopic,
			TopicStatusCustomizationSolidTopic,
			TopicStatusCustomizationHotTopic,
			TopicStatusCustomizationEliteTopic,
			TopicStatusCustomizationTabooTopic,
			TopicStatusCustomizationStickyTopic,
			TopicCommandSetEliteTopic,
			TopicCommandSetTabooTopic,
			TopicCommandSetStickyTopic
		) 

		VALUES

		(
			@CommunityID,

			@Culture,

			@Title, 
			@Description,
			@Hidden,

			@CommandTitleTaskList,
			@CommandTitleTaskListDescription,
			@CommandTitleAdd,
			@CommandTitleAddDescription,
			@CommandTitleQuery,
			@CommandTitleQueryDescription,

			@TopicStatusCustomizationEmptyTopic,
			@TopicStatusCustomizationSolidTopic,
			@TopicStatusCustomizationHotTopic,
			@TopicStatusCustomizationEliteTopic,
			@TopicStatusCustomizationTabooTopic,
			@TopicStatusCustomizationStickyTopic,
			@TopicCommandSetEliteTopic,
			@TopicCommandSetTabooTopic,
			@TopicCommandSetStickyTopic
		)
		
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[CommunityContentModify]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.CommunityContentSave    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CommunityContentSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CommunityContentSave]
GO

--====================================================================================
--==添加 CommunityContent
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-23
--====================================================================================

CREATE PROCEDURE dbo.CommunityContentSave

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名

@CommunityID int,						--当前 Community 的 ID

@Culture nvarchar(100),						--当前 CommunityContent 的文化代码（如 zh-cn）

@Title nvarchar(200),						--当前 CommunityContent 的标题
@Description nvarchar(1000),					--当前 CommunityContent 的描述
@Hidden bit,							--当前 CommunityContent 的 Hidden 属性

@CommandTitleTaskList nvarchar(100),				--当前 CommunityContent 的  “当前主题” 命令标签 
@CommandTitleTaskListDescription nvarchar(200),		--当前 CommunityContent 的  “当前主题” 命令标签的描述
@CommandTitleAdd nvarchar(100),				--当前 CommunityContent 的  “新主题” 命令标签 
@CommandTitleAddDescription nvarchar(200),			--当前 CommunityContent 的  “新主题” 命令标签的描述
@CommandTitleQuery nvarchar(100),				--当前 CommunityContent 的  “搜索” 命令标签 
@CommandTitleQueryDescription nvarchar(200),			--当前 CommunityContent 的  “搜索” 命令标签的描述

@TopicStatusCustomizationEmptyTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 尚无跟贴主题
@TopicStatusCustomizationSolidTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 已有跟贴主题
@TopicStatusCustomizationHotTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 热帖主题
@TopicStatusCustomizationEliteTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 精华主题
@TopicStatusCustomizationTabooTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 违禁主题
@TopicStatusCustomizationStickyTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 置顶主题
@TopicCommandSetEliteTopic nvarchar(50),			--当前 CommunityContent 的   主题命令 - 设置精华
@TopicCommandSetTabooTopic nvarchar(50),			--当前 CommunityContent 的   主题命令 - 设置违禁
@TopicCommandSetStickyTopic nvarchar(50),			--当前 CommunityContent 的   主题命令 - 置顶

@oNewID int OUT						--新记录的 ID ，输出参数

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加 CommunityContent
--=====================================================
INSERT INTO dbo.CommunityContent 

(
	CommunityID,

	Culture,

	Title,
	[Description],
	Hidden,

	CommandTitleTaskList,
	CommandTitleTaskListDescription,
	CommandTitleAdd,
	CommandTitleAddDescription,
	CommandTitleQuery,
	CommandTitleQueryDescription,

	TopicStatusCustomizationEmptyTopic,
	TopicStatusCustomizationSolidTopic,
	TopicStatusCustomizationHotTopic,
	TopicStatusCustomizationEliteTopic,
	TopicStatusCustomizationTabooTopic,
	TopicStatusCustomizationStickyTopic,
	TopicCommandSetEliteTopic,
	TopicCommandSetTabooTopic,
	TopicCommandSetStickyTopic
) 

VALUES

(
	@CommunityID,

	@Culture,

	@Title, 
	@Description,
	@Hidden,

	@CommandTitleTaskList,
	@CommandTitleTaskListDescription,
	@CommandTitleAdd,
	@CommandTitleAddDescription,
	@CommandTitleQuery,
	@CommandTitleQueryDescription,

	@TopicStatusCustomizationEmptyTopic,
	@TopicStatusCustomizationSolidTopic,
	@TopicStatusCustomizationHotTopic,
	@TopicStatusCustomizationEliteTopic,
	@TopicStatusCustomizationTabooTopic,
	@TopicStatusCustomizationStickyTopic,
	@TopicCommandSetEliteTopic,
	@TopicCommandSetTabooTopic,
	@TopicCommandSetStickyTopic
)
		
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==立即捕获刚刚保存的那条消息的 ID
--======================================================
SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Session 内的本表）

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[CommunityContentSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.CommunityContentSelect    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CommunityContentSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CommunityContentSelect]
GO

--====================================================================================
--==根据给定的  CommunityItem (Community ID) 获得 CommunityContent 表中的指定记录
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-24
--====================================================================================

CREATE PROCEDURE dbo.CommunityContentSelect

@CommunityItem INT				--Community 记录 ID

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择
--====================================================================================
SELECT
	coc.[ID] AS [ID],
	coc.CommunityID AS CommunityID,

	coc.Culture AS Culture,

	coc.Title AS Title,
	coc.[Description] AS [Description],
	coc.Hidden AS Hidden,

	coc.CommandTitleTaskList AS CommandTitleTaskList,
	coc.CommandTitleTaskListDescription  AS CommandTitleTaskListDescription,
	coc.CommandTitleAdd AS CommandTitleAdd,
	coc.CommandTitleAddDescription AS CommandTitleAddDescription,
	coc.CommandTitleQuery AS CommandTitleQuery,
	coc.CommandTitleQueryDescription AS CommandTitleQueryDescription,

	coc.TopicStatusCustomizationEmptyTopic AS TopicStatusCustomizationEmptyTopic,
	coc.TopicStatusCustomizationSolidTopic  AS TopicStatusCustomizationSolidTopic,
	coc.TopicStatusCustomizationHotTopic AS TopicStatusCustomizationHotTopic,
	coc.TopicStatusCustomizationEliteTopic AS TopicStatusCustomizationEliteTopic,
	coc.TopicStatusCustomizationTabooTopic AS TopicStatusCustomizationTabooTopic,
	coc.TopicStatusCustomizationStickyTopic AS TopicStatusCustomizationStickyTopic,
	coc.TopicCommandSetEliteTopic AS TopicCommandSetEliteTopic,
	coc.TopicCommandSetTabooTopic  AS TopicCommandSetTabooTopic,
	coc.TopicCommandSetStickyTopic AS TopicCommandSetStickyTopic,

	coc.Title AS ActionIndicatorTitle

FROM dbo.CommunityContent coc

WHERE CommunityID=@CommunityItem

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[CommunityContentSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ForumContentModify    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ForumContentModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ForumContentModify]
GO

--====================================================================================
--==修改 ForumContent
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-24 
--====================================================================================

CREATE PROCEDURE dbo.ForumContentModify

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名

@ForumID int,							--当前 Forum 的 ID

@Culture nvarchar(100),						--当前 ForumContent 的文化代码（如 zh-cn）

@Title nvarchar(200),						--当前 ForumContent 的标题
@Description nvarchar(1000),					--当前 ForumContent 的描述
@Hidden bit,							--当前 ForumContent 的 "Hidden" 属性

@CommandTitleTaskList nvarchar(100),				--当前 ForumContent 的  “当前主题” 命令标签 
@CommandTitleTaskListDescription nvarchar(200),		--当前 ForumContent 的  “当前主题” 命令标签的描述
@CommandTitleAdd nvarchar(100),				--当前 ForumContent 的  “新主题” 命令标签 
@CommandTitleAddDescription nvarchar(200),			--当前 ForumContent 的  “新主题” 命令标签的描述
@CommandTitleQuery nvarchar(100),				--当前 ForumContent 的  “搜索” 命令标签 
@CommandTitleQueryDescription nvarchar(200),			--当前 ForumContent 的  “搜索” 命令标签的描述

@TopicStatusCustomizationEmptyTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 尚无跟贴主题
@TopicStatusCustomizationSolidTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 已有跟贴主题
@TopicStatusCustomizationHotTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 热帖主题
@TopicStatusCustomizationEliteTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 精华主题
@TopicStatusCustomizationTabooTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 违禁主题
@TopicStatusCustomizationStickyTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 置顶主题
@TopicCommandSetEliteTopic nvarchar(50),			--当前 CommunityContent 的   主题命令 - 设置精华
@TopicCommandSetTabooTopic nvarchar(50),			--当前 CommunityContent 的   主题命令 - 设置违禁
@TopicCommandSetStickyTopic nvarchar(50)			--当前 CommunityContent 的   主题命令 - 置顶

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果当前 @ForumID 当前 @Culture 下的 ForumContent 记录存在，则修改之，否则，添加之 （因为一个站点可能在后来添加新的文化）
--=====================================================
IF EXISTS (Select [ID] From dbo.ForumContent Where ForumID=@ForumID And Culture=@Culture)

	BEGIN
		--=====================================================
		--==修改 ForumContent
		--=====================================================
		UPDATE dbo.ForumContent SET 

			Title=@Title, 
			[Description]=@Description,
			Hidden=@Hidden,

			CommandTitleTaskList=@CommandTitleTaskList,
			CommandTitleTaskListDescription=@CommandTitleTaskListDescription,
			CommandTitleAdd=@CommandTitleAdd,
			CommandTitleAddDescription=@CommandTitleAddDescription,
			CommandTitleQuery=@CommandTitleQuery,
			CommandTitleQueryDescription=@CommandTitleQueryDescription,

			TopicStatusCustomizationEmptyTopic=@TopicStatusCustomizationEmptyTopic,
			TopicStatusCustomizationSolidTopic=@TopicStatusCustomizationSolidTopic,
			TopicStatusCustomizationHotTopic=@TopicStatusCustomizationHotTopic,
			TopicStatusCustomizationEliteTopic=@TopicStatusCustomizationEliteTopic,
			TopicStatusCustomizationTabooTopic=@TopicStatusCustomizationTabooTopic,
			TopicStatusCustomizationStickyTopic=@TopicStatusCustomizationStickyTopic,
			TopicCommandSetEliteTopic=@TopicCommandSetEliteTopic,
			TopicCommandSetTabooTopic=@TopicCommandSetTabooTopic,
			TopicCommandSetStickyTopic=@TopicCommandSetStickyTopic		

		WHERE ForumID=@ForumID AND Culture=@Culture
	END
ELSE

	BEGIN
		--=====================================================
		--==添加 ForumContent
		--=====================================================
		INSERT INTO dbo.ForumContent 

		(
			ForumID,

			Culture,

			Title,
			[Description],
			Hidden,

			CommandTitleTaskList,
			CommandTitleTaskListDescription,
			CommandTitleAdd,
			CommandTitleAddDescription,
			CommandTitleQuery,
			CommandTitleQueryDescription,

			TopicStatusCustomizationEmptyTopic,
			TopicStatusCustomizationSolidTopic,
			TopicStatusCustomizationHotTopic,
			TopicStatusCustomizationEliteTopic,
			TopicStatusCustomizationTabooTopic,
			TopicStatusCustomizationStickyTopic,
			TopicCommandSetEliteTopic,
			TopicCommandSetTabooTopic,
			TopicCommandSetStickyTopic
		) 

		VALUES

		(
			@ForumID,

			@Culture,

			@Title, 
			@Description,
			@Hidden,

			@CommandTitleTaskList,
			@CommandTitleTaskListDescription,
			@CommandTitleAdd,
			@CommandTitleAddDescription,
			@CommandTitleQuery,
			@CommandTitleQueryDescription,

			@TopicStatusCustomizationEmptyTopic,
			@TopicStatusCustomizationSolidTopic,
			@TopicStatusCustomizationHotTopic,
			@TopicStatusCustomizationEliteTopic,
			@TopicStatusCustomizationTabooTopic,
			@TopicStatusCustomizationStickyTopic,
			@TopicCommandSetEliteTopic,
			@TopicCommandSetTabooTopic,
			@TopicCommandSetStickyTopic
		)
		
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ForumContentModify]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ForumContentSave    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ForumContentSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ForumContentSave]
GO

--====================================================================================
--==添加 ForumContent
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-24
--====================================================================================

CREATE PROCEDURE dbo.ForumContentSave

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名

@ForumID int,							--当前 Forum 的 ID

@Culture nvarchar(100),						--当前 ForumContent 的文化代码（如 zh-cn）

@Title nvarchar(200),						--当前 ForumContent 的标题
@Description nvarchar(1000),					--当前 ForumContent 的描述
@Hidden bit,							--当前 ForumContent 的  “Hiden” 属性 

@CommandTitleTaskList nvarchar(100),				--当前 ForumContent 的  “当前主题” 命令标签 
@CommandTitleTaskListDescription nvarchar(200),		--当前 ForumContent 的  “当前主题” 命令标签的描述
@CommandTitleAdd nvarchar(100),				--当前 ForumContent 的  “新主题” 命令标签 
@CommandTitleAddDescription nvarchar(200),			--当前 ForumContent 的  “新主题” 命令标签的描述
@CommandTitleQuery nvarchar(100),				--当前 ForumContent 的  “搜索” 命令标签 
@CommandTitleQueryDescription nvarchar(200),			--当前 ForumContent 的  “搜索” 命令标签的描述

@TopicStatusCustomizationEmptyTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 尚无跟贴主题
@TopicStatusCustomizationSolidTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 已有跟贴主题
@TopicStatusCustomizationHotTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 热帖主题
@TopicStatusCustomizationEliteTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 精华主题
@TopicStatusCustomizationTabooTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 违禁主题
@TopicStatusCustomizationStickyTopic nvarchar(50),		--当前 CommunityContent 的   主题状态 - 置顶主题
@TopicCommandSetEliteTopic nvarchar(50),			--当前 CommunityContent 的   主题命令 - 设置精华
@TopicCommandSetTabooTopic nvarchar(50),			--当前 CommunityContent 的   主题命令 - 设置违禁
@TopicCommandSetStickyTopic nvarchar(50),			--当前 CommunityContent 的   主题命令 - 置顶

@oNewID int OUT   						--新记录的 ID ，输出参数  


AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加 ForumContent
--=====================================================
INSERT INTO dbo.ForumContent 

(
	ForumID,

	Culture,

	Title,
	[Description],
	Hidden,

	CommandTitleTaskList,
	CommandTitleTaskListDescription,
	CommandTitleAdd,
	CommandTitleAddDescription,
	CommandTitleQuery,
	CommandTitleQueryDescription,

	TopicStatusCustomizationEmptyTopic,
	TopicStatusCustomizationSolidTopic,
	TopicStatusCustomizationHotTopic,
	TopicStatusCustomizationEliteTopic,
	TopicStatusCustomizationTabooTopic,
	TopicStatusCustomizationStickyTopic,
	TopicCommandSetEliteTopic,
	TopicCommandSetTabooTopic,
	TopicCommandSetStickyTopic
) 

VALUES

(
	@ForumID,

	@Culture,

	@Title, 
	@Description,
	@Hidden,

	@CommandTitleTaskList,
	@CommandTitleTaskListDescription,
	@CommandTitleAdd,
	@CommandTitleAddDescription,
	@CommandTitleQuery,
	@CommandTitleQueryDescription,

	@TopicStatusCustomizationEmptyTopic,
	@TopicStatusCustomizationSolidTopic,
	@TopicStatusCustomizationHotTopic,
	@TopicStatusCustomizationEliteTopic,
	@TopicStatusCustomizationTabooTopic,
	@TopicStatusCustomizationStickyTopic,
	@TopicCommandSetEliteTopic,
	@TopicCommandSetTabooTopic,
	@TopicCommandSetStickyTopic
)
		
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ  
  
--======================================================  
--==立即捕获刚刚保存的那条消息的 ID  
--======================================================  
SELECT @oNewID=SCOPE_IDENTITY() --输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）  


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ForumContentSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ForumContentSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ForumContentSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ForumContentSelect]
GO

--====================================================================================
--==根据给定的  ForumItem (Forum ID) 获得 ForumContent 表中的指定记录
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-24
--====================================================================================

CREATE PROCEDURE dbo.ForumContentSelect

@ForumItem INT				--Forum 记录 ID

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择
--====================================================================================
SELECT
	foc.[ID] AS [ID],
	foc.ForumID AS ForumID,

	foc.Culture AS Culture,

	foc.Title AS Title,
	foc.[Description] AS [Description],
	foc.Hidden AS Hidden,

	foc.CommandTitleTaskList AS CommandTitleTaskList,
	foc.CommandTitleTaskListDescription AS CommandTitleTaskListDescription,
	foc.CommandTitleAdd AS CommandTitleAdd,
	foc.CommandTitleAddDescription AS CommandTitleAddDescription,
	foc.CommandTitleQuery AS CommandTitleQuery,
	foc.CommandTitleQueryDescription AS CommandTitleQueryDescription,

	foc.TopicStatusCustomizationEmptyTopic AS TopicStatusCustomizationEmptyTopic,
	foc.TopicStatusCustomizationSolidTopic  AS TopicStatusCustomizationSolidTopic,
	foc.TopicStatusCustomizationHotTopic AS TopicStatusCustomizationHotTopic,
	foc.TopicStatusCustomizationEliteTopic AS TopicStatusCustomizationEliteTopic,
	foc.TopicStatusCustomizationTabooTopic AS TopicStatusCustomizationTabooTopic,
	foc.TopicStatusCustomizationStickyTopic AS TopicStatusCustomizationStickyTopic,
	foc.TopicCommandSetEliteTopic AS TopicCommandSetEliteTopic,
	foc.TopicCommandSetTabooTopic  AS TopicCommandSetTabooTopic,
	foc.TopicCommandSetStickyTopic AS TopicCommandSetStickyTopic,

	coc.Title + N' / ' + foc.Title AS ActionIndicatorTitle


FROM dbo.ForumContent foc
LEFT JOIN dbo.Forum fo ON fo.[ID]=foc.ForumID
LEFT JOIN dbo.Community co ON co.[ID]=fo.CommunityID
LEFT JOIN dbo.CommunityContent coc ON co.[ID]=coc.CommunityID AND coc.Culture=foc.Culture

WHERE ForumID=@ForumItem

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ForumContentSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ForumList    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ForumList]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ForumList]
GO

--====================================================================================
--==返回所有 Forum 中的项目，以便系统根据这个表，为当前用户分配 Forum  的读写权限
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-22 
--====================================================================================

CREATE PROCEDURE dbo.ForumList

@Culture nvarchar(100)				--将要返回 Forum 列表时指定的文化

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择 Forum 表
--====================================================================================
SELECT 
	fo.[ID] AS [ID],
	fo.CommunityID AS  CommunityID,
	fo.Serial AS Serial,
	fo.[Name] AS [Name],
	fo.Moderator AS Moderator,
	ISNULL(fo.[Public],N'true') AS [Public],

	fo.ReadPermission AS ReadPermission,
	fo.TopicWritePermission AS TopicWritePermission,
	fo.FollowUpWritePermission AS FollowUpWritePermission,

	foc.Culture AS Culture,
	coc.Title + N' / ' + foc.Title AS Title,
	foc.[Description] AS [Description],
	ISNULL(foc.Hidden,0) AS Hidden


FROM dbo.Forum fo
LEFT JOIN dbo.ForumContent foc ON foc.ForumID=fo.[ID]
LEFT JOIN dbo.Community co ON co.[ID]=fo.CommunityID
LEFT JOIN dbo.CommunityContent coc ON coc.CommunityID=co.[ID]

WHERE foc.Culture=@Culture AND coc.Culture=@Culture

ORDER BY fo.CommunityID


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ForumList]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserForumsSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserForumsSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserForumsSelect]
GO

--====================================================================================
--==从 UserForums 表返回当前用户在不同 Forum 上的权限
--====================================================================================
--==版权所有 2001-2010  COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2006-05-29 
--==该 SP 暂停使用
--====================================================================================

CREATE PROCEDURE dbo.UserForumsSelect

@User nvarchar(50)				--指定用户

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择 UserForums 表
--====================================================================================
SELECT 
	uf.[ID] AS [ID],
	uf.[User] AS  [User],
	uf.Forum AS Forum,
	uf.ReadEnabled AS ReadEnabled,
	uf.TopicWriteEnabled AS TopicWriteEnabled,
	uf.FollowUpWriteEnabled AS FollowUpWriteEnabled

FROM dbo.UserForums uf

WHERE uf.[User]=@User


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserForumsSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserForumsSave    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserForumsSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserForumsSave]
GO

--====================================================================================
--==保存 UserForums
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12 
--==该 SP 暂停使用
--====================================================================================

CREATE PROCEDURE dbo.UserForumsSave

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@UserName nvarchar(50),		--当前 用户 的名字
@Forum int,				--当前 Forum 的 ID
@ReadEnabled int,			--可读
@TopicWriteEnabled int,			--可发贴
@FollowUpWriteEnabled int		--可跟帖

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加 
--==注意：在用户修改模式，我们已经在 SP UserAccountSave 中删除了该用户在 UserForums 中的存在
--=====================================================
INSERT INTO dbo.UserForums([User],Forum,ReadEnabled,TopicWriteEnabled,FollowUpWriteEnabled) VALUES(@UserName,@Forum,@ReadEnabled,@TopicWriteEnabled,@FollowUpWriteEnabled)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserForumsSave]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicUserAuthenticationSave    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicUserAuthenticationSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicUserAuthenticationSave]
GO

--====================================================================================
--==检查当前用户在指定 Forum 中是否可以发帖
--==有以下情形下之一的，Forum 是可以发贴的：    
--==该 Forum 以及其上级 Community 的 TopicWritePermission 为空    
--==该 Forum 或其上级 Community 设置了 Public 属性    
--==当前用户是 Admin    
--==当前用户是该 Forum 的 Moderator    
--==当前用户落在该 Forum 或其上级 Community 的 TopicWritePermission 清单中    
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24
--====================================================================================

CREATE PROCEDURE dbo.TopicUserAuthenticationSave

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@Forum INT,			--指定 Forum
@oPass INT OUT		--输出参数：通过返回 1，否则 0

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--==========================================
--==先假设 检查通过
--==========================================
SET @oPass=1

--==========================================
--==检查权限
--==========================================
IF dbo.UDF_ForumTopicWritable(@User,@Forum)=0

BEGIN
	SET @oPass=0
	RAISERROR(N'很抱歉，您未被授权在当前论坛发贴。<br/>请先注册，或联系系统管理员及版主获取相应权限。<br/>谢谢。',16,1)
	RETURN
END


/*
--=========================================
--==如果当前用户没有注册为 Community用户，则举错，并退出
--=========================================
IF (dbo.UDF_UserCommunity(@User)<>1)  AND (dbo.UDF_UserAdmin(@User)<>1)
BEGIN
	SET @oPass=0
	RAISERROR(N'We are sorry, but you are not registered Community User. Only registered Community Users have rights to post topics.<BR>Please click the Sign up link on our site to get rgistered as Community User.<BR>Thank you.',16,1)
	RETURN
END

--=========================================
--==如果当前用户是 Community，但在 UserForums 中 对本 Forum 配置的 TopicWriteEnabled 权限不是 1，则举错，并退出 （说明用户没有对该 Forum 发帖权限）
--=========================================
IF (NOT EXISTS (Select [ID] From dbo.UserForums Where [User]=@User And Forum=@Forum And TopicWriteEnabled=1)) AND (dbo.UDF_UserAdmin(@User)<>1)
BEGIN
	SET @oPass=0
	RAISERROR(N'We are sorry, but you are not authorized to post topic to current Forum. <BR>Please contact our system administrator to grand the permission to you. <BR>Thank you.',16,1)
	RETURN
END
*/

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicUserAuthenticationSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.FollowUpUserAuthenticationSave    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FollowUpUserAuthenticationSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[FollowUpUserAuthenticationSave]
GO

--====================================================================================
--==检查当前用户在指定 Topic 所在的 Forum 中是否可以 进行跟帖
--==有以下情形下之一的，Forum 是可以跟贴的：  
--==该 Forum 以及其上级 Community 的 FollowUpWritePermission 为空  
--==该 Forum 或其上级 Community 设置了 Public 属性  
--==当前用户是 Admin  
--==当前用户是该 Forum 的 Moderator  
--==当前用户落在该 Forum 或其上级 Community 的 FollowUpWritePermission 清单中  
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-24
--====================================================================================

CREATE PROCEDURE dbo.FollowUpUserAuthenticationSave

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@Topic INT,			--指定 Topic

@oPass INT OUT		--输出参数：通过返回 1，否则 0

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--==========================================
--==先假设 检查通过
--==========================================
SET @oPass=1

--=========================================
--==根据 Topic ID 获得 Forum ID
--=========================================
DECLARE @Forum INT
SET @Forum=dbo.UDF_GetForumIDFromTopicID(@Topic)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=========================================
--==使用 UDF_ForumFollowUpWritable 函数，检查当前用户对当前论坛是否有跟贴权限
--=========================================
IF dbo.UDF_ForumFollowUpWritable(@User,@Forum)=0

BEGIN
	SET @oPass=0
	RAISERROR(N'很抱歉，您目前无权在当前论坛跟贴。<br/>请联系站点管理员获得相应社区权限。<br/>谢谢。',16,1)
	RETURN
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

/*
--=========================================
--==如果当前用户没有注册为 Community用户（且既非 Admin 又非 Moderator），则举错，并退出
--=========================================
IF (dbo.UDF_UserCommunity(@User)<>1)  AND (dbo.UDF_UserAdmin(@User)<>1) AND (dbo.UDF_UserModerator(@User,@Forum)<>1)

BEGIN
	SET @oPass=0
	RAISERROR(N'很抱歉，您不是社区用户，只有社区用户才可以跟贴。<br/>请点击 “注册“ 按钮注册为社区用户，或联系站点管理员获得社区权限。<br/>谢谢您。',16,1)
	RETURN
END

--=========================================
--==如果当前用户是 Community，但不拥有当前 Forum 的跟贴权限（且当前 Forum 非 Public，同时当前用户既非 Admin 又非 Moderator），则举错并退出
--=========================================
IF (NOT EXISTS (Select [ID] From dbo.UserForums Where [User]=@User And Forum=@Forum And FollowUpWriteEnabled=1)) AND (dbo.UDF_UserAdmin(@User)<>1) AND (dbo.UDF_UserModerator(@User,@Forum)<>1)

BEGIN
	SET @oPass=0
	RAISERROR(N'We are sorry, but you are not authorized to post followup to current Forum. <BR>Please contact our system administrator to grand the permission to you. <BR>Thank you.',16,1)
	RETURN
END
*/

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[FollowUpUserAuthenticationSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.FollowUpUserAuthenticationSelect    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FollowUpUserAuthenticationSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[FollowUpUserAuthenticationSelect]
GO

--====================================================================================
--==检查当前用户在指定 Topic 或 FollowUp 所在的 Forum 中是否可以 进行帖子浏览
--==有以下情形下之一的，Forum 是可以浏览的：  
--==该 Forum 以及其上级 Community 的 ReadPermission 为空  
--==该 Forum 或其上级 Community 设置了 Public 属性  
--==当前用户是 Admin  
--==当前用户是该 Forum 的 Moderator  
--==当前用户落在该 Forum 或其上级 Community 的 ReadPermission 清单中  
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-24
--====================================================================================

CREATE PROCEDURE dbo.FollowUpUserAuthenticationSelect

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@Topic INT,			--指定 Topic
@oPass INT OUT		--输出参数：通过返回 1，否则 0

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--==========================================
--==先假设 检查通过
--==========================================
SET @oPass=1

--=========================================
--==根据 Topic ID 获得 Forum ID （注意：这里 Topic 如果是正数，则代表 Topic ID； 如果是负数，则其绝对值代表 FollowUp ID）
--=========================================
DECLARE @Forum INT

IF @Topic>=0

	BEGIN
		SET @Forum=dbo.UDF_GetForumIDFromTopicID(@Topic)
	END
ELSE
	BEGIN
		SET @Forum=dbo.UDF_GetForumIDFromFollowUpID(ABS(@Topic))
	END

--==========================================
--==根据 UDF_ForumReadable 判断当前用户对当前 Forum 是否有访问权限
--==========================================
IF dbo.UDF_ForumReadable(@User,@Forum)=0

BEGIN
	SET @oPass=0
	RAISERROR(N'很抱歉，您无权浏览本论坛。<br/>请联系系统管理员获取相应权限。 <br/>谢谢。',16,1)
	RETURN
END

/*
--=========================================
--==如果当前 Forum 不是公众 Forum (Public<>true)，或者用户在 UserForums 中 对本 Forum 配置的 ReadEnabled 权限不是 1，且该用户既不是 Admin 也不是 Moderator，则举错，并退出 （说明用户没有对该 Forum 浏览权限）
--=========================================
IF (Not Exists (select [ID] from dbo.Forum where [ID]=@Forum and [Public]=N'true')) AND (Not Exists (select [ID] from dbo.UserForums where [User]=@User and Forum=@Forum and ReadEnabled=1)) AND (dbo.UDF_UserAdmin(@User)<>1) AND (dbo.UDF_UserModerator(@User,@Forum)<>1)
BEGIN
	SET @oPass=0
	RAISERROR(N'We are sorry, but you are not authorized to access current Forum. <BR>Please contact our system administrator to grand the permission to you. <BR>Thank you.',16,1)
	RETURN
END
*/

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[FollowUpUserAuthenticationSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicUserAuthenticationSelect    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicUserAuthenticationSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicUserAuthenticationSelect]
GO

--====================================================================================
--==检查当前用户在指定  Forum 中是否可以 进行帖子浏览
--==有以下情形下之一的，Forum 是可以浏览的：    
--==该 Forum 以及其上级 Community 的 ReadPermission 为空    
--==该 Forum 或其上级 Community 设置了 Public 属性    
--==当前用户是 Admin    
--==当前用户是该 Forum 的 Moderator    
--==当前用户落在该 Forum 或其上级 Community 的 ReadPermission 清单中    
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24
--====================================================================================

CREATE PROCEDURE dbo.TopicUserAuthenticationSelect

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@Forum INT,			--指定 Forum

@oPass INT OUT		--输出参数：通过返回 1，否则 0

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--==========================================
--==先假设 检查通过
--==========================================
SET @oPass=1

--==========================================
--==检查
--==========================================
IF dbo.UDF_ForumReadable(@User,@Forum)=0

BEGIN
	SET @oPass=0
	RAISERROR(N'很抱歉，您未被授权访问本论坛。<br/>请联系系统管理员或版主获得相应权限。<br/>谢谢。',16,1)
	RETURN
END

/*
--=========================================
--==如果当前 Forum 不是公众 Forum (Public<>true)，或者用户在 UserForums 中 对本 Forum 配置的 ReadEnabled 权限不是 1，且该用户既不是 Admin 也不是 Moderator，则举错，并退出 （说明用户没有对该 Forum 浏览权限）
--=========================================
IF (Not Exists (select [ID] from dbo.Forum where [ID]=@Forum and [Public]=N'true')) AND (Not Exists (select [ID] from dbo.UserForums where [User]=@User and Forum=@Forum and ReadEnabled=1)) AND (dbo.UDF_UserAdmin(@User)<>1) AND (dbo.UDF_UserModerator(@User,@Forum)<>1)
BEGIN
	SET @oPass=0
	RAISERROR(N'We are sorry, but you are not authorized to access current Forum. <BR>Please contact our system administrator to grand the permission to you. <BR>Thank you.',16,1)
	RETURN
END
*/

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicUserAuthenticationSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.HomePageNameGet    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[HomePageNameGet]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[HomePageNameGet]
GO

--====================================================================================
--==从 PageDirectory 表获得 Home=true 那个记录的 Name
--==用于返回系统页面菜单中充当 Home Page 的那个页的名字 （ActivePageMenuName）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-04-08 
--====================================================================================

CREATE PROCEDURE dbo.HomePageNameGet

@HomePageName nvarchar(100) OUT		--返回参数,Home Page 那页的名字 

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==返回 Home=1 的那个记录
--====================================================================================
SELECT TOP 1

	@HomePageName=pd.[Name] 

FROM dbo.PageDirectory pd

WHERE pd.Home=1

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[HomePageNameGet]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.OptionSet    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[OptionSet]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[OptionSet]
GO

--====================================================================================
--==将给定的 Option Key  的 Value 写到数据库
--==用在 CommonHelper 中保存某个系统参数
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-04-12  
--====================================================================================

CREATE PROCEDURE dbo.OptionSet

@Key nvarchar(100),				--指定 Option 名字
@Value ntext	 				--返回的结果
--@Value nvarchar(3000) 			--返回的结果

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==更新
--====================================================================================
UPDATE dbo.[Option] SET Value=@Value WHERE [Key]=@Key

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[OptionSet]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.OptionSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[OptionSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[OptionSelect]
GO

--====================================================================================
--==获取 Option 表所有 Cat 记录
--==给定 Culture 获取 Option 表 (连同 OptionContent) 中所有 Option 的 Key, Value 值以及相关 Title, Description
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28  
--====================================================================================

CREATE PROCEDURE dbo.OptionSelect

@Culture nvarchar(100) 			--当前文化

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==从 Option 表获取所有 Cat 
--====================================================================================
SELECT DISTINCT 

	opt.Cat AS Cat,
	opc.CatTitle AS CatTitle

FROM dbo.[Option] opt
LEFT JOIN dbo.OptionContent opc ON opc.OptionID=opt.[ID]

WHERE opc.Culture=@Culture
ORDER BY opc.CatTitle


--====================================================================================
--==返回所有 Option 记录，Join 当前文化下的 OptionContent 记录
--====================================================================================
SELECT 

	opt.[ID] AS [ID],
	opt.Cat AS Cat,
	opt.RightIndent AS RightIndent,
	opt.[Key] AS [Key],
	opt.Value AS Value,
	opt.Legend AS Legend,
	opt.NumberOnly AS NumberOnly,
	opt.TextArea AS TextArea,
	opt.MultiCulture AS MultiCulture,
	opt.ForTheme AS ForTheme,
	opt.Validation AS Validation,
	opc.Title AS Title,
	opc.CatTitle AS CatTitle,
	opc.[Description] As [Description]

FROM dbo.[Option] opt 
LEFT JOIN dbo.OptionContent opc ON opc.OptionID=opt.[ID]

WHERE opc.Culture=@Culture

ORDER BY opt.[ID]

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[OptionSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.OptionSave    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[OptionSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[OptionSave]
GO

--====================================================================================
--==保存 Option Key Value Pair 到 Option 表 
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-04-12  
--====================================================================================

CREATE PROCEDURE dbo.OptionSave

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@Key nvarchar(100),			--当前 Option 的名字
@Value ntext,				--当前 Option 的 Value
--@Value nvarchar(3000),		--当前 Option 的 Value

@ForTheme nvarchar(50) OUT		--返回当前 Key 是否 ForTheme


AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==修改 
--=====================================================
UPDATE dbo.[Option] SET

	Value=@Value

WHERE [Key]=@Key

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据当前 Key 是否 ForTheme 返回 ForTheme 参数，在 ASPX 端， OptionSave.cs 那里，如果是 ForTheme 则需要生成一些界面元素和 CSS
--=====================================================
SELECT @ForTheme=ForTheme FROM dbo.[Option] WHERE [Key]=@Key

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[OptionSave]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.CommunityClone    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CommunityClone]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CommunityClone]
GO

--====================================================================================
--==将一个 Community 克隆到另外一个，同时，克隆该 Community 下面的所有 Forum
--==比如要为客户开启服务通道的时候，该功能非常有用，因为一般来说，不同客户的服务通道设置基本是一致的，只需要修改不同客户名字
--==我们默认克隆遵循这样的规则：被克隆的 Community 和 新 Community 之间的唯一区别是二者 Identity 的替换 （该工具仅仅适用于客户服务通道 Community 的复制）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-22 
--==该 SP 尚未启用，我们还需要设计一个 MainDirectoryClone SP，这两个 SP 的目的是整体复制 Community （连同其属下的 Forum）；整体复制 MainDirectory （连同其属下的 SubDirectory, PageDirectory, Knowledge）。而目前的 <xxx>Move 也有类似功能，但未涉及 Community, MainDirectory 这两个第一级层面
--====================================================================================

CREATE PROCEDURE dbo.CommunityClone

@User nvarchar(50),					--从 ASPX 端传递过来的当前用户名
@CurrentCommunityID int,				--当前 Community 的 ID
@CurrentCommunityIdentity nvarchar(50),			--当前 Community 的标志(比如客户名字，我们一般按这样的规则为 Community 其名字 mCommunity<Identity>)
@NewCommunityIdentity nvarchar(50)			--新 Community 的标志

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==获得当前 Community 的名字
--=====================================================
DECLARE @CurrentCommunityName NVARCHAR(50)
SELECT @CurrentCommunityName=[Name] FROM dbo.Community WHERE [ID]=@CurrentCommunityID

--=====================================================
--==推算新 Community 的名字
--=====================================================
DECLARE @NewCommunityName NVARCHAR(50)
SET @NewCommunityName=REPLACE(@CurrentCommunityName,@CurrentCommunityIdentity,@NewCommunityIdentity)

--=====================================================
--==如果新 Community 已经存在，则举错
--=====================================================
IF EXISTS (Select [ID] From dbo.Community Where [Name]=@NewCommunityName)

BEGIN
	RAISERROR(N'您即将创建的社区已经存在。',16,1)  
	RETURN
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==获得当前 Community 的 Serial, InActiveMainMenuIconMap, ActiveMainMenuIconMap, BannerMap, BannerContentLayer, ReadPermission, TopicWritePermission, FollowUpWritePermission 几个属性
--=====================================================
DECLARE @Serial INT
DECLARE @Moderator NVARCHAR(1000)
DECLARE @Public NVARCHAR(50)
DECLARE @InActiveMainMenuIconMap NVARCHAR(4000)
DECLARE @ActiveMainMenuIconMap NVARCHAR(4000)
DECLARE @BannerMap NVARCHAR(4000)
DECLARE @BannerContentLayer NVARCHAR(4000)
DECLARE @ReadPermission NVARCHAR(4000)
DECLARE @TopicWritePermission NVARCHAR(4000)
DECLARE @FollowUpWritePermission NVARCHAR(4000)

SELECT 

	@Serial=Serial,
	@Moderator=Moderator,
	@Public=[Public],
	@InActiveMainMenuIconMap=InActiveMainMenuIconMap,
	@ActiveMainMenuIconMap=ActiveMainMenuIconMap,
	@BannerMap=BannerMap,
	@BannerContentLayer=BannerContentLayer,
	@ReadPermission=ReadPermission,
	@TopicWritePermission=TopicWritePermission,
	@FollowUpWritePermission=FollowUpWritePermission

FROM dbo.Community WHERE [ID]=@CurrentCommunityID

--=====================================================
--==创建新 Community  （如果新 Community 不存在的话）
--=====================================================
INSERT INTO dbo.Community(Serial,[Name],Moderator,[Public],InActiveMainMenuIconMap,ActiveMainMenuIconMap,BannerMap,BannerContentLayer,ReadPermission,TopicWritePermission,FollowUpWritePermission) VALUES(@Serial,@NewCommunityName,@Moderator,@Public,@InActiveMainMenuIconMap,@ActiveMainMenuIconMap,@BannerMap,@BannerContentLayer,@ReadPermission,@TopicWritePermission,@FollowUpWritePermission)


--=====================================================
--==获得新 Community  的 ID
--=====================================================
DECLARE @NewCommunityID INT
SELECT @NewCommunityID=SCOPE_IDENTITY() --输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Session 内的本表）  

--======================================================
--==增添 CommunityContent 中的记录 （先删除可能存在的重复记录）
--======================================================
DELETE FROM dbo.CommunityContent WHERE CommunityID=@NewCommunityID

INSERT INTO dbo.CommunityContent

	(
	CommunityID,
	Culture,
	Title,
	[Description],
	Hidden,

	CommandTitleTaskList,
	CommandTitleTaskListDescription,
	CommandTitleAdd,
	CommandTitleAddDescription,
	CommandTitleQuery,
	CommandTitleQueryDescription,

	TopicStatusCustomizationEmptyTopic,
	TopicStatusCustomizationSolidTopic,
	TopicStatusCustomizationHotTopic,
	TopicStatusCustomizationEliteTopic,
	TopicStatusCustomizationTabooTopic,
	TopicStatusCustomizationStickyTopic,
	TopicCommandSetEliteTopic,
	TopicCommandSetTabooTopic,
	TopicCommandSetStickyTopic
	) 

SELECT 

	@NewCommunityID,
	Culture,
	REPLACE(Title,@CurrentCommunityIdentity,@NewCommunityIdentity),
	REPLACE([Description],@CurrentCommunityIdentity,@NewCommunityIdentity),
	Hidden,

	REPLACE(CommandTitleTaskList,@CurrentCommunityIdentity,@NewCommunityIdentity),
	REPLACE(CommandTitleTaskListDescription,@CurrentCommunityIdentity,@NewCommunityIdentity),
	REPLACE(CommandTitleAdd,@CurrentCommunityIdentity,@NewCommunityIdentity),
	REPLACE(CommandTitleAddDescription,@CurrentCommunityIdentity,@NewCommunityIdentity),
	REPLACE(CommandTitleQuery,@CurrentCommunityIdentity,@NewCommunityIdentity),
	REPLACE(CommandTitleQueryDescription,@CurrentCommunityIdentity,@NewCommunityIdentity),

	REPLACE(TopicStatusCustomizationEmptyTopic,@CurrentCommunityIdentity,@NewCommunityIdentity),
	REPLACE(TopicStatusCustomizationSolidTopic,@CurrentCommunityIdentity,@NewCommunityIdentity),
	REPLACE(TopicStatusCustomizationHotTopic,@CurrentCommunityIdentity,@NewCommunityIdentity),
	REPLACE(TopicStatusCustomizationEliteTopic,@CurrentCommunityIdentity,@NewCommunityIdentity),
	REPLACE(TopicStatusCustomizationTabooTopic,@CurrentCommunityIdentity,@NewCommunityIdentity),
	REPLACE(TopicStatusCustomizationStickyTopic,@CurrentCommunityIdentity,@NewCommunityIdentity),
	REPLACE(TopicCommandSetEliteTopic,@CurrentCommunityIdentity,@NewCommunityIdentity),
	REPLACE(TopicCommandSetTabooTopic,@CurrentCommunityIdentity,@NewCommunityIdentity),
	REPLACE(TopicCommandSetStickyTopic,@CurrentCommunityIdentity,@NewCommunityIdentity)


FROM dbo.CommunityContent
WHERE CommunityID=@CurrentCommunityID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==先删除旧的，可能的新 Community 下的 Forum
--======================================================
DELETE FROM dbo.Forum WHERE CommunityID=@NewCommunityID


--======================================================
--==使用 Cursor
--======================================================
DECLARE ForumCursor CURSOR FOR 

SELECT 

	[ID],
	CommunityID,
	Serial,
	[Name],
	Moderator,
	[Public],
	ReadPermission,
	TopicWritePermission,
	FollowUpWritePermission
	

FROM dbo.Forum
WHERE CommunityID=@CurrentCommunityID

DECLARE @CurrentForumID INT
DECLARE @CurrentForumCommunityID INT
DECLARE @CurrentForumSerial INT
DECLARE @CurrentForumName NVARCHAR(50)
DECLARE @CurrentForumModerator NVARCHAR(1000)
DECLARE @CurrentForumPublic NVARCHAR(50)
DECLARE @CurrentForumReadPermission NVARCHAR(4000)
DECLARE @CurrentForumTopicWritePermission NVARCHAR(4000)
DECLARE @CurrentForumFollowUpWritePermission NVARCHAR(4000)

OPEN ForumCursor

FETCH NEXT FROM ForumCursor INTO 

@CurrentForumID, 
@CurrentForumCommunityID,
@CurrentForumSerial, 
@CurrentForumName,
@CurrentForumModerator,
@CurrentForumPublic,
@CurrentForumReadPermission,
@CurrentForumTopicWritePermission,
@CurrentForumFollowUpWritePermission

WHILE @@FETCH_STATUS = 0

BEGIN

	--======================================================
	--==复制 Forum 
	--======================================================
	INSERT INTO dbo.Forum

		(
		CommunityID,
		Serial,
		[Name],
		Moderator,
		[Public],
		ReadPermission,
		TopicWritePermission,
		FollowUpWritePermission
		)

	VALUES 

		(
		@NewCommunityID,
		@CurrentForumSerial, 
		REPLACE(@CurrentForumName,@CurrentCommunityIdentity,@NewCommunityIdentity),
		@CurrentForumModerator,
		@CurrentForumPublic,
		@CurrentForumReadPermission,
		@CurrentForumTopicWritePermission,
		@CurrentForumFollowUpWritePermission
		)


	
	--=====================================================
	--==获得新 Forum  的 ID
	--=====================================================
	DECLARE @NewForumID INT
	SELECT @NewForumID=SCOPE_IDENTITY() --输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Session 内的本表）  

	--======================================================
	--==增添 ForumContent， 先删除旧的，可能的新 Forum 下的 ForumContent
	--======================================================
	DELETE FROM dbo.ForumContent WHERE ForumID=@NewForumID

	INSERT INTO dbo.ForumContent
	
		(
		ForumID,
		Culture,
		Title,
		[Description],
		Hidden,

		CommandTitleTaskList,
		CommandTitleTaskListDescription,
		CommandTitleAdd,
		CommandTitleAddDescription,
		CommandTitleQuery,
		CommandTitleQueryDescription,

		TopicStatusCustomizationEmptyTopic,
		TopicStatusCustomizationSolidTopic,
		TopicStatusCustomizationHotTopic,
		TopicStatusCustomizationEliteTopic,
		TopicStatusCustomizationTabooTopic,
		TopicStatusCustomizationStickyTopic,
		TopicCommandSetEliteTopic,
		TopicCommandSetTabooTopic,
		TopicCommandSetStickyTopic
		)

	SELECT 

		@NewForumID,
		Culture,
		REPLACE(Title,@CurrentCommunityIdentity,@NewCommunityIdentity),
		REPLACE([Description],@CurrentCommunityIdentity,@NewCommunityIdentity),
		Hidden,

		REPLACE(CommandTitleTaskList,@CurrentCommunityIdentity,@NewCommunityIdentity),
		REPLACE(CommandTitleTaskListDescription,@CurrentCommunityIdentity,@NewCommunityIdentity),
		REPLACE(CommandTitleAdd,@CurrentCommunityIdentity,@NewCommunityIdentity),
		REPLACE(CommandTitleAddDescription,@CurrentCommunityIdentity,@NewCommunityIdentity),
		REPLACE(CommandTitleQuery,@CurrentCommunityIdentity,@NewCommunityIdentity),
		REPLACE(CommandTitleQueryDescription,@CurrentCommunityIdentity,@NewCommunityIdentity),

		REPLACE(TopicStatusCustomizationEmptyTopic,@CurrentCommunityIdentity,@NewCommunityIdentity),
		REPLACE(TopicStatusCustomizationSolidTopic,@CurrentCommunityIdentity,@NewCommunityIdentity),
		REPLACE(TopicStatusCustomizationHotTopic,@CurrentCommunityIdentity,@NewCommunityIdentity),
		REPLACE(TopicStatusCustomizationEliteTopic,@CurrentCommunityIdentity,@NewCommunityIdentity),
		REPLACE(TopicStatusCustomizationTabooTopic,@CurrentCommunityIdentity,@NewCommunityIdentity),
		REPLACE(TopicStatusCustomizationStickyTopic,@CurrentCommunityIdentity,@NewCommunityIdentity),
		REPLACE(TopicCommandSetEliteTopic,@CurrentCommunityIdentity,@NewCommunityIdentity),
		REPLACE(TopicCommandSetTabooTopic,@CurrentCommunityIdentity,@NewCommunityIdentity),
		REPLACE(TopicCommandSetStickyTopic,@CurrentCommunityIdentity,@NewCommunityIdentity)

	FROM dbo.ForumContent
	WHERE ForumID=@CurrentForumID


	FETCH NEXT FROM ForumCursor INTO 

	@CurrentForumID, 
	@CurrentForumCommunityID,
	@CurrentForumSerial, 
	@CurrentForumName,
	@CurrentForumModerator,
	@CurrentForumPublic,
	@CurrentForumReadPermission,
	@CurrentForumTopicWritePermission,
	@CurrentForumFollowUpWritePermission

END


CLOSE ForumCursor
DEALLOCATE ForumCursor

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[CommunityClone]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.XToolOptionInsertScripts    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[XToolOptionInsertScripts]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[XToolOptionInsertScripts]
GO

--====================================================================================
--==系统工具 - 该工具用来将 Option 中的值生成 INSERT 脚本，用来进行系统初始化
--==该工具只用于系统只用于开发，部署，升级，最终用户不可以使用该工具进行任何操作
--==！2009-08-08： 本 SP目前弃用 ！
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12  
--====================================================================================

CREATE PROCEDURE dbo.XToolOptionInsertScripts

@ForSetup INT			--该 SP 是否用于 Setup 程序，对于 Setup 程序，我们需要将某些 Option 进行净化  (1/2)

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=============================================
--==首先将 OptionContent 中的记录删除
--=============================================
PRINT N'DELETE FROM dbo.[Option]'
PRINT N''

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=============================================
--==临时变量
--=============================================
declare @ID int
declare @Cat nvarchar(100)
declare @RightIndent int
declare @Key nvarchar(100)
declare @Value nvarchar(4000)
declare @Legend nvarchar(50)
declare @NumberOnly nvarchar(50)
declare @TextArea nvarchar(50)
declare @MultiCulture nvarchar(50)
declare @ForTheme nvarchar(50)
declare @Validation nvarchar(50)

--=============================================
--==创建 cursor，遍历 Option 表中值，生成 Insert Scripts
--=============================================
declare OptionCursor cursor for select [ID],Cat,RightIndent,[Key],CONVERT(NVARCHAR(4000),Value),Legend,NumberOnly,TextArea,MultiCulture,ForTheme,Validation from dbo.[Option] order by [ID]
open OptionCursor
fetch next from OptionCursor into @ID,@Cat,@RightIndent,@Key,@Value,@Legend,@NumberOnly,@TextArea,@MultiCulture,@ForTheme,@Validation

while @@Fetch_Status=0
begin
	print N'INSERT INTO dbo.[Option] '
	print N'('
	print N'	[ID],'
	print N'	[Cat],'
	print N'	[RightIndent],'
	print N'	[Key],'
	print N'	[Value],'
	print N'	[Legend],'
	print N'	[NumberOnly],'
	print N'	[TextArea],'
	print N'	[MultiCulture],'
	print N'	[ForTheme],'
	print N'	[Validation]'
	print N')'
	print N'VALUES'
	print N'('
	print N'	' + CONVERT(NVARCHAR(20),@ID) + N','
	print N'	N''' + REPLACE(@Cat,N'''',N'''''') + N''','
	print N'	' + CONVERT(NVARCHAR(20),@RightIndent) + N','
	print N'	N''' + REPLACE(@Key,N'''',N'''''') + N''','
	print N'	N''' + REPLACE(@Value,N'''',N'''''') + N''','
	print N'	N''' + REPLACE(@Legend,N'''',N'''''') + N''','
	print N'	N''' + REPLACE(@NumberOnly,N'''',N'''''') + N''','
	print N'	N''' + REPLACE(@TextArea,N'''',N'''''') + N''','
	print N'	N''' + REPLACE(@MultiCulture,N'''',N'''''') + N''','
	print N'	N''' + REPLACE(@ForTheme,N'''',N'''''') + N''','
	print N'	N''' + REPLACE(@Validation,N'''',N'''''') + N''''
	print N')'
	print N''

	fetch next from OptionCursor into @ID,@Cat,@RightIndent,@Key,@Value,@Legend,@NumberOnly,@TextArea,@MultiCulture,@ForTheme,@Validation
end
close OptionCursor
deallocate OptionCursor

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=============================================
--==如果用于 Setup 工程，则我们需要将以下参数净化
--=============================================
IF @ForSetup=1
BEGIN
	/*
	print N' UPDATE dbo.[Option] SET [Value]=N'''' WHERE [Key]=N''PageTextureCss'' '
	print N' UPDATE dbo.[Option] SET [Value]=N''2'' WHERE [Key]=N''LayoutTemplate'' '
	print N' UPDATE dbo.[Option] SET [Value]=N'''' WHERE [Key]=N''LogoTextureCss'' '
	print N' UPDATE dbo.[Option] SET [Value]=N'''' WHERE [Key]=N''LogoMap'' '
	print N' UPDATE dbo.[Option] SET [Value]=N''2'' WHERE [Key]=N''MainMenuSeparator'' '
	print N' UPDATE dbo.[Option] SET [Value]=N'''' WHERE [Key]=N''BannerTextureCss'' '
	print N' UPDATE dbo.[Option] SET [Value]=N'''' WHERE [Key]=N''BannerMap'' '
	print N' UPDATE dbo.[Option] SET [Value]=N'''' WHERE [Key]=N''BannerRotatorCandidate'' '
	print N' UPDATE dbo.[Option] SET [Value]=N'''' WHERE [Key]=N''FastContentTitle'' '
	print N' UPDATE dbo.[Option] SET [Value]=N'''' WHERE [Key]=N''FastContent'' '
	print N' UPDATE dbo.[Option] SET [Value]=N''true'' WHERE [Key]=N''FastContentHidden'' '
	print N' UPDATE dbo.[Option] SET [Value]=N'''' WHERE [Key]=N''MyCss'' '
	print N' UPDATE dbo.[Option] SET [Value]=N'''' WHERE [Key]=N''CopyrightTextureCss'' '
	print N' UPDATE dbo.[Option] SET [Value]=N'''' WHERE [Key]=N''CopyrightIconMap'' '
	print N' UPDATE dbo.[Option] SET [Value]=N'''' WHERE [Key]=N''RegisterWelcomeMessage'' '
	print N' UPDATE dbo.[Option] SET [Value]=N'''' WHERE [Key]=N''FastLink'' '
	*/
	print N' UPDATE dbo.[Option] SET [Value]=N'''' WHERE [Cat]=N''SMTP'' '
	print N' UPDATE dbo.[Option] SET [Value]=N''zh-cn:简体,zh-tw:繁體,en-us:English'' WHERE [Key]=N''Cultures'' '
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[XToolOptionInsertScripts]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.XToolOptionContentInsertScripts    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[XToolOptionContentInsertScripts]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[XToolOptionContentInsertScripts]
GO

--====================================================================================
--==系统工具 - 该工具用来将 OptionContent 中的值生成 INSERT 脚本，用来进行系统初始化
--==该工具只用于系统只用于开发，部署，升级，最终用户不可以使用该工具进行任何操作
--==！2009-08-08：该 SP 目前弃用！
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12  
--====================================================================================

CREATE PROCEDURE dbo.XToolOptionContentInsertScripts

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=============================================
--==首先将 OptionContent 中的记录删除
--=============================================
PRINT N'DELETE FROM dbo.OptionContent'
PRINT N''

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=============================================
--==临时变量
--=============================================
declare @ID int
declare @OptionID int
declare @Culture nvarchar(100)
declare @Title nvarchar(200)
declare @CatTitle nvarchar(200)
declare @Description nvarchar(3000)

--=============================================
--==创建 cursor，遍历 OptionContent 表中值，生成 Insert Scripts
--=============================================
declare OptionContentCursor cursor for select [ID],[OptionID],[Culture],[Title],[CatTitle],[Description] from dbo.[OptionContent] order by [ID]
open OptionContentCursor
fetch next from OptionContentCursor into @ID,@OptionID,@Culture,@Title,@CatTitle,@Description

while @@Fetch_Status=0
begin
	print N'INSERT INTO dbo.[OptionContent] '
	print N'('
	print N'	[ID],'
	print N'	[OptionID],'
	print N'	[Culture],'
	print N'	[Title],'
	print N'	[CatTitle],'
	print N'	[Description]'
	print N')'
	print N'VALUES'
	print N'('
	print N'	' + CONVERT(NVARCHAR(20),@ID) + N','
	print N'	' + CONVERT(NVARCHAR(20),@OptionID) + N','
	print N'	N''' + REPLACE(@Culture,N'''',N'''''') + N''','
	print N'	N''' + REPLACE(@Title,N'''',N'''''') + N''','
	print N'	N''' + REPLACE(@CatTitle,N'''',N'''''') + N''','
	print N'	N''' + REPLACE(@Description,N'''',N'''''') + N''''
	print N')'
	print N''

	fetch next from OptionContentCursor into @ID,@OptionID,@Culture,@Title,@CatTitle,@Description
end
close OptionContentCursor
deallocate OptionContentCursor


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[XToolOptionContentInsertScripts]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicMove    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicMove]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicMove]
GO

--====================================================================================
--==移动复制 Topic 到别的版面
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28 
--====================================================================================

CREATE PROCEDURE dbo.TopicMove

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@TopicID int,					--Topic 的 ID
@ForumList nvarchar(4000),			--复制移动到哪些 Forum
@KeepOriginal nvarchar(50)			--是否保留原帖子（true/false）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （只有系统管理员才有这个权限）
--=====================================================

DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将 ForumList 转换为 CURSOR
--=====================================================
DECLARE @Forum INT
DECLARE ForumCursor CURSOR FOR SELECT [Element] FROM dbo.UDF_PublicSplit(@ForumList,N',')

OPEN ForumCursor
FETCH NEXT FROM ForumCursor INTO @Forum

WHILE @@FETCH_STATUS = 0
BEGIN

	--=====================================================
	--==复制当前 Topic 记录为新记录，同时起用新的 ForumID, PostTime
	--=====================================================
	INSERT INTO dbo.Topic (ForumID,TopicStatus,[User],PostTime,Title,Content,Hit,AttachmentName) SELECT @Forum,TopicStatus,[User],PostTime,Title,Content,Hit,AttachmentName FROM dbo.Topic WHERE [ID]=@TopicID

	--=====================================================
	--==获得新复制的 Topic ID
	--=====================================================
	DECLARE @NewTopicID INT
	SELECT @NewTopicID=SCOPE_IDENTITY() --输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）  

	--=====================================================
	--==复制当前 Topic 下的 FollowUp 记录为新记录，同时起用新的 TopicID
	--=====================================================
	INSERT INTO dbo.FollowUp (TopicID,[User],PostTime,Content,AttachmentName) SELECT @NewTopicID,[User],PostTime,Content,AttachmentName FROM dbo.FollowUp WHERE TopicID=@TopicID

	--=====================================================
	--==继续下个 CURSOR
	--=====================================================
	FETCH NEXT FROM ForumCursor INTO @Forum
END

CLOSE ForumCursor
DEALLOCATE ForumCursor

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==最后，如果 @KeepOriginal 为 false ，则删除原始帖 （Topic 表中的 Trigger 会删除相应 FollowUp 记录）
--=====================================================
IF LOWER(@KeepOriginal)=LOWER(N'false')
BEGIN
	DELETE FROM dbo.Topic WHERE [ID]=@TopicID  
END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicMove]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.XToolAddOptionContentInsertScripts    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[XToolAddOptionContentInsertScripts]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[XToolAddOptionContentInsertScripts]
GO

--====================================================================================
--==统工具，生成给定新语种的 OptionContent 初始化 Script
--==该工具只用于系统只用于开发，部署，升级，最终用户不可以使用该工具进行任何操作
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12  
--====================================================================================

CREATE PROCEDURE dbo.XToolAddOptionContentInsertScripts

@AdditionalCulture NVARCHAR(100)			-- 新增文化

AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=============================================
--==首先将 OptionContent 中的记录删除
--=============================================
PRINT N'DELETE FROM dbo.OptionContent'
PRINT N''

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=============================================
--==跟踪 @OptionContentCounter
--=============================================
declare @OptionContentCounter int
set @OptionContentCounter=1

--=============================================
--==临时变量
--=============================================
declare @OptionID int

--=============================================
--==创建 cursor，遍历 Option 表中值，获得 Option ID Cursor
--=============================================
declare OptionCursor cursor for select [ID] from dbo.[Option] order by [ID]
open OptionCursor
fetch next from OptionCursor into @OptionID

while @@Fetch_Status=0
begin
	--=============================================
	--==临时变量
	--=============================================
	declare @ThisOptionContentID int
	declare @ThisOptionID int
	declare @ThisCulture nvarchar(100)
	declare @ThisTitle nvarchar(200)
	declare @ThisCatTitle nvarchar(200)
	declare @ThisDescription nvarchar(3000)

	--=============================================
	--==创建 cursor，遍历 OptionContent 表中值，生成 Insert Scripts
	--=============================================
	declare OptionContentCursor cursor for select [ID],OptionID,[Culture],[Title],[CatTitle],[Description] from dbo.[OptionContent] where OptionID=@OptionID order by [ID]	
	open OptionContentCursor
	fetch next from OptionContentCursor into @ThisOptionContentID,@ThisOptionID,@ThisCulture,@ThisTitle,@ThisCatTitle,@ThisDescription

	while @@Fetch_Status=0
	begin
		print N'INSERT INTO dbo.[OptionContent] '
		print N'('
		print N'	[ID],'
		print N'	[OptionID],'
		print N'	[Culture],'
		print N'	[Title],'
		print N'	[CatTitle],'
		print N'	[Description]'
		print N')'
		print N'VALUES'
		print N'('
		print N'	' + CONVERT(NVARCHAR(20),@OptionContentCounter) + N','
		print N'	' + CONVERT(NVARCHAR(20),@OptionID) + N','
		print N'	N''' + REPLACE(@ThisCulture,N'''',N'''''') + N''','
		print N'	N''' + REPLACE(@ThisTitle,N'''',N'''''') + N''','
		print N'	N''' + REPLACE(@ThisCatTitle,N'''',N'''''') + N''','
		print N'	N''' + REPLACE(@ThisDescription,N'''',N'''''') + N''''
		print N')'
		print N''

		--=============================================
		--==@OptionContentCounter++
		--=============================================
		SET @OptionContentCounter=@OptionContentCounter+1

		--=============================================
		--==继续
		--=============================================
		fetch next from OptionContentCursor into @ThisOptionContentID,@ThisOptionID,@ThisCulture,@ThisTitle,@ThisCatTitle,@ThisDescription
	end

	--=============================================
	--==继续添加新增文化的插入 Script
	--=============================================
	print N'--NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN'
	print N'--Fill up the Title and Description Field in following Scripts under New Culture '
	print N'--NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN'
	print N'INSERT INTO dbo.[OptionContent] '
	print N'('
	print N'	[ID],'
	print N'	[OptionID],'
	print N'	[Culture],'
	print N'	[Title],'
	print N'	[CatTitle],'
	print N'	[Description]'
	print N')'
	print N'VALUES'
	print N'('
	print N'	' + CONVERT(NVARCHAR(20),@OptionContentCounter) + N','
	print N'	' + CONVERT(NVARCHAR(20),@OptionID) + N','
	print N'	N''' + REPLACE(@AdditionalCulture,N'''',N'''''') + N''','
	print N'	N'''','
	print N'	N''' + REPLACE(@ThisCatTitle,N'''',N'''''') + N''','
	print N'	N'''''
	print N')'
	print N'--NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN'
	print N''

	--=============================================
	--==再次@OptionContentCounter++
	--=============================================
	SET @OptionContentCounter=@OptionContentCounter+1

	close OptionContentCursor
	deallocate OptionContentCursor

	--=============================================
	--==继续 Option Cursor
	--=============================================
	fetch next from OptionCursor into @OptionID
end
close OptionCursor
deallocate OptionCursor

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[XToolAddOptionContentInsertScripts]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.OptionGetAll    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[OptionGetAll]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[OptionGetAll]
GO

--====================================================================================
--==将 Option 表所有 Key Value 返回，在 global.asax 的 application_start 中，将 option 所有项目存到 Application 全局变量缓存，避免每次调用 option 都使用数据库查询
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-06-24
--====================================================================================

CREATE PROCEDURE dbo.OptionGetAll


AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择
--====================================================================================
SELECT 
	opt.Cat AS Cat,
	opt.[Key] AS [Key],
	opt.Value AS Value,
	ISNULL(opt.MultiCulture,N'false') AS MultiCulture,
	ISNULL(opt.Validation,N'') AS Validation

FROM dbo.[Option] opt


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[OptionGetAll]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeGet    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeGet]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeGet]
GO

--====================================================================================
--==KnowledgeGet 的分页显示版  （在系统 Option 中，如果 KnowledgePageSize 设置为 0， 则不分页显示，如果大于 0，则分页显示）
--==表 Knowledge 中的 DedicatedTo 为空的时候，所有访问者可浏览； 为 abc,efg 则指定客户可浏览； 
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-10-05
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeGet

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名

@PageDirectoryName nvarchar(100),				--Page Diretory 的 Name
@Culture nvarchar(100),						--当前文化

@CurrentPage INT						--页码机制：当前页

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==获得当前 PageDirectory  的 Type 值，如果是 1，则我们后面的结果将使用 Order By Serial （普通内容，以 Serial 排序）； 如果是 2 则 Order By UpdateTime （基于时间的内容以发布时间排序）
--====================================================================================
DECLARE @Type INT
SELECT @Type=Type FROM dbo.PageDirectory WHERE [Name]=@PageDirectoryName
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==获得 @PageDirectoryName  所在的 PageDirectory 记录中的 PageSize 值
--====================================================================================
DECLARE @PageSize INT
SELECT TOP 1 @PageSize=PageSize FROM dbo.PageDirectory WHERE [Name]=@PageDirectoryName

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==建立分页
--====================================================================================
DECLARE @Paging TABLE 
( 
	PagingID int identity(1,1), 
	[ID] int, 
	PageDirectoryID int,
	Serial int,
	Hidden bit,
	Approved int,
	ApproveMessage ntext COLLATE database_default, 
	ApprovedBy nvarchar(50) COLLATE database_default, 
	UpdateTime datetime,
	Author nvarchar(50) COLLATE database_default, 
	KnowledgeType int,

	Editor ntext COLLATE database_default, 
	EditorPermission int,
	
	KnowledgeContentID int,

	--Template nvarchar(200) COLLATE database_default, 
	Title nvarchar(2000) COLLATE database_default, 
	--TitleShow nvarchar(50) COLLATE database_default, 
	Content ntext COLLATE database_default, 
	Tag nvarchar(500) COLLATE database_default, 
	Abstract ntext COLLATE database_default, 
	
	HitCount int,
	CommentsPermission int,
	CommentsCount int,

	KnowledgeDirectory nvarchar(50) COLLATE database_default 
) 

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==从 Option 表返回 KnowledgeApprove 属性
--====================================================================================
DECLARE @KnowledgeApprove NVARCHAR(50)
SELECT @KnowledgeApprove=CONVERT(NVARCHAR(50),opt.[Value]) FROM dbo.[Option] opt WHERE opt.[Key]=N'KnowledgeApprove'

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==根据 Type=1/2 决定后面使用 ORDER BY Serial 还是 UpdateTime （以下两段代码除了 Order By 之外，其它地方完全一致）
--====================================================================================
IF @Type=1

BEGIN

	--====================================================================================
	--==当前用户是 Admin Editor 还是普通用户
	--====================================================================================
	IF  dbo.UDF_UserAdminEditor(@User)=1

	BEGIN

		--====================================================================================
		--==当前用户是 Admin Editor
		--====================================================================================
		INSERT INTO @Paging

		SELECT

			now.[ID] AS [ID],
			now.PageDirectoryID AS PageDirectoryID,
			now.Serial AS Serial,
			ISNULL(nowc.Hidden,0) AS Hidden,
			ISNULL(nowc.Approved,0) AS Approved,
			ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
			ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
			now.UpdateTime AS UpdateTime,
			now.Author AS Author,
			now.KnowledgeType AS KnowledgeType,

			now.Editor AS Editor,
			dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,

			nowc.[ID] AS KnowledgeContentID,

			--nowc.Template AS Template,
			nowc.Title AS Title,
			--nowc.TitleShow AS TitleShow,
			nowc.Content AS Content,
			nowc.Tag AS Tag,
			nowc.Abstract AS Abstract,

			ISNULL(nowc.HitCount,0)+1 AS HitCount,
			dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
			(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,

			N'Knowledge' AS KnowledgeDirectory

		FROM dbo.Knowledge now
		LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
		LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
		WHERE pad.[Name]=@PageDirectoryName

		ORDER BY Serial

	END

	ELSE

	BEGIN
		--====================================================================================
		--==当前用户《不是》 Admin Editor
		--====================================================================================
		INSERT INTO @Paging

		SELECT

			now.[ID] AS [ID],
			now.PageDirectoryID AS PageDirectoryID,
			now.Serial AS Serial,
			ISNULL(nowc.Hidden,0) AS Hidden,
			ISNULL(nowc.Approved,0) AS Approved,
			ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
			ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
			now.UpdateTime AS UpdateTime,
			now.Author AS Author,
			now.KnowledgeType AS KnowledgeType,

			now.Editor AS Editor,
			dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,

			nowc.[ID] AS KnowledgeContentID,

			--nowc.Template AS Template,
			nowc.Title AS Title,
			--nowc.TitleShow AS TitleShow,
			nowc.Content AS Content,
			nowc.Tag AS Tag,
			nowc.Abstract AS Abstract,

			ISNULL(nowc.HitCount,0)+1 AS HitCount,
			dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
			(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,

			N'Knowledge' AS KnowledgeDirectory

		FROM dbo.Knowledge now
		LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]
		LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
		LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
		WHERE pad.[Name]=@PageDirectoryName AND (REPLACE(nowp.DedicatedTo,N',',N'')=N'' or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)  AND  nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N'false')

		ORDER BY Serial
	END

END

ELSE

BEGIN

	--====================================================================================
	--==当前用户是 Admin Editor 还是普通用户
	--====================================================================================
	IF  dbo.UDF_UserAdminEditor(@User)=1

	BEGIN

		--====================================================================================
		--==当前用户是 Admin Editor
		--====================================================================================
		INSERT INTO @Paging

		SELECT

			now.[ID] AS [ID],
			now.PageDirectoryID AS PageDirectoryID,
			now.Serial AS Serial,
			ISNULL(nowc.Hidden,0) AS Hidden,
			ISNULL(nowc.Approved,0) AS Approved,
			ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
			ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
			now.UpdateTime AS UpdateTime,
			now.Author AS Author,
			now.KnowledgeType AS KnowledgeType,

			now.Editor AS Editor,
			dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,

			nowc.[ID] AS KnowledgeContentID,

			--nowc.Template AS Template,
			nowc.Title AS Title,
			--nowc.TitleShow AS TitleShow,
			nowc.Content AS Content,
			nowc.Tag AS Tag,
			nowc.Abstract AS Abstract,

			ISNULL(nowc.HitCount,0)+1 AS HitCount,
			dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
			(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,

			N'Knowledge' AS KnowledgeDirectory

		FROM dbo.Knowledge now
		LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
		LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
		WHERE pad.[Name]=@PageDirectoryName

		ORDER BY UpdateTime DESC

	END

	ELSE

	BEGIN

		--====================================================================================
		--==当前用户《不是》 Admin Editor
		--====================================================================================
		INSERT INTO @Paging

		SELECT

			now.[ID] AS [ID],
			now.PageDirectoryID AS PageDirectoryID,
			now.Serial AS Serial,
			ISNULL(nowc.Hidden,0) AS Hidden,
			ISNULL(nowc.Approved,0) AS Approved,
			ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
			ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
			now.UpdateTime AS UpdateTime,
			now.Author AS Author,
			now.KnowledgeType AS KnowledgeType,

			now.Editor AS Editor,
			dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,

			nowc.[ID] AS KnowledgeContentID,

			--nowc.Template AS Template,
			nowc.Title AS Title,
			--nowc.TitleShow AS TitleShow,
			nowc.Content AS Content,
			nowc.Tag AS Tag,
			nowc.Abstract AS Abstract,

			ISNULL(nowc.HitCount,0)+1 AS HitCount,
			dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
			(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,

			N'Knowledge' AS KnowledgeDirectory

		FROM dbo.Knowledge now
		LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]
		LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
		LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
		WHERE pad.[Name]=@PageDirectoryName AND (REPLACE(nowp.DedicatedTo,N',',N'')=N''  or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)  AND nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N'false')

		ORDER BY UpdateTime DESC
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==最后从 @Paging 表变量中获取当前页第一个和最后一个记录的位置
--=====================================================
DECLARE @FirstRecord int
DECLARE @LastRecord int
		
SET @FirstRecord=(@CurrentPage - 1) * @PageSize
SET @LastRecord=(@CurrentPage * @PageSize + 1)

--=====================================================
--==返回当前页中的记录
--==总记录数，除以每页的记录数，用Ceiling()处理，得到的为页数 （注意：count(*)  和 @PageSize 都为 INT，它们相除将得到 INT，所以，首先要将它们转换成 Decimal(18,2)）
--=====================================================
SELECT 	
	*,
	PageCount=CEILING(Convert(decimal(18,2),(select count(*) from @Paging)) / Convert(decimal(18,2),@PageSize)) 

FROM @Paging 
WHERE PagingID>@FirstRecord AND PagingID<@LastRecord

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将《当前页》准备返回的知识 Content  的 HitCount 写回 KnowledgeContent 
--=====================================================
--UPDATE dbo.KnowledgeContent SET HitCount=ISNULL(HitCount,0)+1 WHERE KnowledgeID IN (Select [ID] From @Paging Where PagingID>@FirstRecord AND PagingID<@LastRecord) AND Culture=@Culture
UPDATE dbo.KnowledgeContent SET HitCount=ISNULL(HitCount,0)+1 WHERE [ID] IN (Select KnowledgeContentID From @Paging Where PagingID>@FirstRecord AND PagingID<@LastRecord)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==在 SiteLog 中记录在案 （当前 Paging 里面所有的 KnowledgeContent 都被当前 @User 浏览了一下）
--==原本应当使用 SP SiteLogSave ，但在这里，如果使用 SP SiteLogSave 就必须使用性能非常差的 Cursor，为了避免 Curor 操作，我们这里直接 Insert
--==注意：必须检查 @User 是否为空（排除未登录用户也能浏览的情形）
--=====================================================
IF (@User<>N'') AND (@User IS NOT NULL)
BEGIN
	INSERT INTO dbo.SiteLog ([User],Activity,TargetID,ActivityTime) SELECT @User,1,KnowledgeContentID,GETDATE() FROM @Paging Where PagingID>@FirstRecord AND PagingID<@LastRecord
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==选择给定 @PageDirectoryName 的 PageDirectory ID 和 Knowledge 的 KnowledgeDirectory 名字  （该部分用于创建 “新知识” 链接） 
--==同时返回当前 PageDirectory 的某些属性（Type, Presentation, ShowTitle, ShowAuthor, ShowUpdateTime, ShowHitCount, ShowComments, ShowStaticUrl, ShowKnowledgeHtml, ShowRelative），以便告诉系统如何 Render 知识
--=====================================================
SELECT
	pad.[ID] AS PageDirectoryID,
	pad.[Name] AS PageDirectoryName,
	N'Knowledge' AS KnowledgeDirectory,

	ISNULL(pdc.OutlineMode,0) AS OutlineMode,

	pdc.Title AS Title,
	pdc.Template AS Template,
	pdc.PageHeader AS PageHeader,
	pdc.PageFooter AS PageFooter,

	sdc.PageHeader AS SubDirectoryPageHeader,
	sdc.PageFooter AS  SubDirectoryPageFooter,

	mdc.PageHeader AS MainDirectoryPageHeader,
	mdc.PageFooter AS  MainDirectoryPageFooter,

	pad.Type AS Type,
	pad.Presentation AS Presentation,
	pad.JumpToContent AS JumpToContent,

	pad.ShowTitle AS ShowTitle,
	pad.ShowAuthor AS ShowAuthor,
	pad.ShowUpdateTime AS ShowUpdateTime,
	pad.ShowHitCount AS ShowHitCount,
	pad.ShowComments AS ShowComments,
	pad.ShowStaticUrl AS ShowStaticUrl,
	pad.ShowKnowledgeHtml AS ShowKnowledgeHtml,
	pad.ShowRelative AS ShowRelative

	--pad.Overview AS PageDirectoryOverview,
	--sd.Overview AS SubDirectoryOverview,
	--(Select COUNT(dpd.[ID]) From dbo.PageDirectory dpd Where dpd.SubDirectoryID=(sd.[ID])) AS PageDirectoryBrothersCount,
	--(Select COUNT(dsd.[ID]) From dbo.SubDirectory dsd Where dsd.MainDirectoryID=(md.[ID])) AS SubDirectoryBrothersCount
	


FROM dbo.PageDirectory pad 
LEFT JOIN dbo.PageDirectoryContent pdc ON pdc.PageDirectoryID=pad.[ID] AND pdc.Culture=@Culture

LEFT JOIN dbo.SubDirectory sd ON sd.[ID]=pad.SubDirectoryID
LEFT JOIN dbo.SubDirectoryContent sdc ON sdc.SubDirectoryID=sd.[ID]

LEFT JOIN dbo.MainDirectory md ON md.[ID]=sd.MainDirectoryID
LEFT JOIN dbo.MainDirectoryContent mdc ON mdc.MainDirectoryID=md.[ID]

WHERE pad.[Name]=@PageDirectoryName

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeGet]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeGetHomePage    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeGetHomePage]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeGetHomePage]
GO

--====================================================================================
--==KnowledgeGetHomePage 的分页版  （在系统 Option 中，如果 KnowledgePageSize 设置为 0， 则不分页显示，如果大于 0，则分页显示）
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-10-05
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeGetHomePage

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名

@Culture nvarchar(100),						--当前文化

@CurrentPage INT						--页码机制：当前页

AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==获得当前 PageDirectory  的 Type 值，如果是 1，则我们后面的结果将使用 Order By Serial （普通内容，以 Serial 排序）； 如果是 2 则 Order By UpdateTime （基于时间的内容以发布时间排序）
--====================================================================================
DECLARE @Type INT
SELECT TOP 1 @Type=Type FROM dbo.PageDirectory WHERE Home=1

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==获得 HomePage 所在的 PageDirectory 记录中的 PageSize 值
--====================================================================================
DECLARE @PageSize INT
SELECT TOP 1 @PageSize=PageSize FROM dbo.PageDirectory WHERE Home=1

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==建立分页
--====================================================================================
DECLARE @Paging TABLE 
( 
	PagingID int identity(1,1), 
	[ID] int, 
	PageDirectoryID int,
	Serial int,
	Hidden bit,
	Approved int,
	ApproveMessage ntext COLLATE database_default, 
	ApprovedBy nvarchar(50) COLLATE database_default, 
	UpdateTime datetime,
	Author nvarchar(50) COLLATE database_default,
	KnowledgeType int,

	Editor ntext COLLATE database_default, 
	EditorPermission int,

	KnowledgeContentID int,

	--Template nvarchar(200) COLLATE database_default, 
	Title nvarchar(2000) COLLATE database_default, 
	--TitleShow nvarchar(50) COLLATE database_default, 
	Content ntext COLLATE database_default, 
	Tag nvarchar(500) COLLATE database_default, 
	Abstract ntext COLLATE database_default, 

	HitCount int,
	CommentsPermission int,
	CommentsCount int,

	KnowledgeDirectory nvarchar(50) COLLATE database_default 
) 



--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==从 Option 表返回 KnowledgeApprove 属性
--====================================================================================
DECLARE @KnowledgeApprove NVARCHAR(50)
SELECT @KnowledgeApprove=CONVERT(NVARCHAR(50),opt.[Value]) FROM dbo.[Option] opt WHERE opt.[Key]=N'KnowledgeApprove'

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==根据 Type=1/2 决定后面使用 ORDER BY Serial 还是 UpdateTime （以下两段代码除了 Order By 之外，其它地方完全一致）
--====================================================================================
IF @Type=1

BEGIN

	--====================================================================================
	--==当前用户是 Admin Editor 还是普通用户
	--====================================================================================
	IF  dbo.UDF_UserAdminEditor(@User)=1

	BEGIN
		--====================================================================================
		--==当前用户是 Admin Editor
		--====================================================================================
		INSERT INTO @Paging

		SELECT

			now.[ID] AS [ID],
			now.PageDirectoryID AS PageDirectoryID,
			now.Serial AS Serial,
			ISNULL(nowc.Hidden,0) AS Hidden,
			ISNULL(nowc.Approved,0) AS Approved,
			ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
			ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
			now.UpdateTime AS UpdateTime,
			now.Author AS Author,
			now.KnowledgeType AS KnowledgeType,

			now.Editor AS Editor,
			dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,

	
			nowc.[ID] AS KnowledgeContentID,

			--nowc.Template AS Template,
			nowc.Title AS Title,
			--nowc.TitleShow AS TitleShow,
			nowc.Content AS Content,
			nowc.Tag AS Tag,
			nowc.Abstract AS Abstract,

			ISNULL(nowc.HitCount,0)+1 AS HitCount,
			dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
			(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,

			N'Knowledge' AS KnowledgeDirectory

		FROM dbo.Knowledge now 
		LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
		WHERE now.PageDirectoryID=(Select Top 1 [ID] From dbo.PageDirectory Where Home=1) 

		ORDER BY Serial

	END

	ELSE

	BEGIN
		--====================================================================================
		--==当前用户《不是》 Admin Editor
		--====================================================================================
		INSERT INTO @Paging

		SELECT

			now.[ID] AS [ID],
			now.PageDirectoryID AS PageDirectoryID,
			now.Serial AS Serial,
			ISNULL(nowc.Hidden,0) AS Hidden,
			ISNULL(nowc.Approved,0) AS Approved,
			ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
			ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
			now.UpdateTime AS UpdateTime,
			now.Author AS Author,
			now.KnowledgeType AS KnowledgeType,

			now.Editor AS Editor,
			dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,

			nowc.[ID] AS KnowledgeContentID,

			--nowc.Template AS Template,
			nowc.Title AS Title,
			--nowc.TitleShow AS TitleShow,
			nowc.Content AS Content,
			nowc.Tag AS Tag,
			nowc.Abstract AS Abstract,

			ISNULL(nowc.HitCount,0)+1 AS HitCount,
			dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
			(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,

			N'Knowledge' AS KnowledgeDirectory

		FROM dbo.Knowledge now 
		LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]
		LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
		WHERE now.PageDirectoryID=(Select Top 1 [ID] From dbo.PageDirectory Where Home=1) AND (REPLACE(nowp.DedicatedTo,N',',N'')=N''  or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)  AND  nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N'false')

		ORDER BY Serial
	END


END

ELSE

BEGIN

	--====================================================================================
	--==当前用户是 Admin Editor 还是普通用户
	--====================================================================================
	IF  dbo.UDF_UserAdminEditor(@User)=1

	BEGIN
		--====================================================================================
		--==当前用户是 Admin Editor
		--====================================================================================
		INSERT INTO @Paging

		SELECT

			now.[ID] AS [ID],
			now.PageDirectoryID AS PageDirectoryID,
			now.Serial AS Serial,
			ISNULL(nowc.Hidden,0) AS Hidden,
			ISNULL(nowc.Approved,0) AS Approved,
			ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
			ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
			now.UpdateTime AS UpdateTime,
			now.Author AS Author,
			now.KnowledgeType AS KnowledgeType,

			now.Editor AS Editor,
			dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,
	
			nowc.[ID] AS KnowledgeContentID,

			--nowc.Template AS Template,
			nowc.Title AS Title,
			--nowc.TitleShow AS TitleShow,
			nowc.Content AS Content,
			nowc.Tag AS Tag,
			nowc.Abstract AS Abstract,

			ISNULL(nowc.HitCount,0)+1 AS HitCount,
			dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
			(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,

			N'Knowledge' AS KnowledgeDirectory

		FROM dbo.Knowledge now 
		LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
		WHERE now.PageDirectoryID=(Select Top 1 [ID] From dbo.PageDirectory Where Home=1) 

		ORDER BY UpdateTime DESC

	END

	ELSE

	BEGIN
		--====================================================================================
		--==当前用户《不是》 Admin Editor
		--====================================================================================
		INSERT INTO @Paging

		SELECT

			now.[ID] AS [ID],
			now.PageDirectoryID AS PageDirectoryID,
			now.Serial AS Serial,
			ISNULL(nowc.Hidden,0) AS Hidden,
			ISNULL(nowc.Approved,0) AS Approved,
			ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
			ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
			now.UpdateTime AS UpdateTime,
			now.Author AS Author,
			now.KnowledgeType AS KnowledgeType,

			now.Editor AS Editor,
			dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,

			nowc.[ID] AS KnowledgeContentID,

			--nowc.Template AS Template,
			nowc.Title AS Title,
			--nowc.TitleShow AS TitleShow,
			nowc.Content AS Content,
			nowc.Tag AS Tag,
			nowc.Abstract AS Abstract,

			ISNULL(nowc.HitCount,0)+1 AS HitCount,
			dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
			(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,

			N'Knowledge' AS KnowledgeDirectory

		FROM dbo.Knowledge now 
		LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]
		LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
		WHERE now.PageDirectoryID=(Select Top 1 [ID] From dbo.PageDirectory Where Home=1) AND (REPLACE(nowp.DedicatedTo,N',',N'')=N''  or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)  AND  nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N'false')

		ORDER BY UpdateTime DESC
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==最后从 @Paging 表变量中获取当前页第一个和最后一个记录的位置
--=====================================================
DECLARE @FirstRecord int
DECLARE @LastRecord int
		
SET @FirstRecord=(@CurrentPage - 1) * @PageSize
SET @LastRecord=(@CurrentPage * @PageSize + 1)

--=====================================================
--==返回当前页中的记录
--==总记录数，除以每页的记录数，用Ceiling()处理，得到的为页数 （注意：count(*)  和 @PageSize 都为 INT，它们相除将得到 INT，所以，首先要将它们转换成 Decimal(18,2)）
--=====================================================
SELECT 	
	*,
	PageCount=CEILING(Convert(decimal(18,2),(select count(*) from @Paging)) / Convert(decimal(18,2),@PageSize)) 

FROM @Paging 
WHERE PagingID>@FirstRecord AND PagingID<@LastRecord

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将《当前页》准备返回的知识 Content  的 HitCount 写回 KnowledgeContent 
--=====================================================
--UPDATE dbo.KnowledgeContent SET HitCount=ISNULL(HitCount,0)+1 WHERE KnowledgeID IN (Select [ID] From @Paging Where PagingID>@FirstRecord AND PagingID<@LastRecord) AND Culture=@Culture
UPDATE dbo.KnowledgeContent SET HitCount=ISNULL(HitCount,0)+1 WHERE [ID] IN (Select KnowledgeContentID From @Paging Where PagingID>@FirstRecord AND PagingID<@LastRecord) 

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==在 SiteLog 中记录在案 （当前 Paging 里面所有的 KnowledgeContent 都被当前 @User 浏览了一下）
--==原本应当使用 SP SiteLogSave ，但在这里，如果使用 SP SiteLogSave 就必须使用性能非常差的 Cursor，为了避免 Curor 操作，我们这里直接 Insert
--==注意：必须检查 @User 是否为空（排除未登录用户也能浏览的情形）
--=====================================================
IF (@User<>N'') AND (@User IS NOT NULL)
BEGIN
	INSERT INTO dbo.SiteLog ([User],Activity,TargetID,ActivityTime) SELECT @User,1,KnowledgeContentID,GETDATE() FROM @Paging Where PagingID>@FirstRecord AND PagingID<@LastRecord
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择给定 @PageDirectoryName 的 PageDirectory ID 和 Knowledge 的 KnowledgeDirectory 名字  （该部分用于创建 “新知识” 链接） 
--====================================================================================
SELECT TOP 1

	pad.[ID] AS PageDirectoryID,
	pad.[Name] AS PageDirectoryName,
	N'Knowledge' AS KnowledgeDirectory,

	ISNULL(pdc.OutlineMode,0) AS OutlineMode,

	pdc.Title AS Title,
	pdc.Template AS Template,
	pdc.PageHeader AS PageHeader,
	pdc.PageFooter AS PageFooter,

	sdc.PageHeader AS SubDirectoryPageHeader,
	sdc.PageFooter AS  SubDirectoryPageFooter,

	mdc.PageHeader AS MainDirectoryPageHeader,
	mdc.PageFooter AS  MainDirectoryPageFooter,

	pad.Type AS Type,
	pad.Presentation AS Presentation,
	pad.JumpToContent AS JumpToContent,

	pad.ShowTitle AS ShowTitle,
	pad.ShowAuthor AS ShowAuthor,
	pad.ShowUpdateTime AS ShowUpdateTime,
	pad.ShowHitCount AS ShowHitCount,
	pad.ShowComments AS ShowComments,
	pad.ShowStaticUrl AS ShowStaticUrl,
	pad.ShowKnowledgeHtml AS ShowKnowledgeHtml,
	pad.ShowRelative AS ShowRelative

	--pad.Overview AS PageDirectoryOverview,
	--sd.Overview AS SubDirectoryOverview,
	--(Select COUNT(dpd.[ID]) From dbo.PageDirectory dpd Where dpd.SubDirectoryID=(sd.[ID])) AS PageDirectoryBrothersCount,
	--(Select COUNT(dsd.[ID]) From dbo.SubDirectory dsd Where dsd.MainDirectoryID=(md.[ID])) AS SubDirectoryBrothersCount

FROM dbo.PageDirectory pad
LEFT JOIN dbo.PageDirectoryContent pdc ON pdc.PageDirectoryID=pad.[ID] AND pdc.Culture=@Culture

LEFT JOIN dbo.SubDirectory sd ON sd.[ID]=pad.SubDirectoryID
LEFT JOIN dbo.SubDirectoryContent sdc ON sdc.SubDirectoryID=sd.[ID]

LEFT JOIN dbo.MainDirectory md ON md.[ID]=sd.MainDirectoryID
LEFT JOIN dbo.MainDirectoryContent mdc ON mdc.MainDirectoryID=md.[ID]

WHERE pad.Home=1

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeGetHomePage]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

/****** Object:  Stored Procedure dbo.UniqueNumberGet    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UniqueNumberGet]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UniqueNumberGet]
GO

--====================================================================================
--==从 UniqueNumber 表读出当前最新 Number ，该 Number 将在 ASPX 端用来为新的 MainDirectory, SubDirectory, PugeDirectory, Community, Forum 命名
--==然后，我们立即将这个 Number + 1，以被下一次被读
--==我们的目的是保证，任何时候，从 UniqueNumber 表获得的都是独一无二的一个 Number，保证系统中各种 <xxx>Directory, Community, Forum 命名不重复
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2008-11-08 
--====================================================================================

CREATE PROCEDURE dbo.UniqueNumberGet

@Number INT OUT			--返回的结果

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择
--====================================================================================
SELECT @Number=[Number] FROM dbo.[UniqueNumber]

--====================================================================================
--==立即更新
--====================================================================================
UPDATE dbo.[UniqueNumber]  SET [Number]=[Number]+1

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UniqueNumberGet]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.SubDirectoryMove    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SubDirectoryMove]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SubDirectoryMove]
GO

--====================================================================================
--==移动 SubDirectory
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-22
--====================================================================================

CREATE PROCEDURE dbo.SubDirectoryMove

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@KnowledgeItem int,				--当前 SubDirectory 的 ID

@KnowledgeDirectoryTarget nvarchar(200),	--移动到哪级节点（MainDirectory - 唯一 ）
@KnowledgeItemTarget int,			--移动到哪一个节点（ID）

@Clone int					--是否复制（1/0）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'SubDirectory',@KnowledgeItem,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

IF @Clone=0 

	BEGIN

		--=====================================================
		--==移动
		--=====================================================
		UPDATE dbo.SubDirectory SET MainDirectoryID=@KnowledgeItemTarget WHERE [ID]=@KnowledgeItem

	END

ELSE

	BEGIN

		--=====================================================
		--==为新复制的 SubDirectory 起一个新名字（名字不能重复）
		--=====================================================
		DECLARE @UniqueNumber INT
		EXEC dbo.UniqueNumberGet @UniqueNumber OUT

		DECLARE @NewSubDirectoryName NVARCHAR(50)
		SET @NewSubDirectoryName=N's' + CONVERT(NVARCHAR(20),@UniqueNumber)

		--=====================================================
		--==复制 SubDirectory
		--=====================================================
		INSERT INTO dbo.SubDirectory(MainDirectoryID,Serial,[Name],NewWindow,Overview,Wizard,Editor,DedicatedTo,CommentsPermission) SELECT @KnowledgeItemTarget,Serial,@NewSubDirectoryName,NewWindow,Overview,Wizard,Editor,DedicatedTo,CommentsPermission FROM dbo.SubDirectory WHERE [ID]=@KnowledgeItem

		--=====================================================  
		--==获得新复制的 SubDirectory 的 ID  
		--=====================================================  
		DECLARE @NewSubDirectoryID INT  
		SELECT @NewSubDirectoryID=SCOPE_IDENTITY() --输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）    

		--=====================================================
		--==复制 SubDirectory Content
		--=====================================================
		INSERT INTO dbo.SubDirectoryContent (SubDirectoryID,Culture,Title,[Description],WizardPreviousTitle,WizardNextTitle,Hidden,HiddenInNavigationOnly,PageHeader,PageFooter,Url,ThisIsLink) SELECT  @NewSubDirectoryID,Culture,Title,[Description],WizardPreviousTitle,WizardNextTitle,Hidden,HiddenInNavigationOnly,PageHeader,PageFooter,Url,ThisIsLink  FROM dbo.SubDirectoryContent WHERE SubDirectoryID=@KnowledgeItem


		--=====================================================
		--=====================================================
		--==调用 PageDirectoryMove SP 来复制 PageDirectory 和 PageDirectoryContent
		--=====================================================
		--=====================================================


		--=====================================================  
		--==将当前  SubDirectoryID 下的 PageDirectory 记录转换为 CURSOR  
		--=====================================================  
		DECLARE @PageDirectoryID INT  
		DECLARE PageDirectoryMoveCursor CURSOR FOR SELECT [ID] FROM dbo.PageDirectory WHERE SubDirectoryID=@KnowledgeItem
		OPEN PageDirectoryMoveCursor  
		FETCH NEXT FROM PageDirectoryMoveCursor INTO @PageDirectoryID  
  
		WHILE @@FETCH_STATUS = 0  
		BEGIN  
			--=====================================================  
			--==调用 SP PageDirectoryMove
			--=====================================================  
			EXEC dbo.PageDirectoryMove @User,@PageDirectoryID,N'SubDirectory', @NewSubDirectoryID, 1

			--=====================================================  
			--==继续下个 CURSOR  
			--=====================================================  
			FETCH NEXT FROM PageDirectoryMoveCursor INTO @PageDirectoryID  
		END  
  
		CLOSE PageDirectoryMoveCursor  
		DEALLOCATE PageDirectoryMoveCursor  

	END



--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[SubDirectoryMove]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PageDirectoryMove    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PageDirectoryMove]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PageDirectoryMove]
GO

--====================================================================================
--==移动 PageDirectory
--====================================================================================
--==版权所有 2001-2014 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2013-09-05
--====================================================================================

CREATE PROCEDURE dbo.PageDirectoryMove

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@KnowledgeItem int,				--当前 PageDirectory 的 ID

@KnowledgeDirectoryTarget nvarchar(200),	--移动到哪级节点（MainDirectory | SubDirectory ）
@KnowledgeItemTarget int,			--移动到哪一个节点（ID）

@Clone int					--是否复制（1/0）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'PageDirectory',@KnowledgeItem,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果是移动（不是克隆），而且被移动的 PageDirectory 是其父 SubDirectory 下的唯一 PageDirectory，则举措推出 （注：按目前的机制，这种情形发生的可能性是不存在的，因为 SubDirectory 项下应该有一个 OverviewPageDirectory）
--=====================================================
IF @Clone=0

BEGIN

	--=====================================================
	--==如果当前即将移动的 PageDirectory 是其父 SubDirectory 下的唯一记录，举错
	--=====================================================
	DECLARE @SubDirectoryID INT
	SELECT @SubDirectoryID=pd.SubDirectoryID FROM dbo.PageDirectory pd WHERE pd.[ID]=@KnowledgeItem
	
	DECLARE @Count INT
	SELECT @Count=COUNT(pd.[ID]) FROM dbo.PageDirectory pd WHERE pd.SubDirectoryID=@SubDirectoryID
	
	--=====================================================
	--==如果是唯一的 PageDirectory 项目，则举错，否则，则正常删除
	--=====================================================
	IF @Count<=1
	
	BEGIN
		--=====================================================
		--==举错
		--=====================================================
		RAISERROR(N'您即将移动的页目录是其上级目录（子目录）下唯一下级条目，不可以移动',16,1)
	END

END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ  

  
--=====================================================  
--==分移动到 MainDirectory | SubDirectory  两种情形计算移动到的 Target SubDirectory 的 ID  
--=====================================================  
DECLARE @MoveToSubDirectoryID INT  
  
IF @KnowledgeDirectoryTarget=N'MainDirectory'  

	BEGIN

		--=====================================================  
		--==如果是将 PageDirectory 移动到 MainDirectory Level，则我们需要在 MainDirectory 下面平添一个 SubDirectory （其 Title 等属性继承 PageDirectory 的），将要 Move 的PageDirectory 挂到这个新增的 SubDirectory 下，同时将该 PageDirectory  设置为 Overview
		--==创建之前，先初始化一些属性
		--=====================================================  
		DECLARE @NewSubDirectorySerial INT
		SELECT @NewSubDirectorySerial=MAX(sd.Serial)+1 FROM dbo.SubDirectory sd WHERE sd.MainDirectoryID=@KnowledgeItemTarget

		DECLARE @NewSubDirectoryUniqueNumber INT
		EXEC dbo.UniqueNumberGet @NewSubDirectoryUniqueNumber OUT

		DECLARE @NewSubDirectoryName NVARCHAR(100)
		SELECT @NewSubDirectoryName=N's' + CONVERT(NVARCHAR(20),@NewSubDirectoryUniqueNumber)

		--=====================================================  
		--==开始创建这个 SubDirectory
		--=====================================================  
		DECLARE @oNewSubDirectoryID INT
		EXEC dbo.SubDirectorySave @User,@KnowledgeItemTarget,@NewSubDirectorySerial,@NewSubDirectoryName,N'',0,0,0,N'',N'',N'',@oNewSubDirectoryID OUT

		--=====================================================  
		--==开始创建这个 SubDirectory 下，各个语种的 SubDirectoryContent
		--=====================================================  
		DECLARE @Culture NVARCHAR(100)  
		DECLARE Cultures_Cursor CURSOR FOR SELECT Culture FROM dbo.UDF_PublicCultures()  
		OPEN Cultures_Cursor  
		FETCH NEXT FROM Cultures_Cursor INTO @Culture  
		  
		WHILE @@FETCH_STATUS=0  

		BEGIN  

			 --=====================================================  
			 --==当前语种，被移动 PageDirectory 的 Title, Description
			 --=====================================================  
			DECLARE @NewSubDirectoryContentTitle NVARCHAR(200)
			DECLARE @NewSubDirectoryContentDescription NVARCHAR(1000)
			SELECT @NewSubDirectoryContentTitle=pdc.Title, @NewSubDirectoryContentDescription=pdc.[Description] FROM dbo.PageDirectoryContent pdc WHERE pdc.PageDirectoryID=@KnowledgeItem AND pdc.Culture=@Culture

			 --=====================================================  
			 --==创建当前语种下，新创建的 SubDirectory 的 SubDirectoryContent
			 --=====================================================  
			DECLARE @oNewSubDirectoryContentID INT
			EXEC dbo.SubDirectoryContentSave @User,@oNewSubDirectoryID,@NewSubDirectoryContentTitle,@NewSubDirectoryContentDescription,N'',N'',0,0,N'',N'',N'GetKnowledge.aspx',0,@Culture,@oNewSubDirectoryContentID

			 --=====================================================  
			 --==下一个语种  
			 --=====================================================  
			 FETCH NEXT FROM Cultures_Cursor INTO @Culture  
		  
		END  
		  
		CLOSE  Cultures_Cursor  
		DEALLOCATE  Cultures_Cursor  

		--=====================================================  
		--==新创建的这个 SubDirectory 的 ID 作为 @MoveToSubDirectoryID
		--=====================================================  
		SELECT @MoveToSubDirectoryID=@oNewSubDirectoryID

	END

ELSE IF @KnowledgeDirectoryTarget=N'SubDirectory'  

	BEGIN

		--=====================================================  
		--==直接取 @KnowledgeItemTarget 作为 @oNewSubDirectoryID
		--=====================================================  
		SELECT @MoveToSubDirectoryID=@KnowledgeItemTarget

	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================  
--==分 《 移动 / 克隆》  两种情形
--=====================================================  
IF @Clone=0 

	BEGIN

		--=====================================================
		--==《移动》
		--=====================================================
		UPDATE dbo.PageDirectory SET SubDirectoryID=@MoveToSubDirectoryID WHERE [ID]=@KnowledgeItem

		--=====================================================
		--==如果本 PageDirectory 移动的目的地 Level 是 MainDirectory，则执行一下 PageDirectorySetOverview （相当于将本 PageDirectory 提升到 MainDirectory 下）
		--=====================================================
		IF @KnowledgeDirectoryTarget=N'MainDirectory'  

		BEGIN
			EXEC dbo.PageDirectorySetOverview @User,@KnowledgeItem
		END

	END

ELSE

	BEGIN

		--=====================================================
		--==《克隆》
		--=====================================================

		--=====================================================
		--==为新复制的 PageDirectory 起一个新名字（名字不能重复）
		--=====================================================
		DECLARE @NewPageDirectoryUniqueNumber INT
		EXEC dbo.UniqueNumberGet @NewPageDirectoryUniqueNumber OUT

		DECLARE @NewPageDirectoryName NVARCHAR(50)
		SET @NewPageDirectoryName=N'p' + CONVERT(NVARCHAR(20),@NewPageDirectoryUniqueNumber)

		--=====================================================
		--==复制 PageDirectory
		--=====================================================
		INSERT INTO dbo.PageDirectory(SubDirectoryID,Serial,[Name],PageSize,NewWindow,Overview,FastAccess,Home,RightIndent,jQuery,LogoHide,MainMenuHide,BannerHide,BreadcrumbHide,PageMenuHide,PageBarHide,CopyrightHide,Type,Presentation,JumpToContent,ShowTitle,ShowAuthor,ShowUpdateTime,ShowHitCount,ShowComments,ShowStaticUrl,ShowKnowledgeHtml,ShowRelative,Editor,DedicatedTo,CommentsPermission) SELECT @MoveToSubDirectoryID,Serial,@NewPageDirectoryName,PageSize,NewWindow,Overview,FastAccess,0,RightIndent,jQuery,LogoHide,MainMenuHide,BannerHide,BreadcrumbHide,PageMenuHide,PageBarHide,CopyrightHide,Type,Presentation,JumpToContent,ShowTitle,ShowAuthor,ShowUpdateTime,ShowHitCount,ShowComments,ShowStaticUrl,ShowKnowledgeHtml,ShowRelative,Editor,DedicatedTo,CommentsPermission  FROM dbo.PageDirectory WHERE [ID]=@KnowledgeItem

		--=====================================================  
		--==获得新复制的 PageDirectory 的 ID  
		--=====================================================  
		DECLARE @NewPageDirectoryID INT  
		SELECT @NewPageDirectoryID=SCOPE_IDENTITY() --输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）    

		--=====================================================
		--==如果本 PageDirectory 复制的目的地 Level 是 MainDirectory，则执行一下 PageDirectorySetOverview （相当于将本 PageDirectory 提升到 MainDirectory 下）
		--=====================================================
		IF @KnowledgeDirectoryTarget=N'MainDirectory'  
		
		BEGIN
			EXEC dbo.PageDirectorySetOverview @User,@NewPageDirectoryID
		END


		--=====================================================
		--==复制 PageDirectory Content
		--=====================================================
		INSERT INTO dbo.PageDirectoryContent (PageDirectoryID,Culture,SeoTitle,SeoDescription,SeoKeywords,Title,[Description],Template,Hidden,HiddenInNavigationOnly,PageHeader,PageFooter,Url,ThisIsLink) SELECT  @NewPageDirectoryID,Culture,SeoTitle,SeoDescription,SeoKeywords,Title,[Description],Template,Hidden,HiddenInNavigationOnly,PageHeader,PageFooter,Url,ThisIsLink  FROM dbo.PageDirectoryContent WHERE PageDirectoryID=@KnowledgeItem


		--=====================================================
		--=====================================================
		--==调用 KnowledgeMove SP 来复制 Knowledge 和 KnowledgeContent
		--=====================================================
		--=====================================================


		--=====================================================  
		--==将当前  PageDirectoryID 下的 Knowledge 记录转换为 CURSOR  
		--=====================================================  
		DECLARE @KnowledgeID INT  
		DECLARE KnowledgeMoveCursor CURSOR FOR SELECT [ID] FROM dbo.Knowledge WHERE PageDirectoryID=@KnowledgeItem
		OPEN KnowledgeMoveCursor  
		FETCH NEXT FROM KnowledgeMoveCursor INTO @KnowledgeID  
  
		WHILE @@FETCH_STATUS = 0  
		BEGIN  
			--=====================================================  
			--==调用 SP KnowledgeMove
			--=====================================================  
			EXEC dbo.KnowledgeMove @User, @KnowledgeID, N'PageDirectory',@NewPageDirectoryID, 1

			--=====================================================  
			--==继续下个 CURSOR  
			--=====================================================  
			FETCH NEXT FROM KnowledgeMoveCursor INTO @KnowledgeID  
		END  
  
		CLOSE KnowledgeMoveCursor  
		DEALLOCATE KnowledgeMoveCursor  

	END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PageDirectoryMove]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeMove    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeMove]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeMove]
GO

--====================================================================================
--==移动 Knowledge
--====================================================================================
--==版权所有 2001-2014 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2013-09-05
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeMove

@User nvarchar(50),					--从 ASPX 端传递过来的当前用户名

@KnowledgeItem int,					--当前被移动的 Knowledge  的 ID

@KnowledgeDirectoryTarget nvarchar(200),		--移动到哪级节点（MainDirectory | SubDirectory | PageDirectory）
@KnowledgeItemTarget int,				--移动到哪一个节点（ID）

@Clone int						--是否复制（1/0）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'Knowledge',@KnowledgeItem,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==分移动到 MainDirectory | SubDirectory | PageDirectory 三种情形计算移动到的 Target PageDirectory 的 ID
--=====================================================
DECLARE @PageDirectoryID INT

IF @KnowledgeDirectoryTarget=N'MainDirectory'

	BEGIN

		--=====================================================
		--==首先尝试返回该 MainDirectory 对应的 OverviewPageDirectoryID，如果等于 0 ，说明，当前 MainDirectory 下不存在 OverviewSubDirectory 和 OverviewPageDirectory，则需要创建之
		--=====================================================
		SELECT @PageDirectoryID=dbo.UDF_GetOverviewPageDirectory(@KnowledgeDirectoryTarget,@KnowledgeItemTarget)

		--=====================================================
		--==如果当前 MainDirectory 下不存在 OverviewSubDirectory 和 OverviewPageDirectory，则需要创建之（不存在的标志是 dbo.UDF_GetOverviewPageDirectory() 返回 0）
		--=====================================================
		IF @PageDirectoryID=0

		BEGIN
			--=====================================================
			--==创建 OverviewSubDirectory 和 OverviewPageDirectory
			--=====================================================
			DECLARE @oNewSubDirectoryID INT
			DECLARE @oNewSubDirectoryContentID INT

			SELECT @oNewSubDirectoryID=0
			SELECT @oNewSubDirectoryContentID=0

			EXEC dbo.MainDirectoryCreateOverviewSubDirectory @User,@KnowledgeItemTarget,N'',@oNewSubDirectoryID OUT
			EXEC dbo.MainDirectoryCreateOverviewSubDirectoryContent @User,@oNewSubDirectoryID,@oNewSubDirectoryContentID OUT

			DECLARE @oNewPageDirectoryID INT
			DECLARE @oNewPageDirectoryContentID INT

			SELECT @oNewPageDirectoryID=0
			SELECT @oNewPageDirectoryContentID=0

			EXEC dbo.SubDirectoryCreateOverviewPageDirectory @User,@oNewSubDirectoryID,N'',@oNewPageDirectoryID OUT
			EXEC dbo.SubDirectoryCreateOverviewPageDirectoryContent @User,@oNewPageDirectoryID,@oNewPageDirectoryContentID OUT

			--=====================================================
			--==再次获取 OverviewPageDirectoryID
			--=====================================================
			SELECT @PageDirectoryID=dbo.UDF_GetOverviewPageDirectory(@KnowledgeDirectoryTarget,@KnowledgeItemTarget)
		END

	END

ELSE IF @KnowledgeDirectoryTarget=N'SubDirectory'

	BEGIN

		--=====================================================
		--==首先尝试返回该 SubDirectory 对应的 OverviewPageDirectoryID，如果等于 0 ，说明，当前 SubDirectory 下不存在 OverviewPageDirectory，则需要创建之
		--=====================================================
		SELECT @PageDirectoryID=dbo.UDF_GetOverviewPageDirectory(@KnowledgeDirectoryTarget,@KnowledgeItemTarget)

		--=====================================================
		--==如果当前 SubDirectory 下不存在  OverviewPageDirectory，则需要创建之（不存在的标志是 dbo.UDF_GetOverviewPageDirectory() 返回 0）
		--=====================================================
		IF @PageDirectoryID=0


		BEGIN
			--=====================================================
			--==创建 OverviewSubDirectory 和 OverviewPageDirectory
			--=====================================================
			DECLARE @oNewPageDirectoryID2 INT
			DECLARE @oNewPageDirectoryContentID2 INT

			SELECT @oNewPageDirectoryID2=0
			SELECT @oNewPageDirectoryContentID2=0

			EXEC dbo.SubDirectoryCreateOverviewPageDirectory @User,@KnowledgeItemTarget,N'',@oNewPageDirectoryID2 OUT
			EXEC dbo.SubDirectoryCreateOverviewPageDirectoryContent @User,@oNewPageDirectoryID2,@oNewPageDirectoryContentID2 OUT

			--=====================================================
			--==再次获取 OverviewPageDirectoryID
			--=====================================================
			SELECT @PageDirectoryID=dbo.UDF_GetOverviewPageDirectory(@KnowledgeDirectoryTarget,@KnowledgeItemTarget)
		END
	END

ELSE IF @KnowledgeDirectoryTarget=N'PageDirectory'

	BEGIN

		SELECT @PageDirectoryID=@KnowledgeItemTarget

	END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==是否克隆
--=====================================================
IF @Clone=0 

	BEGIN
		--=====================================================
		--==移动
		--=====================================================
		UPDATE dbo.Knowledge SET PageDirectoryID=@PageDirectoryID WHERE [ID]=@KnowledgeItem

	END

ELSE

	BEGIN
		--=====================================================
		--==复制 Knowledge
		--=====================================================
		INSERT INTO dbo.Knowledge (PageDirectoryID,Serial,Editor,DedicatedTo,CommentsPermission,UpdateTime,Author,KnowledgeType) SELECT @PageDirectoryID,Serial,Editor,DedicatedTo,CommentsPermission,UpdateTime,Author,KnowledgeType FROM dbo.Knowledge WHERE [ID]=@KnowledgeItem

		--=====================================================  
		--==获得新复制的 Knowledge ID  
		--=====================================================  
		DECLARE @NewKnowledgeID INT  
		SELECT @NewKnowledgeID=SCOPE_IDENTITY() --输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）    

		--=====================================================
		--==将 @KnowledgeItem 下的 KnowledgeContent 选入 CURSOR
		--=====================================================
		DECLARE @KnowledgeContentID INT
		DECLARE KnowledgeContent_Cursor CURSOR FOR SELECT nowc.[ID] FROM dbo.KnowledgeContent nowc WHERE nowc.KnowledgeID=@KnowledgeItem
		
		OPEN KnowledgeContent_Cursor
		FETCH NEXT FROM KnowledgeContent_Cursor INTO @KnowledgeContentID

		WHILE @@FETCH_STATUS = 0
		BEGIN

			--=====================================================
			--==复制当前 @KnowledgeContentID 下的  KnowledgeContent
			--=====================================================
			--INSERT INTO dbo.KnowledgeContent (KnowledgeID,Culture,Template,Title,TitleShow,  Content,Tag, Hidden, Approved, ApproveMessage, ApprovedBy, Abstract,HitCount) SELECT @NewKnowledgeID,Culture,Template,Title,TitleShow,  Content,Tag, Hidden, Approved, ApproveMessage, ApprovedBy, Abstract,0 FROM dbo.KnowledgeContent WHERE [ID]=@KnowledgeContentID
			INSERT INTO dbo.KnowledgeContent (KnowledgeID,Culture,Title, Content,Tag, Hidden, Approved, ApproveMessage, ApprovedBy, Abstract,HitCount) SELECT @NewKnowledgeID,Culture,Title, Content,Tag, Hidden, Approved, ApproveMessage, ApprovedBy, Abstract,0 FROM dbo.KnowledgeContent WHERE [ID]=@KnowledgeContentID

			--=====================================================
			--==获得新复制的 KnowledgeContent ID  
			--=====================================================
			DECLARE @NewKnowledgeContentID INT  
			SELECT @NewKnowledgeContentID=SCOPE_IDENTITY() --输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Session 内的本表）    

			--=====================================================
			--==复制 KnowledgeComments （不必了）
			--=====================================================

			--=====================================================
			--==复制 KnowledgeTags 
			--=====================================================
			INSERT INTO dbo.KnowledgeTags(KnowledgeContentID,Tag) SELECT @NewKnowledgeContentID,Tag FROM dbo.KnowledgeTags WHERE KnowledgeContentID=@KnowledgeContentID

			--=====================================================
			--==FETCH NEXT
			--=====================================================
			FETCH NEXT FROM KnowledgeContent_Cursor INTO @KnowledgeContentID
		END

		CLOSE KnowledgeContent_Cursor
		DEALLOCATE KnowledgeContent_Cursor

	END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeMove]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ForumMove    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ForumMove]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ForumMove]
GO

--====================================================================================
--==移动 Forum
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-22 
--====================================================================================

CREATE PROCEDURE dbo.ForumMove

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@CommunityItem int,			--当前 Community / Forum  的 ID
@CommunityDirectoryTarget int,		--移动到哪个上级节点（ID）
@Clone int				--是否复制（1/0）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

IF @Clone=0 

	BEGIN
		--=====================================================
		--==移动
		--=====================================================
		UPDATE dbo.Forum SET CommunityID=@CommunityDirectoryTarget WHERE [ID]=@CommunityItem
	END

ELSE

	BEGIN
		--=====================================================
		--==为新复制的 Forum 设置一个新名字 （不能使用同一个名字）
		--=====================================================
		DECLARE @UniqueNumber INT
		EXEC dbo.UniqueNumberGet @UniqueNumber OUT

		DECLARE @NewForumName NVARCHAR(50)
		SET @NewForumName=N'f' + CONVERT(NVARCHAR(20),@UniqueNumber)

		--=====================================================
		--==复制 Forum
		--=====================================================
		INSERT INTO dbo.Forum (CommunityID,Serial,[Name],Moderator,[Public],ReadPermission,TopicWritePermission,FollowUpWritePermission) SELECT  @CommunityDirectoryTarget,Serial,@NewForumName,Moderator,[Public],ReadPermission,TopicWritePermission,FollowUpWritePermission FROM dbo.Forum WHERE [ID]=@CommunityItem

		--=====================================================  
		--==获得新复制的 Forum ID  
		--=====================================================  
		DECLARE @NewForumID INT  
		SELECT @NewForumID=SCOPE_IDENTITY() --输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）    

		DECLARE @NewForumIDString NVARCHAR(4000)
		SET @NewForumIDString=CONVERT(NVARCHAR(4000),@NewForumID)		  

		--=====================================================
		--==复制 Forum Content
		--=====================================================
		INSERT INTO dbo.ForumContent 

		(
			ForumID,
			Culture,
			Title,
			[Description],
			Hidden,
			CommandTitleTaskList,
			CommandTitleTaskListDescription,
			CommandTitleAdd,
			CommandTitleAddDescription,
			CommandTitleQuery,
			CommandTitleQueryDescription,

			TopicStatusCustomizationEmptyTopic,
			TopicStatusCustomizationSolidTopic,
			TopicStatusCustomizationHotTopic,
			TopicStatusCustomizationEliteTopic,
			TopicStatusCustomizationTabooTopic,
			TopicStatusCustomizationStickyTopic,
			TopicCommandSetEliteTopic,
			TopicCommandSetTabooTopic,
			TopicCommandSetStickyTopic
		) 

		SELECT  

			@NewForumID,
			Culture,
			Title,
			[Description],
			Hidden,
			CommandTitleTaskList,
			CommandTitleTaskListDescription,
			CommandTitleAdd,
			CommandTitleAddDescription,
			CommandTitleQuery,
			CommandTitleQueryDescription ,

			TopicStatusCustomizationEmptyTopic,
			TopicStatusCustomizationSolidTopic,
			TopicStatusCustomizationHotTopic,
			TopicStatusCustomizationEliteTopic,
			TopicStatusCustomizationTabooTopic,
			TopicStatusCustomizationStickyTopic,
			TopicCommandSetEliteTopic,
			TopicCommandSetTabooTopic,
			TopicCommandSetStickyTopic 

		FROM dbo.ForumContent 
		WHERE ForumID=@CommunityItem


		--=====================================================
		--=====================================================

		--==调用 TopicMove SP 来复制 Topic 和 Followup
		--=====================================================
		--=====================================================


		--=====================================================  
		--==将当前  ForumID 下的 Topic 记录转换为 CURSOR  
		--=====================================================  
		DECLARE @TopicID INT  
		DECLARE TopicCursor CURSOR FOR SELECT [ID] FROM dbo.Topic WHERE ForumID=@CommunityItem
		OPEN TopicCursor  
		FETCH NEXT FROM TopicCursor INTO @TopicID  
  
		WHILE @@FETCH_STATUS = 0  
		BEGIN  
			--=====================================================  
			--==调用 SP TopicMove
			--=====================================================  
			EXEC dbo.TopicMove @User, @TopicID, @NewForumIDString, N'true'

			--=====================================================  
			--==继续下个 CURSOR  
			--=====================================================  
			FETCH NEXT FROM TopicCursor INTO @TopicID  
		END  
  
		CLOSE TopicCursor  
		DEALLOCATE TopicCursor  




		/*
		--=====================================================  
		--==复制 Topic
		--=====================================================  
		INSERT INTO dbo.Topic (ForumID,TopicStatus,[User],PostTime,Title,Content,Hit,AttachmentName) SELECT @NewForumID,TopicStatus,[User],PostTime,Title,Content,Hit,AttachmentName FROM dbo.Topic WHERE ForumID=@CommunityItem  
  
		--=====================================================  
		--==获得新复制的 Topic ID  
		--=====================================================  
		DECLARE @NewTopicID INT  
		SELECT @NewTopicID=SCOPE_IDENTITY() --输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）    
  
		--=====================================================  
		--==复制 FollowUp 
		--=====================================================  
		INSERT INTO dbo.FollowUp (TopicID,[User],PostTime,Content,AttachmentName) SELECT @NewTopicID,[User],PostTime,Content,AttachmentName FROM dbo.FollowUp WHERE TopicID IN (Select TopicID From dbo.Topic Where ForumID=@CommunityItem) 		
		*/
	END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ForumMove]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeGetSingle    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeGetSingle]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeGetSingle]
GO

--====================================================================================
--==KnowledgeGet 的单个 Knowledge 版  
--==表 Knowledge 中的 DedicatedTo 为空的时候，所有访问者可浏览；为 * 则所有客户可浏览； 为 abc,efg 则指定客户可浏览； 
--====================================================================================
--==版权所有 2001-2012  COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-10-05
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeGetSingle

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名

@PageDirectoryName nvarchar(100),				--Page Diretory 的 Name
@KnowledgeID int,						--当前单个知识
@Culture nvarchar(100)						--当前文化

AS
  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==从 Option 表返回 KnowledgeApprove 属性
--====================================================================================
DECLARE @KnowledgeApprove NVARCHAR(50)
SELECT @KnowledgeApprove=CONVERT(NVARCHAR(50),opt.[Value]) FROM dbo.[Option] opt WHERE opt.[Key]=N'KnowledgeApprove'

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==当前用户是 Admin Editor 还是普通用户
--====================================================================================
IF  dbo.UDF_UserAdminEditor(@User)=1

BEGIN

	--====================================================================================
	--==当前用户是 Admin Editor
	--====================================================================================
	SELECT

		1 AS PagingID,				--该返回纯属为了和 KnowledgeGet 保持一致，并没有实际意义
		now.[ID] AS [ID],
		now.PageDirectoryID AS PageDirectoryID,
		now.Serial AS Serial,
		ISNULL(nowc.Hidden,0) AS Hidden,
		ISNULL(nowc.Approved,0) AS Approved,
		ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
		ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
		now.UpdateTime AS UpdateTime,
		now.Author AS Author,
		now.KnowledgeType AS KnowledgeType,

		now.Editor AS Editor,
		dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,

		nowc.[ID] AS KnowledgeContentID,

		--nowc.Template AS Template,
		nowc.Title AS Title,
		--nowc.TitleShow AS TitleShow,
		nowc.Content AS Content,
		nowc.Tag AS Tag,
		nowc.Abstract AS Abstract,

		ISNULL(nowc.HitCount,0)+1 AS HitCount,
		dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
		(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,

		N'Knowledge' AS KnowledgeDirectory,
	
		1 AS PageCount				--该返回纯属于和 KnowledgeGet 保持一致 （实际只可能返回一页）

	FROM dbo.Knowledge now
	LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
	LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
	WHERE now.[ID]=@KnowledgeID

	ORDER BY Serial

END

ELSE

BEGIN

	--====================================================================================
	--==当前用户不是 Admin Editor
	--====================================================================================
	SELECT

		1 AS PagingID,				--该返回纯属为了和 KnowledgeGet 保持一致，并没有实际意义
		now.[ID] AS [ID],
		now.PageDirectoryID AS PageDirectoryID,
		now.Serial AS Serial,
		ISNULL(nowc.Hidden,0) AS Hidden,
		ISNULL(nowc.Approved,0) AS Approved,
		ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
		ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
		now.UpdateTime AS UpdateTime,
		now.Author AS Author,
		now.KnowledgeType AS KnowledgeType,

		now.Editor AS Editor,
		dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,

		nowc.[ID] AS KnowledgeContentID,
	
		--nowc.Template AS Template,
		nowc.Title AS Title,
		--nowc.TitleShow AS TitleShow,
		nowc.Content AS Content,
		nowc.Tag AS Tag,
		nowc.Abstract AS Abstract,

		ISNULL(nowc.HitCount,0)+1 AS HitCount,
		dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
		(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,

		N'Knowledge' AS KnowledgeDirectory,
	
		1 AS PageCount				--该返回纯属于和 KnowledgeGet 保持一致 （实际只可能返回一页）

	FROM dbo.Knowledge now
	LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]
	LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
	LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
	WHERE now.[ID]=@KnowledgeID AND (REPLACE(nowp.DedicatedTo,N',',N'')=N''  or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)   AND  nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N'false')

	ORDER BY Serial
END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将《当前页》准备返回的知识 Content  的 HitCount 写回 KnowledgeContent 
--=====================================================
UPDATE dbo.KnowledgeContent SET HitCount=ISNULL(HitCount,0)+1 WHERE KnowledgeID=@KnowledgeID  AND Culture=@Culture

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==在 SiteLog 中记录在案 （根据 @KnowledgeID 和 @Culture 返回当前 KnowledgeContentID
--==原本应当使用 SP SiteLogSave ，但在这里，为了和众多 KnowledgeGet<xxx> 一致起来，我们使用传统的  Insert
--==注意：必须检查 @User 是否为空（排除未登录用户也能浏览的情形）
--=====================================================
IF (@User<>N'') AND (@User IS NOT NULL)
BEGIN
	INSERT INTO dbo.SiteLog ([User],Activity,TargetID,ActivityTime) SELECT @User,1,nowc.[ID],GETDATE() FROM dbo.KnowledgeContent nowc Where nowc.KnowledgeID=@KnowledgeID  AND nowc.Culture=@Culture
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择给定 @PageDirectoryName 的 PageDirectory ID 和 Knowledge 的 KnowledgeDirectory 名字  （该部分用于创建 “新知识” 链接） 
--==同时返回当前 PageDirectory 的某些属性（Type, Presentation, ShowTitle, ShowAuthor, ShowUpdateTime, ShowHitCount, ShowComments, ShowStaticUrl, ShowKnowledgeHtml, ShowRelative），以便告诉系统如何 Render 知识
--====================================================================================
SELECT
	pad.[ID] AS PageDirectoryID,
	pad.[Name] AS PageDirectoryName,
	N'Knowledge' AS KnowledgeDirectory,

	ISNULL(pdc.OutlineMode,0) AS OutlineMode,

	pdc.Title AS Title,
	pdc.Template AS Template,
	pdc.PageHeader AS PageHeader,
	pdc.PageFooter AS PageFooter,

	sdc.PageHeader AS SubDirectoryPageHeader,
	sdc.PageFooter AS  SubDirectoryPageFooter,

	mdc.PageHeader AS MainDirectoryPageHeader,
	mdc.PageFooter AS  MainDirectoryPageFooter,

	pad.Type AS Type,
	pad.Presentation AS Presentation,
	pad.JumpToContent AS JumpToContent,

	pad.ShowTitle AS ShowTitle,
	pad.ShowAuthor AS ShowAuthor,
	pad.ShowUpdateTime AS ShowUpdateTime,
	pad.ShowHitCount AS ShowHitCount,
	pad.ShowComments AS ShowComments,
	pad.ShowStaticUrl AS ShowStaticUrl,
	pad.ShowKnowledgeHtml AS ShowKnowledgeHtml,
	pad.ShowRelative AS ShowRelative

FROM dbo.PageDirectory pad 
LEFT JOIN dbo.PageDirectoryContent pdc ON pdc.PageDirectoryID=pad.[ID] AND pdc.Culture=@Culture

LEFT JOIN dbo.SubDirectory sd ON sd.[ID]=pad.SubDirectoryID
LEFT JOIN dbo.SubDirectoryContent sdc ON sdc.SubDirectoryID=sd.[ID]

LEFT JOIN dbo.MainDirectory md ON md.[ID]=sd.MainDirectoryID
LEFT JOIN dbo.MainDirectoryContent mdc ON mdc.MainDirectoryID=md.[ID]

WHERE pad.[Name]=@PageDirectoryName

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeGetSingle]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeTagGet    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeTagGet]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeTagGet]
GO

--====================================================================================
--==从 Knowledge, KnowledgeContent 组合中返回 Tag 列表，以及每个 Tag 对应的 Content 数目
--==用于构造知识的侧条标签，以便点击后进入更细致的知识分类
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-09-06
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeTagGet

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名

@PageDirectoryName nvarchar(100),				--Page Diretory 的 Name
@Culture nvarchar(100)						--当前文化

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==从 Option 表返回 KnowledgeApprove 属性
--====================================================================================
DECLARE @KnowledgeApprove NVARCHAR(50)
SELECT @KnowledgeApprove=CONVERT(NVARCHAR(50),opt.[Value]) FROM dbo.[Option] opt WHERE opt.[Key]=N'KnowledgeApprove'

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

IF  dbo.UDF_UserAdminEditor(@User)=1       

BEGIN

	--================================================
	--==如果当前用户《是》 Admin Editor
	--================================================

	--================================================
	--==返回指定 PageDirectoryName，指定 Culture 下的  KnowledgeContent 中所有 Tag 的分别计数
	--================================================
	SELECT
	
		ISNULL(nowt.Tag,N'') AS Tag,
		COUNT(ISNULL(nowt.Tag,N'')) AS ContentCount
	
	FROM dbo.Knowledge now
	LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
	LEFT JOIN dbo.KnowledgeTags nowt ON nowt.KnowledgeContentID=nowc.[ID]
	LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
	
	WHERE pad.[Name]=@PageDirectoryName
	
	GROUP BY ISNULL(nowt.Tag,N'')

	ORDER BY Tag 

END

ELSE

BEGIN

	--================================================
	--==如果当前用户《不是》 Admin Editor
	--================================================

	--================================================
	--==返回指定 PageDirectoryName，指定 Culture 下的  KnowledgeContent 中所有 Tag 的分别计数
	--================================================
	SELECT
	
		ISNULL(nowt.Tag,N'') AS Tag,
		COUNT(ISNULL(nowt.Tag,N'')) AS ContentCount
	
	FROM dbo.Knowledge now
	LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]
	LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
	LEFT JOIN dbo.KnowledgeTags nowt ON nowt.KnowledgeContentID=nowc.[ID]
	LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
	
	WHERE pad.[Name]=@PageDirectoryName AND (REPLACE(nowp.DedicatedTo,N',',N'')=N''  or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)  AND  nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N'false')
	--WHERE pad.[Name]=@PageDirectoryName AND (RTRIM(LTRIM(CONVERT(NVARCHAR(4000),now.DedicatedTo)))=N'' or now.DedicatedTo is NULL or RTRIM(LTRIM(CONVERT(NVARCHAR(4000),now.DedicatedTo)))=N'*' or dbo.UDF_UserDedicatedTo(@User,CONVERT(NVARCHAR(4000),now.DedicatedTo))=1)   AND  nowc.Hidden<>1
	
	GROUP BY ISNULL(nowt.Tag,N'')

	ORDER BY Tag 

END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeTagGet]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeTimeTagGet    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeTimeTagGet]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeTimeTagGet]
GO

--====================================================================================
--==从 Knowledge, KnowledgeContent 组合中返回 UpdateTime Tag 列表，以及每个 Tag 对应的 Content 数目
--==返回所有年份，月份组合下的 Content 数目
--==用来构造 Blog 或新闻等基于时间的知识的时间标签
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-09-06
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeTimeTagGet

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名

@PageDirectoryName nvarchar(100),				--Page Diretory 的 Name
@Culture nvarchar(100)						--当前文化

AS
  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--================================================
--==对于 UodateTime 为 Null 的情形，使用 Getdate() 替换 （在正式系统中，这种情形应该不会发生）
--================================================
DECLARE @Today DATETIME
SET @Today=GETDATE()

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==从 Option 表返回 KnowledgeApprove 属性
--====================================================================================
DECLARE @KnowledgeApprove NVARCHAR(50)
SELECT @KnowledgeApprove=CONVERT(NVARCHAR(50),opt.[Value]) FROM dbo.[Option] opt WHERE opt.[Key]=N'KnowledgeApprove'

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

IF dbo.UDF_UserAdminEditor(@User)=1         

BEGIN

	--================================================
	--==如果当前用户《是》 Admin Editor
	--================================================

	--================================================
	--==指定 PageDirectoryName（且该 pd  的类型为基于时间的 pd  - Type=2），指定 Culture 下的  Knowledge 中所有 UpdateTime  的分别计数
	--================================================
	SELECT
	
		CONVERT(NVARCHAR(20),YEAR(ISNULL(now.UpdateTime,@Today))) AS Title,
		CONVERT(NVARCHAR(20),MONTH(ISNULL(now.UpdateTime,@Today))) AS Tag,
		COUNT(CONVERT(NVARCHAR(20),MONTH(ISNULL(now.UpdateTime,@Today)))) AS ContentCount
	
	FROM dbo.Knowledge now
	LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
	LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
	
	WHERE pad.[Name]=@PageDirectoryName AND pad.Type=2
	
	GROUP BY CONVERT(NVARCHAR(20),YEAR(ISNULL(now.UpdateTime,@Today))), CONVERT(NVARCHAR(20),MONTH(ISNULL(now.UpdateTime,@Today)))

	ORDER BY Title DESC,Tag DESC

END

ELSE

BEGIN

	--================================================
	--==如果当前用户《不是》 Admin Editor
	--================================================

	--================================================
	--==指定 PageDirectoryName（且该 pd  的类型为基于时间的 pd  - Type=2），指定 Culture 下的  Knowledge 中所有 UpdateTime  的分别计数
	--================================================
	SELECT TOP 100 PERCENT
	
		CONVERT(NVARCHAR(20),YEAR(ISNULL(now.UpdateTime,@Today))) AS Title,
		CONVERT(NVARCHAR(20),MONTH(ISNULL(now.UpdateTime,@Today))) AS Tag,
		COUNT(CONVERT(NVARCHAR(20),MONTH(ISNULL(now.UpdateTime,@Today)))) AS ContentCount
	
	FROM dbo.Knowledge now
	LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]
	LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
	LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
	
	WHERE pad.[Name]=@PageDirectoryName AND pad.Type=2 AND (REPLACE(nowp.DedicatedTo,N',',N'')=N''  or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)  AND  nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N'false')
	
	--WHERE pad.[Name]=@PageDirectoryName AND pad.Type=2 AND (RTRIM(LTRIM(CONVERT(NVARCHAR(4000),now.DedicatedTo)))=N'' or now.DedicatedTo is NULL or RTRIM(LTRIM(CONVERT(NVARCHAR(4000),now.DedicatedTo)))=N'*' or dbo.UDF_UserDedicatedTo(@User,CONVERT(NVARCHAR(4000),now.DedicatedTo))=1)  AND dbo.UDF_UserAdminEditor(@User)<>1    AND  nowc.Hidden<>1
	--WHERE pad.[Name]=@PageDirectoryName AND pad.Type=2 AND (RTRIM(LTRIM(CONVERT(NVARCHAR(4000),now.DedicatedTo)))=N'' or now.DedicatedTo is NULL or RTRIM(LTRIM(CONVERT(NVARCHAR(4000),now.DedicatedTo)))=N'*' or dbo.UDF_UserDedicatedTo(@User,CONVERT(NVARCHAR(4000),now.DedicatedTo))=1)  AND dbo.UDF_UserClient(@User)=1 AND dbo.UDF_UserAdmin(@User)<>1    AND  nowc.Hidden<>1
	
	GROUP BY CONVERT(NVARCHAR(20),YEAR(ISNULL(now.UpdateTime,@Today))), CONVERT(NVARCHAR(20),MONTH(ISNULL(now.UpdateTime,@Today)))

	ORDER BY Title DESC,Tag DESC

END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeTimeTagGet]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeGetByTag    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeGetByTag]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeGetByTag]
GO

--====================================================================================
--==KnowledgeGet 的 ByTag 版  （将 KnowledgeGet 的结果再用 Tag 进行过滤）
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-10-05
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeGetByTag

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名

@PageDirectoryName nvarchar(100),				--Page Diretory 的 Name
@Tag nvarchar(500),						--使用的 Tag （进行过滤）
@Culture nvarchar(100),						--当前文化

@CurrentPage INT						--页码机制：当前页

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==获得当前 PageDirectory  的 Type 值，如果是 1，则我们后面的结果将使用 Order By Serial （普通内容，以 Serial 排序）； 如果是 2 则 Order By UpdateTime （基于时间的内容以发布时间排序）
--====================================================================================
DECLARE @Type INT
SELECT @Type=Type FROM dbo.PageDirectory WHERE [Name]=@PageDirectoryName
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==获得 @PageDirectoryName  所在的 PageDirectory 记录中的 PageSize 值
--====================================================================================
DECLARE @PageSize INT
SELECT TOP 1 @PageSize=PageSize FROM dbo.PageDirectory WHERE [Name]=@PageDirectoryName

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==建立分页
--====================================================================================
DECLARE @Paging TABLE 
( 
	PagingID int identity(1,1), 
	[ID] int, 
	PageDirectoryID int,
	Serial int,
	Hidden bit,
	Approved int,
	ApproveMessage ntext COLLATE database_default, 
	ApprovedBy nvarchar(50) COLLATE database_default, 
	UpdateTime datetime,
	Author nvarchar(50) COLLATE database_default, 
	KnowledgeType int,

	Editor ntext COLLATE database_default, 
	EditorPermission int,

	KnowledgeContentID int,

	--Template nvarchar(200) COLLATE database_default, 
	Title nvarchar(2000) COLLATE database_default, 
	--TitleShow nvarchar(50) COLLATE database_default, 
	Content ntext COLLATE database_default, 
	Tag nvarchar(500) COLLATE database_default, 
	Abstract ntext COLLATE database_default, 

	HitCount int,
	CommentsPermission int,
	CommentsCount int,

	KnowledgeDirectory nvarchar(50) COLLATE database_default 
) 


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==从 Option 表返回 KnowledgeApprove 属性
--====================================================================================
DECLARE @KnowledgeApprove NVARCHAR(50)
SELECT @KnowledgeApprove=CONVERT(NVARCHAR(50),opt.[Value]) FROM dbo.[Option] opt WHERE opt.[Key]=N'KnowledgeApprove'

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==根据 Type=1/2 决定后面使用 ORDER BY Serial 还是 UpdateTime （以下两段代码除了 Order By 之外，其它地方完全一致）
--====================================================================================
IF @Type=1

BEGIN
	--====================================================================================
	--==当前用户是 Admin Editor 还是普通用户
	--====================================================================================
	IF  dbo.UDF_UserAdminEditor(@User)=1

	BEGIN
		--====================================================================================
		--==前用户是 Admin Editor
		--====================================================================================

		--====================================================================================
		--==分 @Tag 《是》《否》为空两种情形 （二者唯一区别在于 @Tag 条件句）
		--====================================================================================
		IF @Tag<>N''
		
		BEGIN

			--====================================================================================
			--==当前情形：@Type=1  |   UserAdmin=1   |   @Tag<>N''
			--====================================================================================
			INSERT INTO @Paging
	
			SELECT
	
				now.[ID] AS [ID],
				now.PageDirectoryID AS PageDirectoryID,
				now.Serial AS Serial,
				ISNULL(nowc.Hidden,0) AS Hidden,
				ISNULL(nowc.Approved,0) AS Approved,
				ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
				ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
				now.UpdateTime AS UpdateTime,
				now.Author AS Author,
				now.KnowledgeType AS KnowledgeType,
	
				now.Editor AS Editor,
				dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,
	
				nowc.[ID] AS KnowledgeContentID,
	
				--nowc.Template AS Template,
				nowc.Title AS Title,
				--nowc.TitleShow AS TitleShow,
				nowc.Content AS Content,
				nowc.Tag AS Tag,
				nowc.Abstract AS Abstract,
	
				ISNULL(nowc.HitCount,0)+1 AS HitCount,
				dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
				(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,
	
				N'Knowledge' AS KnowledgeDirectory
	
			FROM dbo.Knowledge now
			LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
			LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
			WHERE pad.[Name]=@PageDirectoryName AND (@Tag In (select Tag from dbo.KnowledgeTags where KnowledgeContentID=nowc.[ID]))
	
			ORDER BY Serial

		END

		ELSE

		BEGIN

			--====================================================================================
			--==当前情形：@Type=1  |   UserAdmin=1   |   @Tag=N''
			--====================================================================================
			INSERT INTO @Paging
	
			SELECT
	
				now.[ID] AS [ID],
				now.PageDirectoryID AS PageDirectoryID,
				now.Serial AS Serial,
				ISNULL(nowc.Hidden,0) AS Hidden,
				ISNULL(nowc.Approved,0) AS Approved,
				ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
				ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
				now.UpdateTime AS UpdateTime,
				now.Author AS Author,
				now.KnowledgeType AS KnowledgeType,
	
				now.Editor AS Editor,
				dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,
	
				nowc.[ID] AS KnowledgeContentID,
	
				--nowc.Template AS Template,
				nowc.Title AS Title,
				--nowc.TitleShow AS TitleShow,
				nowc.Content AS Content,
				nowc.Tag AS Tag,
				nowc.Abstract AS Abstract,
	
				ISNULL(nowc.HitCount,0)+1 AS HitCount,
				dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
				(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,
	
				N'Knowledge' AS KnowledgeDirectory
	
			FROM dbo.Knowledge now
			LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
			LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
			WHERE pad.[Name]=@PageDirectoryName AND (Not Exists (select Tag from dbo.KnowledgeTags where KnowledgeContentID=nowc.[ID]))
	
			ORDER BY Serial
		END
	END

	ELSE

	BEGIN

		--====================================================================================
		--==前用户不是 Admin Editor
		--====================================================================================

		--====================================================================================
		--==分 @Tag 《是》《否》为空两种情形 （二者唯一区别在于 @Tag 条件句）
		--====================================================================================
		IF @Tag<>N''
		
		BEGIN

			--====================================================================================
			--==当前情形：@Type=1  |   UserAdmin<>1   |   @Tag<>N''
			--====================================================================================
			INSERT INTO @Paging
	
			SELECT
	
				now.[ID] AS [ID],
				now.PageDirectoryID AS PageDirectoryID,
				now.Serial AS Serial,
				ISNULL(nowc.Hidden,0) AS Hidden,
				ISNULL(nowc.Approved,0) AS Approved,
				ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
				ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
				now.UpdateTime AS UpdateTime,
				now.Author AS Author,
				now.KnowledgeType AS KnowledgeType,
	
				now.Editor AS Editor,
				dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,
	
				nowc.[ID] AS KnowledgeContentID,
	
				--nowc.Template AS Template,
				nowc.Title AS Title,
				--nowc.TitleShow AS TitleShow,
				nowc.Content AS Content,
				nowc.Tag AS Tag,
				nowc.Abstract AS Abstract,
	
				ISNULL(nowc.HitCount,0)+1 AS HitCount,
				dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
				(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,
		
				N'Knowledge' AS KnowledgeDirectory
	
			FROM dbo.Knowledge now
			LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]
			LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
			LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
			WHERE pad.[Name]=@PageDirectoryName AND (@Tag In (select Tag from dbo.KnowledgeTags where KnowledgeContentID=nowc.[ID]))  AND (REPLACE(nowp.DedicatedTo,N',',N'')=N''  or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)  AND  nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N'false')
	
			ORDER BY Serial

		END

		ELSE

		BEGIN

			--====================================================================================
			--==当前情形：@Type=1  |   UserAdmin<>1   |   @Tag=N''
			--====================================================================================
			INSERT INTO @Paging
	
			SELECT
	
				now.[ID] AS [ID],
				now.PageDirectoryID AS PageDirectoryID,
				now.Serial AS Serial,
				ISNULL(nowc.Hidden,0) AS Hidden,
				ISNULL(nowc.Approved,0) AS Approved,
				ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
				ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
				now.UpdateTime AS UpdateTime,
				now.Author AS Author,
				now.KnowledgeType AS KnowledgeType,
	
				now.Editor AS Editor,
				dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,
	
				nowc.[ID] AS KnowledgeContentID,
	
				--nowc.Template AS Template,
				nowc.Title AS Title,
				--nowc.TitleShow AS TitleShow,
				nowc.Content AS Content,
				nowc.Tag AS Tag,
				nowc.Abstract AS Abstract,
	
				ISNULL(nowc.HitCount,0)+1 AS HitCount,
				dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
				(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,
		
				N'Knowledge' AS KnowledgeDirectory
	
			FROM dbo.Knowledge now
			LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]
			LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
			LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
			WHERE pad.[Name]=@PageDirectoryName AND (Not Exists (select Tag from dbo.KnowledgeTags where KnowledgeContentID=nowc.[ID]))  AND (REPLACE(nowp.DedicatedTo,N',',N'')=N''  or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)  AND  nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N'false')
	
			ORDER BY Serial

		END
	END
END

ELSE

BEGIN

	--====================================================================================
	--==当前用户是 Admin Editor 还是普通用户
	--====================================================================================
	IF  dbo.UDF_UserAdminEditor(@User)=1

	BEGIN
		--====================================================================================
		--==前用户是 Admin Editor
		--====================================================================================

		--====================================================================================
		--==分 @Tag 《是》《否》为空两种情形 （二者唯一区别在于 @Tag 条件句）
		--====================================================================================
		IF @Tag<>N''
		
		BEGIN

			--====================================================================================
			--==当前情形：@Type<>1  |   UserAdmin=1   |   @Tag<>N''
			--====================================================================================
			INSERT INTO @Paging
	
			SELECT
	
				now.[ID] AS [ID],
				now.PageDirectoryID AS PageDirectoryID,
				now.Serial AS Serial,
				ISNULL(nowc.Hidden,0) AS Hidden,
				ISNULL(nowc.Approved,0) AS Approved,
				ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
				ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
				now.UpdateTime AS UpdateTime,
				now.Author AS Author,
				now.KnowledgeType AS KnowledgeType,
	
				now.Editor AS Editor,
				dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,
	
				nowc.[ID] AS KnowledgeContentID,
	
				--nowc.Template AS Template,
				nowc.Title AS Title,
				--nowc.TitleShow AS TitleShow,
				nowc.Content AS Content,
				nowc.Tag AS Tag,
				nowc.Abstract AS Abstract,
	
				ISNULL(nowc.HitCount,0)+1 AS HitCount,
				dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
				(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,
	
				N'Knowledge' AS KnowledgeDirectory
	
			FROM dbo.Knowledge now
			LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
			LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
			WHERE pad.[Name]=@PageDirectoryName AND (@Tag In (select Tag from dbo.KnowledgeTags where KnowledgeContentID=nowc.[ID]))
	
			ORDER BY UpdateTime DESC

		END

		ELSE

		BEGIN

			--====================================================================================
			--==当前情形：@Type<>1  |   UserAdmin=1   |   @Tag=N''
			--====================================================================================
			INSERT INTO @Paging
	
			SELECT
	
				now.[ID] AS [ID],
				now.PageDirectoryID AS PageDirectoryID,
				now.Serial AS Serial,
				ISNULL(nowc.Hidden,0) AS Hidden,
				ISNULL(nowc.Approved,0) AS Approved,
				ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
				ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
				now.UpdateTime AS UpdateTime,
				now.Author AS Author,
				now.KnowledgeType AS KnowledgeType,
	
				now.Editor AS Editor,
				dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,
	
				nowc.[ID] AS KnowledgeContentID,
	
				--nowc.Template AS Template,
				nowc.Title AS Title,
				--nowc.TitleShow AS TitleShow,
				nowc.Content AS Content,
				nowc.Tag AS Tag,
				nowc.Abstract AS Abstract,
	
				ISNULL(nowc.HitCount,0)+1 AS HitCount,
				dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
				(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,
	
				N'Knowledge' AS KnowledgeDirectory
	
			FROM dbo.Knowledge now
			LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
			LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
			WHERE pad.[Name]=@PageDirectoryName AND (Not Exists (select Tag from dbo.KnowledgeTags where KnowledgeContentID=nowc.[ID]))
	
			ORDER BY UpdateTime DESC

		END
	END

	ELSE

	BEGIN

		--====================================================================================
		--==前用户不是 Admin Editor
		--====================================================================================

		--====================================================================================
		--==分 @Tag 《是》《否》为空两种情形 （二者唯一区别在于 @Tag 条件句）
		--====================================================================================
		IF @Tag<>N''
		
		BEGIN

			--====================================================================================
			--==当前情形：@Type<>1  |   UserAdmin<>1   |   @Tag<>N''
			--====================================================================================
			INSERT INTO @Paging
	
			SELECT
	
				now.[ID] AS [ID],
				now.PageDirectoryID AS PageDirectoryID,
				now.Serial AS Serial,
				ISNULL(nowc.Hidden,0) AS Hidden,
				ISNULL(nowc.Approved,0) AS Approved,
				ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
				ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
				now.UpdateTime AS UpdateTime,
				now.Author AS Author,
				now.KnowledgeType AS KnowledgeType,
	
				now.Editor AS Editor,
				dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,
	
				nowc.[ID] AS KnowledgeContentID,
	
				--nowc.Template AS Template,
				nowc.Title AS Title,
				--nowc.TitleShow AS TitleShow,
				nowc.Content AS Content,
				nowc.Tag AS Tag,
				nowc.Abstract AS Abstract,
	
				ISNULL(nowc.HitCount,0)+1 AS HitCount,
				dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
				(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,
		
				N'Knowledge' AS KnowledgeDirectory
	
			FROM dbo.Knowledge now
			LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]
			LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
			LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
			WHERE pad.[Name]=@PageDirectoryName AND (@Tag In (select Tag from dbo.KnowledgeTags where KnowledgeContentID=nowc.[ID]))  AND (REPLACE(nowp.DedicatedTo,N',',N'')=N''  or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)  AND  nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N'false')
	
			ORDER BY UpdateTime DESC

		END

		ELSE

		BEGIN

			--====================================================================================
			--==当前情形：@Type<>1  |   UserAdmin<>1   |   @Tag=N''
			--====================================================================================
			INSERT INTO @Paging
	
			SELECT
	
				now.[ID] AS [ID],
				now.PageDirectoryID AS PageDirectoryID,
				now.Serial AS Serial,
				ISNULL(nowc.Hidden,0) AS Hidden,
				ISNULL(nowc.Approved,0) AS Approved,
				ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
				ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
				now.UpdateTime AS UpdateTime,
				now.Author AS Author,
				now.KnowledgeType AS KnowledgeType,
	
				now.Editor AS Editor,
				dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,
	
				nowc.[ID] AS KnowledgeContentID,
	
				--nowc.Template AS Template,
				nowc.Title AS Title,
				--nowc.TitleShow AS TitleShow,
				nowc.Content AS Content,
				nowc.Tag AS Tag,
				nowc.Abstract AS Abstract,
	
				ISNULL(nowc.HitCount,0)+1 AS HitCount,
				dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
				(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,
		
				N'Knowledge' AS KnowledgeDirectory
	
			FROM dbo.Knowledge now
			LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]
			LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
			LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
			WHERE pad.[Name]=@PageDirectoryName AND (Not Exists (select Tag from dbo.KnowledgeTags where KnowledgeContentID=nowc.[ID]))  AND (REPLACE(nowp.DedicatedTo,N',',N'')=N''  or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)  AND  nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N'false')
	
			ORDER BY UpdateTime DESC

		END
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ


--=====================================================
--==最后从 @Paging 表变量中获取当前页第一个和最后一个记录的位置
--=====================================================
DECLARE @FirstRecord int
DECLARE @LastRecord int
		
SET @FirstRecord=(@CurrentPage - 1) * @PageSize
SET @LastRecord=(@CurrentPage * @PageSize + 1)

--=====================================================
--==返回当前页中的记录
--==总记录数，除以每页的记录数，用Ceiling()处理，得到的为页数 （注意：count(*)  和 @PageSize 都为 INT，它们相除将得到 INT，所以，首先要将它们转换成 Decimal(18,2)）
--=====================================================
SELECT 	
	*,
	PageCount=CEILING(Convert(decimal(18,2),(select count(*) from @Paging)) / Convert(decimal(18,2),@PageSize)) 

FROM @Paging 
WHERE PagingID>@FirstRecord AND PagingID<@LastRecord

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将《当前页》准备返回的知识 Content  的 HitCount 写回 KnowledgeContent 
--=====================================================
--UPDATE dbo.KnowledgeContent SET HitCount=ISNULL(HitCount,0)+1 WHERE KnowledgeID IN (Select [ID] From @Paging Where PagingID>@FirstRecord AND PagingID<@LastRecord) AND Culture=@Culture
UPDATE dbo.KnowledgeContent SET HitCount=ISNULL(HitCount,0)+1 WHERE [ID] IN (Select KnowledgeContentID From @Paging Where PagingID>@FirstRecord AND PagingID<@LastRecord)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==在 SiteLog 中记录在案 （当前 Paging 里面所有的 KnowledgeContent 都被当前 @User 浏览了一下）
--==原本应当使用 SP SiteLogSave ，但在这里，如果使用 SP SiteLogSave 就必须使用性能非常差的 Cursor，为了避免 Curor 操作，我们这里直接 Insert
--==注意：必须检查 @User 是否为空（排除未登录用户也能浏览的情形）
--=====================================================
IF (@User<>N'') AND (@User IS NOT NULL)
BEGIN
	INSERT INTO dbo.SiteLog ([User],Activity,TargetID,ActivityTime) SELECT @User,1,KnowledgeContentID,GETDATE() FROM @Paging Where PagingID>@FirstRecord AND PagingID<@LastRecord
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==选择给定 @PageDirectoryName 的 PageDirectory ID 和 Knowledge 的 KnowledgeDirectory 名字  （该部分用于创建 “新知识” 链接） 
--==同时返回当前 PageDirectory 的某些属性（Type, Presentation, ShowTitle, ShowAuthor, ShowUpdateTime, ShowHitCount, ShowComments, ShowStaticUrl, ShowKnowledgeHtml, ShowRelative），以便告诉系统如何 Render 知识
--=====================================================
SELECT
	pad.[ID] AS PageDirectoryID,
	pad.[Name] AS PageDirectoryName,
	N'Knowledge' AS KnowledgeDirectory,

	ISNULL(pdc.OutlineMode,0) AS OutlineMode,

	pdc.Title AS Title,
	pdc.Template AS Template,
	pdc.PageHeader AS PageHeader,
	pdc.PageFooter AS PageFooter,

	sdc.PageHeader AS SubDirectoryPageHeader,
	sdc.PageFooter AS  SubDirectoryPageFooter,

	mdc.PageHeader AS MainDirectoryPageHeader,
	mdc.PageFooter AS  MainDirectoryPageFooter,

	pad.Type AS Type,
	pad.Presentation AS Presentation,
	pad.JumpToContent AS JumpToContent,

	pad.ShowTitle AS ShowTitle,
	pad.ShowAuthor AS ShowAuthor,
	pad.ShowUpdateTime AS ShowUpdateTime,
	pad.ShowHitCount AS ShowHitCount,
	pad.ShowComments AS ShowComments,
	pad.ShowStaticUrl AS ShowStaticUrl,
	pad.ShowKnowledgeHtml AS ShowKnowledgeHtml,

	pad.ShowRelative AS ShowRelative

FROM dbo.PageDirectory pad 
LEFT JOIN dbo.PageDirectoryContent pdc ON pdc.PageDirectoryID=pad.[ID] AND pdc.Culture=@Culture

LEFT JOIN dbo.SubDirectory sd ON sd.[ID]=pad.SubDirectoryID
LEFT JOIN dbo.SubDirectoryContent sdc ON sdc.SubDirectoryID=sd.[ID]

LEFT JOIN dbo.MainDirectory md ON md.[ID]=sd.MainDirectoryID
LEFT JOIN dbo.MainDirectoryContent mdc ON mdc.MainDirectoryID=md.[ID]

WHERE pad.[Name]=@PageDirectoryName

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeGetByTag]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeGetByTimeTag    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeGetByTimeTag]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeGetByTimeTag]
GO

--====================================================================================
--==KnowledgeGet 的 ByTimeTag 版  （将 KnowledgeGet 的结果再用 TimeTag 进行过滤）
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-10-05
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeGetByTimeTag

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名

@PageDirectoryName nvarchar(100),				--Page Diretory 的 Name
@TimeTagYear int,						--使用的 TimeTag （进行过滤）
@TimeTagMonth int,						--使用的 TimeTag （进行过滤）
@Culture nvarchar(100),						--当前文化

@CurrentPage INT						--页码机制：当前页

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==获得 @PageDirectoryName  所在的 PageDirectory 记录中的 PageSize 值
--====================================================================================
DECLARE @PageSize INT
SELECT TOP 1 @PageSize=PageSize FROM dbo.PageDirectory WHERE [Name]=@PageDirectoryName

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==建立分页
--====================================================================================
DECLARE @Paging TABLE 
( 
	PagingID int identity(1,1), 
	[ID] int, 
	PageDirectoryID int,
	Serial int,
	Hidden bit,
	Approved int,
	ApproveMessage ntext COLLATE database_default, 
	ApprovedBy nvarchar(50) COLLATE database_default, 
	UpdateTime datetime,
	Author nvarchar(50) COLLATE database_default, 
	KnowledgeType int,

	Editor ntext COLLATE database_default, 
	EditorPermission int,

	KnowledgeContentID int,

	--Template nvarchar(200) COLLATE database_default, 
	Title nvarchar(2000) COLLATE database_default, 
	--TitleShow nvarchar(50) COLLATE database_default, 
	Content ntext COLLATE database_default, 
	Tag nvarchar(500) COLLATE database_default, 
	Abstract ntext COLLATE database_default, 

	HitCount int,
	CommentsPermission int,
	CommentsCount int,

	KnowledgeDirectory nvarchar(50) COLLATE database_default 
) 

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==从 Option 表返回 KnowledgeApprove 属性
--====================================================================================
DECLARE @KnowledgeApprove NVARCHAR(50)
SELECT @KnowledgeApprove=CONVERT(NVARCHAR(50),opt.[Value]) FROM dbo.[Option] opt WHERE opt.[Key]=N'KnowledgeApprove'

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==当前用户是 Admin Editor 还是普通用户
--====================================================================================
IF  dbo.UDF_UserAdminEditor(@User)=1

BEGIN
	--====================================================================================
	--==当前用户是 Admin Editor 
	--====================================================================================
	INSERT INTO @Paging

	SELECT

		now.[ID] AS [ID],
		now.PageDirectoryID AS PageDirectoryID,
		now.Serial AS Serial,
		ISNULL(nowc.Hidden,0) AS Hidden,
		ISNULL(nowc.Approved,0) AS Approved,
		ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
		ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
		now.UpdateTime AS UpdateTime,
		now.Author AS Author,
		now.KnowledgeType AS KnowledgeType,

		now.Editor AS Editor,
		dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,

		nowc.[ID] AS KnowledgeContentID,

		--nowc.Template AS Template,
		nowc.Title AS Title,
		--nowc.TitleShow AS TitleShow,
		nowc.Content AS Content,
		nowc.Tag AS Tag,
		nowc.Abstract AS Abstract,

		ISNULL(nowc.HitCount,0)+1 AS HitCount,
		dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
		(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,

		N'Knowledge' AS KnowledgeDirectory

	FROM dbo.Knowledge now
	LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
	LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID

	WHERE pad.[Name]=@PageDirectoryName AND YEAR(now.UpdateTime)=@TimeTagYear AND MONTH(now.UpdateTime)=@TimeTagMonth 

	ORDER BY UpdateTime DESC

END

ELSE

BEGIN 

	--====================================================================================
	--==当前用户《不是》 Admin Editor 
	--====================================================================================
	INSERT INTO @Paging

	SELECT

		now.[ID] AS [ID],
		now.PageDirectoryID AS PageDirectoryID,
		now.Serial AS Serial,
		ISNULL(nowc.Hidden,0) AS Hidden,
		ISNULL(nowc.Approved,0) AS Approved,
		ISNULL(nowc.ApproveMessage,N'') AS ApproveMessage,
		ISNULL(nowc.ApprovedBy,N'') AS ApprovedBy,
		now.UpdateTime AS UpdateTime,
		now.Author AS Author,
		now.KnowledgeType AS KnowledgeType,

		now.Editor AS Editor,
		dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),now.Editor)) AS EditorPermission,

		nowc.[ID] AS KnowledgeContentID,

		--nowc.Template AS Template,
		nowc.Title AS Title,
		--nowc.TitleShow AS TitleShow,
		nowc.Content AS Content,
		nowc.Tag AS Tag,
		nowc.Abstract AS Abstract,

		ISNULL(nowc.HitCount,0)+1 AS HitCount,
		dbo.UDF_KnowledgeCommentsPermission(now.[ID],@User) AS CommentsPermission,
		(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount,

		N'Knowledge' AS KnowledgeDirectory

	FROM dbo.Knowledge now
	LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]
	LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
	LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID

	WHERE pad.[Name]=@PageDirectoryName AND YEAR(now.UpdateTime)=@TimeTagYear AND MONTH(now.UpdateTime)=@TimeTagMonth AND (REPLACE(nowp.DedicatedTo,N',',N'')=N''  or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)   AND  nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N'false')

	ORDER BY UpdateTime DESC
END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==最后从 @Paging 表变量中获取当前页第一个和最后一个记录的位置
--=====================================================
DECLARE @FirstRecord int
DECLARE @LastRecord int
		
SET @FirstRecord=(@CurrentPage - 1) * @PageSize
SET @LastRecord=(@CurrentPage * @PageSize + 1)

--=====================================================
--==返回当前页中的记录
--==总记录数，除以每页的记录数，用Ceiling()处理，得到的为页数 （注意：count(*)  和 @PageSize 都为 INT，它们相除将得到 INT，所以，首先要将它们转换成 Decimal(18,2)）
--=====================================================
SELECT 	
	*,
	PageCount=CEILING(Convert(decimal(18,2),(select count(*) from @Paging)) / Convert(decimal(18,2),@PageSize)) 

FROM @Paging 
WHERE PagingID>@FirstRecord AND PagingID<@LastRecord

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将《当前页》准备返回的知识 Content  的 HitCount 写回 KnowledgeContent 
--=====================================================
--UPDATE dbo.KnowledgeContent SET HitCount=ISNULL(HitCount,0)+1 WHERE KnowledgeID IN (Select [ID] From @Paging Where PagingID>@FirstRecord AND PagingID<@LastRecord) AND Culture=@Culture
UPDATE dbo.KnowledgeContent SET HitCount=ISNULL(HitCount,0)+1 WHERE [ID] IN (Select KnowledgeContentID From @Paging Where PagingID>@FirstRecord AND PagingID<@LastRecord)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==在 SiteLog 中记录在案 （当前 Paging 里面所有的 KnowledgeContent 都被当前 @User 浏览了一下）
--==原本应当使用 SP SiteLogSave ，但在这里，如果使用 SP SiteLogSave 就必须使用性能非常差的 Cursor，为了避免 Curor 操作，我们这里直接 Insert
--==注意：必须检查 @User 是否为空（排除未登录用户也能浏览的情形）
--=====================================================
IF (@User<>N'') AND (@User IS NOT NULL)
BEGIN
	INSERT INTO dbo.SiteLog ([User],Activity,TargetID,ActivityTime) SELECT @User,1,KnowledgeContentID,GETDATE() FROM @Paging Where PagingID>@FirstRecord AND PagingID<@LastRecord
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==选择给定 @PageDirectoryName 的 PageDirectory ID 和 Knowledge 的 KnowledgeDirectory 名字  （该部分用于创建 “新知识” 链接） 
--==同时返回当前 PageDirectory 的某些属性（Type, Presentation, ShowTitle, ShowAuthor, ShowUpdateTime, ShowHitCount, ShowComments, ShowStaticUrl, ShowKnowledgeHtml, ShowRelative），以便告诉系统如何 Render 知识
--=====================================================
SELECT
	pad.[ID] AS PageDirectoryID,
	pad.[Name] AS PageDirectoryName,
	N'Knowledge' AS KnowledgeDirectory,

	ISNULL(pdc.OutlineMode,0) AS OutlineMode,

	pdc.Title AS Title,
	pdc.Template AS Template,
	pdc.PageHeader AS PageHeader,
	pdc.PageFooter AS PageFooter,

	sdc.PageHeader AS SubDirectoryPageHeader,
	sdc.PageFooter AS  SubDirectoryPageFooter,

	mdc.PageHeader AS MainDirectoryPageHeader,
	mdc.PageFooter AS  MainDirectoryPageFooter,

	pad.Type AS Type,
	pad.Presentation AS Presentation,
	pad.JumpToContent AS JumpToContent,

	pad.ShowTitle AS ShowTitle,
	pad.ShowAuthor AS ShowAuthor,
	pad.ShowUpdateTime AS ShowUpdateTime,
	pad.ShowHitCount AS ShowHitCount,
	pad.ShowComments AS ShowComments,
	pad.ShowStaticUrl AS ShowStaticUrl,
	pad.ShowKnowledgeHtml AS ShowKnowledgeHtml,
	pad.ShowRelative AS ShowRelative

FROM dbo.PageDirectory pad 
LEFT JOIN dbo.PageDirectoryContent pdc ON pdc.PageDirectoryID=pad.[ID] AND pdc.Culture=@Culture

LEFT JOIN dbo.SubDirectory sd ON sd.[ID]=pad.SubDirectoryID
LEFT JOIN dbo.SubDirectoryContent sdc ON sdc.SubDirectoryID=sd.[ID]

LEFT JOIN dbo.MainDirectory md ON md.[ID]=sd.MainDirectoryID
LEFT JOIN dbo.MainDirectoryContent mdc ON mdc.MainDirectoryID=md.[ID]

WHERE pad.[Name]=@PageDirectoryName

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeGetByTimeTag]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeCommentsGet    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeCommentsGet]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeCommentsGet]
GO

--====================================================================================
--==给定 KnowledgeContentID 返回对应的 KnowledgeComments
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-05-15
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeCommentsGet

@KnowledgeID int,						--当前单个知识
@Culture nvarchar(100),						--当前文化

@PageSize INT,						--页码机制：每页的尺寸
@CurrentPage INT						--页码机制：当前页

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==创建一个 table 变量，容纳结果，以便在后面进行分页处理
--====================================================================================
SET NOCOUNT ON

DECLARE @Paging TABLE
(
	PagingID int identity(1,1),
	[ID] int,
	KnowledgeContentID int,
	CommentsTime datetime,
	CommentsUser nvarchar(50) COLLATE database_default,
	CommentsContent nvarchar(1000) COLLATE database_default
)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择给定 @PageDirectoryName 下所有 Knowledge 的内容 （该部分用于显示知识，也用于对知识进行删除，修改链接的创建）
--==当前用户既非 Admin 也非 Client
--====================================================================================
INSERT INTO @Paging

SELECT

	nowco.[ID] AS [ID],
	nowco.KnowledgeContentID AS KnowledgeContentID,
	nowco.CommentsTime AS CommentsTime,
	nowco.CommentsUser AS CommentsUser,
	nowco.CommentsContent AS CommentsContent

FROM dbo.KnowledgeComments nowco

WHERE nowco.KnowledgeContentID IN (Select [ID] From dbo.KnowledgeContent Where KnowledgeID=@KnowledgeID AND Culture=@Culture)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
	
--=====================================================
--==计算 @PageCount
--=====================================================
DECLARE @PageCount INT
SELECT @PageCount=CEILING (Convert(decimal(18,2),(select count(*) from @Paging)) / Convert(decimal(18,2),@PageSize))

IF @CurrentPage>@PageCount
BEGIN
	SELECT @CurrentPage=@PageCount
END

IF @CurrentPage<1
BEGIN
	SELECT @CurrentPage=1
END
	
--=====================================================
--==最后从 @Paging 表变量中获取数据
--=====================================================
DECLARE @FirstRecord INT
DECLARE @LastRecord INT
		
SET @FirstRecord=(@CurrentPage - 1) * @PageSize	--当前页第一个记录前
SET @LastRecord=(@CurrentPage * @PageSize + 1)	--当前页最后一个记录后
		
--=====================================================
--==总记录数，除以每页的记录数，用Ceiling()处理，得到的为页数 （注意：count(*)  和 @PageSize 都为 INT，它们相除将得到 INT，所以，首先要将它们转换成 Decimal(18,2)）
--=====================================================
SELECT 

	*,

	PageCount=@PageCount

FROM @Paging WHERE PagingID>@FirstRecord AND PagingID<@LastRecord

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeCommentsGet]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeCommentsSave    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeCommentsSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeCommentsSave]
GO

--====================================================================================
--==保存 KnowledgeComments  
--==除了发布评论内容之外，还发布评论用户和密码，我们在评论现场这样处理
--==如果当前 Knowledge 不允许评论，则现场压根不提供评论界面
--==如果当前 Knowledge 允许任意人评论，则，现场提供评论界面和用户名界面
--==如果当前 Knowledge 只允许给定用户（* 代表所有客户；user1,user2,user3 表示给定列表用户）评论，则首先看看当前是否已经登陆了，如果已登陆，则只提供评论界面，不需要用户名密码；如果没有登陆，则还要提供用户名密码界面
--==对于已经登陆的情形，系统自动找到当前用户的用户名密码传递过来，没有登陆，则使用发布的用户名密码
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-05-15
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeCommentsSave

@KnowledgeID int,						--给定 Knowledge  的 ID （我们将根据这个参数，以及 Culture 参数，获得 KnowledgeContentID
@Culture NVARCHAR(100),					--给定知识的 Culture

@User NVARCHAR(50),						--评论用户名
@Password NVARCHAR(200),					--评论用户的 Password
@CommentsContent nvarchar(1000),				--评论内容

@PageSize INT,						--评论页码尺寸 （来自 Option）
@PageCount INT OUT						--评论目前的总页数 （以便添加评论后定位到最后一页最后一个 Comments 处）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据 @KnowledgeID 以及 @Culture 获得 KnowledgeContentID
--=====================================================
DECLARE @KnowledgeContentID INT

SELECT @KnowledgeContentID=[ID] FROM dbo.KnowledgeContent WHERE KnowledgeID=@KnowledgeID AND Culture=@Culture

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.KnowledgeCommentsAuthenticationSave @KnowledgeContentID, @User,@Password,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==执行保存
--=====================================================
INSERT dbo.KnowledgeComments (KnowledgeContentID,CommentsTime,CommentsUser,CommentsContent) VALUES (@KnowledgeContentID,GETDATE(),@User,@CommentsContent)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==保存后，返回新的 PageCount
--=====================================================
SELECT @PageCount=CEILING (Convert(decimal(18,2),(select count(*) from KnowledgeComments where KnowledgeContentID=@KnowledgeContentID)) / Convert(decimal(18,2),@PageSize))

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（在 @KnowledgeContentID 下添加了评论）
--=====================================================
EXEC dbo.SiteLogSave @User, 7, @KnowledgeContentID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeCommentsSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeCommentsAuthenticationSave    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeCommentsAuthenticationSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeCommentsAuthenticationSave]
GO

--====================================================================================
--==检查当前用户对给定 Knowledge 的评论权限 （调用 UDF_KnowledgeCommentsPermission）
--==根据 @KnowledgeContentID 获得 KnowledgeID，可以知道指定 Knowledge 是否允许评论，分以下 4 种情形
--==如果 UDF_KnowledgeCommentsPermission 返回 0，则没什么可说的，不允许评论 
--==如果 UDF_KnowledgeCommentsPermission 返回 1，则任何人都可以评论，不需要进行什么验证，传上来的用户名只是为给 CommentsUser 
--==如果 UDF_KnowledgeCommentsPermission 返回 2，则说明当前 Knowledge 只允许给定用户评论（* 或 User1,User2,User3 表明：全部客户给定列表客户或 admin），并且当前用户已经登陆，这里传递过来的用户名密码是从登陆用户信息中获得的，但仍然要验证一下（肯定能通过）
--==如果 UDF_KnowledgeCommentsPermission 返回 3，则说明当前 Knowledge 只允许给定用户评论（* 或 User1,User2,User3 表明：全部客户给定列表客户或 admin），并且当前用户尚未登陆，这里传递过来的用户名密码是用户临时输入的，需要验证（如果用户临时输错了，就通不过）
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28 
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeCommentsAuthenticationSave

@KnowledgeContentID INT,		--指定的 KnowledgeContent 的 ID
@User NVARCHAR(50),			--评论用户名
@Password NVARCHAR(200),		--评论用户的 Password

@oPass INT OUT			--输出参数：通过返回 1，否则 0

AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--==========================================
--==从 @KnowledgeContentID 返回 KnowledgeID
--==========================================
DECLARE @KnowledgeID INT
SELECT @KnowledgeID=KnowledgeID FROM dbo.KnowledgeContent WHERE [ID]=@KnowledgeContentID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--==========================================
--==先假设 检查通过   
--==========================================
SET @oPass=1

--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
--xx调用 UDF_KnowledgeCommentsPermission 检查当前用户对当前知识是否有评论权限
--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
IF dbo.UDF_KnowledgeCommentsPermission(@KnowledgeID,@User)=0

	BEGIN
		SET @oPass=0
		RAISERROR(N'Comments not allowed for this article.',16,1)
		RETURN
	END

ELSE IF (dbo.UDF_KnowledgeCommentsPermission(@KnowledgeID,@User)=2) OR (dbo.UDF_KnowledgeCommentsPermission(@KnowledgeID,@User)=3)

	BEGIN
		IF NOT EXISTS (Select [ID] From dbo.Users Where [Name]=@User And [Password]=@Password)
		BEGIN
			SET @oPass=0
			RAISERROR(N'User name or password invalid. ',16,1)
			RETURN
		END
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeCommentsAuthenticationSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeCommentsDelete    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeCommentsDelete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeCommentsDelete]
GO

--====================================================================================
--==删除 KnowledgeComments  
--==需要权限检查（只需要判定当前登陆拥护属于 Admin 即可）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-05-15
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeCommentsDelete

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名
@KnowledgeCommentsID int,					--将被删除的 Comments 的 ID

@PageSize int,							--使用该参数计算删除执行后，PageCount 值，以便在删除现场页码定位 （比如，删除时位于第5页，删除后，余下4页，则我们要强迫页码回到第4页）
@PageCount int OUT						--删除后的总页数

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据 @KnowledgeCommentsID 获得 KnowledgeID 以便使用 SP AdminEditorUserAuthentication 判断当前用户是否有权限删除
--==其中 @KnowledgeContentID 是后面 SiteLogSave 使用的
--=====================================================
DECLARE @KnowledgeID INT
DECLARE @KnowledgeContentID INT

SELECT @KnowledgeID=now.[ID] , @KnowledgeContentID=nowc.[ID]

FROM dbo.Knowledge now 
LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID]
LEFT JOIN dbo.KnowledgeComments nowcom ON nowcom.KnowledgeContentID=nowc.[ID]

WHERE nowcom.[ID]=@KnowledgeCommentsID

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'Knowledge',@KnowledgeID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==执行删除
--=====================================================
DELETE FROM dbo.KnowledgeComments WHERE [ID]=@KnowledgeCommentsID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==保存后，返回新的 PageCount
--=====================================================
SELECT @PageCount=CEILING (Convert(decimal(18,2),(select count(*) from KnowledgeComments where KnowledgeContentID=@KnowledgeContentID)) / Convert(decimal(18,2),@PageSize))

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（在 @KnowledgeContentID 下删除了评论）
--=====================================================
EXEC dbo.SiteLogSave @User, 20, @KnowledgeContentID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeCommentsDelete]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeReferenceP    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeReferenceP]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeReferenceP]
GO

--====================================================================================
--==使用 PageDirectory ID 对知识进行引用 （SP KnowledgeReferenceK 是 根据 Knowledge ID 进行引用）
--==注意：这里使用了 UNION ALL ： 因为选取结果中有 ntext 数据类型，如果不使用 UNION ALL ，系统会报告 ntext 数据类型不可用于 SELECT DISTINCT 错误
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-09-06
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeReferenceP

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名

@PageDirectoryID int,						--Page Diretory 的 ID
@Culture nvarchar(100),						--当前文化
@TopN INT							--返回最近的 N 条记录

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==动态 SQL 语句 （使用动态语句，仅仅为了实现 TopN 功能，因为 SQL 2000 还不支持变量形式的 TopN， 升级到 SQL 2005 以后就可以了）
--====================================================================================
DECLARE @DynSQL NVARCHAR(4000)
SET @DynSQL=N''

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==获得当前 PageDirectory  的 Type 值，如果是 1，则我们后面的结果将使用 Order By Serial （普通内容，以 Serial 排序）； 如果是 2 则 Order By UpdateTime （基于时间的内容以发布时间排序）
--====================================================================================
DECLARE @OrderBy NVARCHAR(200)
DECLARE @Type INT
SELECT @Type=Type FROM dbo.PageDirectory WHERE [ID]=@PageDirectoryID

IF @Type=1

	BEGIN
		SET @OrderBy=N'ORDER BY Serial'
	END
ELSE
	BEGIN
		SET @OrderBy=N'ORDER BY UpdateTime DESC'
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==从 Option 表返回 KnowledgeApprove 属性
--=====================================================
SET @DynSQL=@DynSQL + N' Declare @KnowledgeApprove nvarchar(50) '
SET @DynSQL=@DynSQL + N' Select @KnowledgeApprove=convert(nvarchar(50),opt.[Value]) From dbo.[Option] opt Where opt.[Key]=N''KnowledgeApprove'' '

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==根据用户是否 Admin Editor  输出不同结果
--====================================================================================
SET @DynSQL=@DynSQL + N'

IF dbo.UDF_UserAdminEditor(N'''  + @User  + N''')=1

BEGIN

	SELECT TOP  ' + CONVERT(NVARCHAR(20),@TopN)  + N' 

		now.[ID] AS [ID],
		now.PageDirectoryID AS PageDirectoryID,
		pad.[Name] AS PageDirectoryName,
		now.Serial AS Serial,
		ISNULL(nowc.Hidden,0) AS Hidden,
		ISNULL(nowc.Approved,1) AS Approved,
		now.UpdateTime AS UpdateTime,
		now.Author AS Author,
		now.Editor AS Editor,
		dbo.UDF_EditorDedicatedTo(''' + @User + N''',convert(nvarchar(4000),now.Editor)) AS EditorPermission,

		--nowc.Template AS Template,
		nowc.Title AS Title,
		--nowc.TitleShow AS TitleShow,
		nowc.Content AS Content,
		nowc.Tag AS Tag,
		nowc.Abstract AS Abstract,

		ISNULL(nowc.HitCount,0) AS HitCount,
		(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount

	FROM dbo.Knowledge now
	LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=N''' + @Culture + N'''
	LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID

	WHERE pad.[ID]=' + CONVERT(NVARCHAR(20),@PageDirectoryID) + N'  

	' + @OrderBy + N'

END

ELSE

BEGIN

	SELECT TOP  ' + CONVERT(NVARCHAR(20),@TopN)  + N' 

		now.[ID] AS [ID],
		now.PageDirectoryID AS PageDirectoryID,
		pad.[Name] AS PageDirectoryName,
		now.Serial AS Serial,
		ISNULL(nowc.Hidden,0) AS Hidden,
		ISNULL(nowc.Approved,1) AS Approved,
		now.UpdateTime AS UpdateTime,
		now.Author AS Author,
		now.Editor AS Editor,
		dbo.UDF_EditorDedicatedTo(''' + @User + N''',convert(nvarchar(4000),now.Editor)) AS EditorPermission,

		--nowc.Template AS Template,
		nowc.Title AS Title,
		--nowc.TitleShow AS TitleShow,
		nowc.Content AS Content,
		nowc.Tag AS Tag,
		nowc.Abstract AS Abstract,

		ISNULL(nowc.HitCount,0) AS HitCount,
		(Select Count([ID]) From dbo.KnowledgeComments Where KnowledgeContentID=nowc.[ID]) AS CommentsCount

	FROM dbo.Knowledge now
	LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]
	LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=N''' + @Culture + N'''
	LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID

	WHERE pad.[ID]=' + CONVERT(NVARCHAR(20),@PageDirectoryID) + N' AND (REPLACE(nowp.DedicatedTo,N'','',N'''')=N''''   or  dbo.UDF_UserDedicatedTo(N''' + @User  + N''',nowp.DedicatedTo)=1)  AND nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N''false'') 

	' + @OrderBy + N'
END

'
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==最后执行动态 SQL 语句 
--====================================================================================
EXEC(@DynSQL)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeReferenceP]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeHide    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeHide]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeHide]
GO

--====================================================================================
--==将给定 Knowledge 条目隐藏  （具体为指定 Culture 下的  MainDirectoryContent, SubDirectoryContent, PageDirectoryContent, KnowledgeContent）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-04-08
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeHide

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@KnowledgeDirectory nvarchar(100),		--将被隐藏的 Knowledge  条目的的 Directory
@KnowledgeItem int,				--将被隐藏的 Knowledge  条目的 ID
@Culture nvarchar(50)				--指定 Culture

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,@KnowledgeDirectory,@KnowledgeItem,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==分 KnowledgeDirectory 不同进行处理
--=====================================================

IF LOWER(RTRIM(LTRIM(@KnowledgeDirectory)))=LOWER(N'MainDirectory')

	BEGIN
		--=====================================================
		--==隐藏主目录
		--=====================================================
		UPDATE dbo.MainDirectoryContent SET Hidden=1  WHERE [MainDirectoryID]=@KnowledgeItem  AND Culture=@Culture

		--=====================================================
		--==将当前活动记录在案（修改了主目录）
		--=====================================================
		EXEC dbo.SiteLogSave @User, 10, @KnowledgeItem
	END

ELSE IF LOWER(RTRIM(LTRIM(@KnowledgeDirectory)))=LOWER(N'SubDirectory')

	BEGIN
		--=====================================================
		--==隐藏子目录
		--=====================================================
		UPDATE dbo.SubDirectoryContent SET Hidden=1  WHERE [SubDirectoryID]=@KnowledgeItem  AND Culture=@Culture

		--=====================================================
		--==将当前活动记录在案（修改了子目录）
		--=====================================================
		EXEC dbo.SiteLogSave @User, 11, @KnowledgeItem
	END

ELSE IF LOWER(RTRIM(LTRIM(@KnowledgeDirectory)))=LOWER(N'PageDirectory')

	BEGIN
		--=====================================================
		--==隐藏页目录
		--=====================================================
		UPDATE dbo.PageDirectoryContent SET Hidden=1  WHERE [PageDirectoryID]=@KnowledgeItem  AND Culture=@Culture

		--=====================================================
		--==将当前活动记录在案（修改了页目录）
		--=====================================================
		EXEC dbo.SiteLogSave @User, 12, @KnowledgeItem
	END

ELSE IF LOWER(RTRIM(LTRIM(@KnowledgeDirectory)))=LOWER(N'Knowledge')

	BEGIN
		--=====================================================
		--==隐藏内容
		--=====================================================
		UPDATE dbo.KnowledgeContent SET Hidden=1  WHERE [KnowledgeID]=@KnowledgeItem AND Culture=@Culture

		--=====================================================
		--==将当前活动记录在案（修改了页目录）
		--=====================================================
		EXEC dbo.SiteLogSave @User, 13, @KnowledgeItem
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeHide]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeShow    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeShow]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeShow]
GO

--====================================================================================
--==将给定 Knowledge 条目显示（取消隐藏） （具体指给定  Culture 下的  MainDirectoryContent, SubDirectoryContent, PageDirectoryContent, KnowledgeContent）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-24
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeShow

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@KnowledgeDirectory nvarchar(100),		--将被隐藏的 Knowledge  条目的的 Directory
@KnowledgeItem int,				--将被隐藏的 Knowledge  条目的 ID
@Culture nvarchar(50)				--给定 Culture

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,@KnowledgeDirectory,@KnowledgeItem,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==分 KnowledgeDirectory 不同进行处理
--=====================================================

IF LOWER(RTRIM(LTRIM(@KnowledgeDirectory)))=LOWER(N'MainDirectory')

	BEGIN
		--=====================================================
		--==显示主目录 （注：当 Hidden 属性清除的时候，对应的 HiddenInNavigationOnly 也清楚。HiddenInNavigationOnly 只有在 Hidden=1 的时候才有效）
		--=====================================================
		UPDATE dbo.MainDirectoryContent SET Hidden=0,HiddenInNavigationOnly=0  WHERE [MainDirectoryID]=@KnowledgeItem AND Culture=@Culture

		--=====================================================
		--==将当前活动记录在案（修改了主目录）
		--=====================================================
		EXEC dbo.SiteLogSave @User, 10, @KnowledgeItem
	END

ELSE IF LOWER(RTRIM(LTRIM(@KnowledgeDirectory)))=LOWER(N'SubDirectory')

	BEGIN
		--=====================================================
		--==显示子目录 （注：当 Hidden 属性清除的时候，对应的 HiddenInNavigationOnly 也清楚。HiddenInNavigationOnly 只有在 Hidden=1 的时候才有效）
		--=====================================================
		UPDATE dbo.SubDirectoryContent SET Hidden=0,HiddenInNavigationOnly=0  WHERE [SubDirectoryID]=@KnowledgeItem AND Culture=@Culture

		--=====================================================
		--==将当前活动记录在案（修改了子目录）
		--=====================================================
		EXEC dbo.SiteLogSave @User, 11, @KnowledgeItem
	END

ELSE IF LOWER(RTRIM(LTRIM(@KnowledgeDirectory)))=LOWER(N'PageDirectory')

	BEGIN
		--=====================================================
		--==显示页目录 （注：当 Hidden 属性清除的时候，对应的 HiddenInNavigationOnly 也清楚。HiddenInNavigationOnly 只有在 Hidden=1 的时候才有效）
		--=====================================================
		UPDATE dbo.PageDirectoryContent SET Hidden=0,HiddenInNavigationOnly=0  WHERE [PageDirectoryID]=@KnowledgeItem AND Culture=@Culture

		--=====================================================
		--==将当前活动记录在案（修改了页目录）
		--=====================================================
		EXEC dbo.SiteLogSave @User, 12, @KnowledgeItem
	END

ELSE IF LOWER(RTRIM(LTRIM(@KnowledgeDirectory)))=LOWER(N'Knowledge')

	BEGIN
		--=====================================================
		--==显示内容
		--=====================================================
		UPDATE dbo.KnowledgeContent SET Hidden=0  WHERE [KnowledgeID]=@KnowledgeItem AND Culture=@Culture

		--=====================================================
		--==将当前活动记录在案（修改了内容）
		--=====================================================
		EXEC dbo.SiteLogSave @User, 13, @KnowledgeItem
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeShow]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.CommunityShow    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CommunityShow]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CommunityShow]
GO

--====================================================================================
--==将给定 Community 条目显示（取消隐藏）  （具体指的是给定 Culture 下的 CommunityContent 和 ForumContent）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-04-08
--====================================================================================

CREATE PROCEDURE dbo.CommunityShow

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@CommunityDirectory nvarchar(100),		--将被隐藏的 Community  条目的的 Directory
@CommunityItem int,				--将被隐藏的 Community  条目的 ID
@Culture nvarchar(100)				--指定 Culture

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==分 CommunityDirectory 不同进行处理
--=====================================================

IF LOWER(RTRIM(LTRIM(@CommunityDirectory)))=LOWER(N'Community')

	BEGIN
		UPDATE dbo.CommunityContent SET Hidden=0  WHERE [CommunityID]=@CommunityItem AND Culture=@Culture
	END

ELSE IF LOWER(RTRIM(LTRIM(@CommunityDirectory)))=LOWER(N'Forum')

	BEGIN
		UPDATE dbo.ForumContent SET Hidden=0 WHERE [ForumID]=@CommunityItem AND Culture=@Culture
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[CommunityShow]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.CommunityHide    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CommunityHide]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CommunityHide]
GO

--====================================================================================
--==将给定 Community 条目隐藏 （具体指给定 Culture 下的 CommunityContent, ForumContent）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-04-08
--====================================================================================

CREATE PROCEDURE dbo.CommunityHide

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@CommunityDirectory nvarchar(100),		--将被隐藏的 Community  条目的的 Directory
@CommunityItem int,				--将被隐藏的 Community  条目的 ID
@Culture nvarchar(100)				--给定 Culture

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==分 CommunityDirectory 不同进行处理
--=====================================================

IF LOWER(RTRIM(LTRIM(@CommunityDirectory)))=LOWER(N'Community')

	BEGIN
		UPDATE dbo.CommunityContent SET Hidden=1  WHERE [CommunityID]=@CommunityItem AND Culture=@Culture
	END

ELSE IF LOWER(RTRIM(LTRIM(@CommunityDirectory)))=LOWER(N'Forum')

	BEGIN
		UPDATE dbo.ForumContent SET Hidden=1  WHERE [ForumID]=@CommunityItem AND Culture=@Culture
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[CommunityHide]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeHome    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeHome]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeHome]
GO

--====================================================================================
--==将给定 Knowledge  （肯定是 PageDirectory） 设置为首页
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-04-08
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeHome

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@KnowledgeDirectory nvarchar(100),		--将被设置为首页的 Knowledge  条目的的 Directory （肯定为 PageDirectory）
@KnowledgeItem int				--将被设置为首页的 Knowledge  条目的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （需要 Admin 或 ChiefEditor 权限）
--=====================================================
DECLARE @oPass INT
--EXEC dbo.AdminEditorUserAuthentication @User,@KnowledgeDirectory,@KnowledgeItem,@oPass OUT
EXEC dbo.AdminEditorUserAuthentication @User,N'',0,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==分 KnowledgeDirectory 不同进行处理
--=====================================================

IF LOWER(RTRIM(LTRIM(@KnowledgeDirectory)))=LOWER(N'PageDirectory')

	BEGIN
		--=====================================================
		--==因为系统中同时只能有一个页是 Home Page，所以我们首先将已经是 Home Page 的项目的 Home 标志清除
		--=====================================================
		UPDATE dbo.PageDirectory SET Home=0 WHERE Home=1

		--=====================================================
		--==设置
		--=====================================================
		UPDATE dbo.PageDirectory SET Home=1  WHERE [ID]=@KnowledgeItem

		--=====================================================
		--==将当前活动记录在案（修改了页目录）
		--=====================================================
		EXEC dbo.SiteLogSave @User, 12, @KnowledgeItem
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeHome]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeGetTitle    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeGetTitle]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeGetTitle]
GO

--====================================================================================
--==根据给定的  Knowledge ID 以 获得 KnowledgeContent 表中指定文化下的 Title
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28 
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeGetTitle

@KnowledgeID INT,				--Knowledge 记录 ID
@Culture nvarchar(100),				--当前文化

@Title nvarchar(2000) OUT

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择
--====================================================================================
SELECT @Title=nowc.Title

FROM dbo.KnowledgeContent nowc

WHERE nowc.KnowledgeID=@KnowledgeID AND nowc.Culture=@Culture

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeGetTitle]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeTemplateGet    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeTemplateGet]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeTemplateGet]
GO

--====================================================================================
--==该 SP 的目的是在正式 Render Knowledge 前，尽可能快速，Light Weight 地返回 Template 名字，以便在 Page Header 中注册该 Template 可能包含的 css 文件
--==如果提供的 @PageDirectoryName 非空，将返回 Home Page 页的 Template 名字
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-04-08
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeTemplateGet

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名

@PageDirectoryName nvarchar(100),				--Page Diretory 的 Name
@Culture nvarchar(100)						--当前文化


AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==如果提供的 @PageDirectoryName 为空，说明我们希望返回的是首页的 Template 名字，这时，我们需要查获首页的 PageDirectoryName
--====================================================================================
IF (LEN(RTRIM(LTRIM(@PageDirectoryName)))=0)

BEGIN
	SELECT @PageDirectoryName=pd.[Name] FROM dbo.PageDirectory pd WHERE pd.Home=1
END

--====================================================================================
--==最后，返回当前 @PageDirectoryName 对应的 PageDirectory 在指定 @Culture 下的 PageDirectoryContent 中的 Template 名
--====================================================================================
SELECT 

	pdc.Template AS Template

FROM dbo.PageDirectoryContent pdc
LEFT JOIN dbo.PageDirectory pd ON pd.[ID]=pdc.PageDirectoryID

WHERE pd.[Name]=@PageDirectoryName AND pdc.[Culture]=@Culture

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeTemplateGet]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeOrder    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeOrder]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeOrder]
GO

--====================================================================================
--==将指定 MainDirectory, SubDirectory, PageDirectory, Knowledge 进行上移/下移
--==原理：
--==1. 首先将给定知识条目的上级知识条目下的所有条目都选出来（获得全部兄弟条目）（当然按 Serial 排序）
--==2. 将它们的 Serial 重新建立（从 1 开始累加），这样，可以去掉其中的漏洞
--==如果是上移
--==3. 找到指定条目，以及它的前面的条目（Serial 比它小 1 的条目 -  我们上面已经重建了 Serial）
--==4. 将指定条目的 Serial -1 ， 前方条目的 Serial +1 
--==如果是下移
--==3. 找到指定条目，以及它的后面的条目（Serial 比它大 1 的条目 -  我们上面已经重建了 Serial）
--==4. 将指定条目的 Serial +1 ，后方条目的 Serial -1 
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-12-30
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeOrder

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@KnowledgeDirectory nvarchar(100),		--将被上移/下移的 Knowledge  条目的的 Directory
@KnowledgeItem int,				--将被上移/下移的 Knowledge  条目的 ID
@Action int					--上移还是下移  （上移是 -1； 下移是 +1）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,@KnowledgeDirectory,@KnowledgeItem,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==公用变量 ID, Serial, NewSerial, GivenItemNewSerial, ParentID 
--=====================================================
DECLARE @ID INT, @Serial INT, @NewSerial INT,  @GivenItemNewSerial INT, @ParentID INT, @OverviewID INT
SET @NewSerial=1

--=====================================================
--==分 KnowledgeDirectory 不同进行处理
--=====================================================

IF LOWER(RTRIM(LTRIM(@KnowledgeDirectory)))=LOWER(N'MainDirectory')

	BEGIN

		--=====================================================
		--==使用 CURSOR 重新建立 Serial （去掉原来 Serial 中的漏洞）
		--=====================================================
		DECLARE MainDirectoryCursor CURSOR FOR SELECT [ID], Serial FROM dbo.MainDirectory  ORDER BY Serial

		OPEN MainDirectoryCursor
		FETCH NEXT FROM MainDirectoryCursor  INTO @ID,@Serial

		WHILE @@FETCH_STATUS = 0
		BEGIN
			UPDATE dbo.MainDirectory SET Serial=@NewSerial WHERE [ID]=@ID
			SET @NewSerial=@NewSerial+1
			FETCH NEXT FROM MainDirectoryCursor  INTO @ID,@Serial
		END

		CLOSE MainDirectoryCursor
		DEALLOCATE MainDirectoryCursor

		--=====================================================
		--==获得指定项目的 Serial
		--=====================================================
		SELECT @GivenItemNewSerial=Serial FROM dbo.MainDirectory WHERE [ID]=@KnowledgeItem

		--=====================================================
		--==根据是上移还是下移，处理相邻的两个条目
		--=====================================================
		IF @Action=-1
			BEGIN
				--=====================================================
				--==将指定项目的 Serial -1，而它前面的项目的 Serial + 1
				--=====================================================
				UPDATE dbo.MainDirectory SET Serial=Serial+1 WHERE [ID]=(Select [ID] From dbo.MainDirectory Where Serial=@GivenItemNewSerial-1)
				UPDATE dbo.MainDirectory SET Serial=Serial-1 WHERE [ID]=@KnowledgeItem
			END
		ELSE
			BEGIN
				--=====================================================
				--==将指定项目的 Serial + 1，而它后面的项目的 Serial - 1
				--=====================================================
				UPDATE dbo.MainDirectory SET Serial=Serial-1 WHERE [ID]=(Select [ID] From dbo.MainDirectory Where Serial=@GivenItemNewSerial+1)
				UPDATE dbo.MainDirectory SET Serial=Serial+1 WHERE [ID]=@KnowledgeItem
			END
	END

ELSE IF LOWER(RTRIM(LTRIM(@KnowledgeDirectory)))=LOWER(N'SubDirectory')

	BEGIN
		--=====================================================
		--==首先获得当前条目的父条目 ID （下面要用）
		--=====================================================
		SELECT @ParentID=MainDirectoryID FROM dbo.SubDirectory WHERE [ID]=@KnowledgeItem
		
		--=====================================================
		--==使用 CURSOR 重新建立 Serial （去掉原来 Serial 中的漏洞）
		--=====================================================
		DECLARE SubDirectoryCursor CURSOR FOR SELECT [ID], Serial FROM dbo.SubDirectory WHERE MainDirectoryID=@ParentID   ORDER BY Serial

		OPEN SubDirectoryCursor
		FETCH NEXT FROM SubDirectoryCursor  INTO @ID,@Serial

		WHILE @@FETCH_STATUS = 0
		BEGIN
			UPDATE dbo.SubDirectory SET Serial=@NewSerial WHERE [ID]=@ID
			SET @NewSerial=@NewSerial+1
			FETCH NEXT FROM SubDirectoryCursor  INTO @ID,@Serial
		END

		CLOSE SubDirectoryCursor
		DEALLOCATE SubDirectoryCursor

		--=====================================================
		--==获得指定项目的 Serial
		--=====================================================
		SELECT @GivenItemNewSerial=Serial FROM dbo.SubDirectory WHERE [ID]=@KnowledgeItem

		--=====================================================
		--==根据是上移还是下移，处理相邻的两个条目
		--=====================================================
		IF @Action=-1
			BEGIN
				--=====================================================
				--==将指定项目的 Serial -1，而它前面的项目的 Serial + 1
				--=====================================================
				UPDATE dbo.SubDirectory SET Serial=Serial+1 WHERE [ID]=(Select [ID] From dbo.SubDirectory Where Serial=@GivenItemNewSerial-1 AND  MainDirectoryID=@ParentID)
				UPDATE dbo.SubDirectory SET Serial=Serial-1 WHERE [ID]=@KnowledgeItem
			END
		ELSE
			BEGIN
				--=====================================================
				--==将指定项目的 Serial + 1，而它后面的项目的 Serial - 1
				--=====================================================
				UPDATE dbo.SubDirectory SET Serial=Serial-1 WHERE [ID]=(Select [ID] From dbo.SubDirectory Where Serial=@GivenItemNewSerial+1 AND  MainDirectoryID=@ParentID)
				UPDATE dbo.SubDirectory SET Serial=Serial+1 WHERE [ID]=@KnowledgeItem
			END

		--=====================================================
		--==最后，调用 SP SubDirectorySetOverview ，将当前 MainDirectory 下的 Overview SubDirectory 再设置一遍 Overview （设置 Overview 可以强行对本 MainDirectory 下的 SubDirectory 重新排序，挤掉空隙，同时避免 Overview 项目的 Serial 被超越）
		--=====================================================
		IF EXISTS (Select [ID] From dbo.SubDirectory WHERE Overview=1 AND MainDirectoryID=@ParentID)
		BEGIN
			SELECT @OverviewID=[ID] FROM dbo.SubDirectory WHERE Overview=1 AND MainDirectoryID=@ParentID
			EXEC dbo.SubDirectorySetOverview @User,@OverviewID	
		END	
	END

ELSE IF LOWER(RTRIM(LTRIM(@KnowledgeDirectory)))=LOWER(N'PageDirectory')

	BEGIN
		--=====================================================
		--==首先获得当前条目的父条目 ID （下面要用）
		--=====================================================
		SELECT @ParentID=SubDirectoryID FROM dbo.PageDirectory WHERE [ID]=@KnowledgeItem
		
		--=====================================================
		--==使用 CURSOR 重新建立 Serial （去掉原来 Serial 中的漏洞）
		--=====================================================
		DECLARE PageDirectoryCursor CURSOR FOR SELECT [ID], Serial FROM dbo.PageDirectory WHERE SubDirectoryID=@ParentID   ORDER BY Serial

		OPEN PageDirectoryCursor
		FETCH NEXT FROM PageDirectoryCursor  INTO @ID,@Serial

		WHILE @@FETCH_STATUS = 0
		BEGIN
			UPDATE dbo.PageDirectory SET Serial=@NewSerial WHERE [ID]=@ID
			SET @NewSerial=@NewSerial+1
			FETCH NEXT FROM PageDirectoryCursor  INTO @ID,@Serial
		END

		CLOSE PageDirectoryCursor
		DEALLOCATE PageDirectoryCursor

		--=====================================================
		--==获得指定项目的 Serial
		--=====================================================
		SELECT @GivenItemNewSerial=Serial FROM dbo.PageDirectory WHERE [ID]=@KnowledgeItem

		--=====================================================
		--==根据是上移还是下移，处理相邻的两个条目
		--=====================================================
		IF @Action=-1
			BEGIN
				--=====================================================
				--==将指定项目的 Serial -1，而它前面的项目的 Serial + 1
				--=====================================================
				UPDATE dbo.PageDirectory SET Serial=Serial+1 WHERE [ID]=(Select [ID] From dbo.PageDirectory Where Serial=@GivenItemNewSerial-1 AND  SubDirectoryID=@ParentID)
				UPDATE dbo.PageDirectory SET Serial=Serial-1 WHERE [ID]=@KnowledgeItem
			END
		ELSE
			BEGIN
				--=====================================================
				--==将指定项目的 Serial + 1，而它后面的项目的 Serial - 1
				--=====================================================
				UPDATE dbo.PageDirectory SET Serial=Serial-1 WHERE [ID]=(Select [ID] From dbo.PageDirectory Where Serial=@GivenItemNewSerial+1 AND  SubDirectoryID=@ParentID)
				UPDATE dbo.PageDirectory SET Serial=Serial+1 WHERE [ID]=@KnowledgeItem
			END

		--=====================================================
		--==最后，调用 SP PageDirectorySetOverview ，将当前 SubDirectory 下的 Overview PageDirectory 再设置一遍 Overview （设置 Overview 可以强行对本 SubDirectory 下的 PageDirectory 重新排序，挤掉空隙，同时避免 Overview 项目的 Serial 被超越）
		--=====================================================
		IF EXISTS (Select [ID] From dbo.PageDirectory WHERE Overview=1 AND SubDirectoryID=@ParentID)
		BEGIN
			SELECT @OverviewID=[ID] FROM dbo.PageDirectory WHERE Overview=1 AND SubDirectoryID=@ParentID
			EXEC dbo.PageDirectorySetOverview @User,@OverviewID	
		END	
	END

ELSE IF LOWER(RTRIM(LTRIM(@KnowledgeDirectory)))=LOWER(N'Knowledge')

	BEGIN
		--=====================================================
		--==首先获得当前条目的父条目 ID （下面要用）
		--=====================================================
		SELECT @ParentID=PageDirectoryID FROM dbo.Knowledge WHERE [ID]=@KnowledgeItem
		
		--=====================================================
		--==使用 CURSOR 重新建立 Serial （去掉原来 Serial 中的漏洞）
		--=====================================================
		DECLARE KnowledgeCursor CURSOR FOR SELECT [ID], Serial FROM dbo.Knowledge WHERE PageDirectoryID=@ParentID   ORDER BY Serial

		OPEN KnowledgeCursor
		FETCH NEXT FROM KnowledgeCursor  INTO @ID,@Serial

		WHILE @@FETCH_STATUS = 0
		BEGIN
			UPDATE dbo.Knowledge SET Serial=@NewSerial WHERE [ID]=@ID
			SET @NewSerial=@NewSerial+1
			FETCH NEXT FROM KnowledgeCursor  INTO @ID,@Serial
		END

		CLOSE KnowledgeCursor
		DEALLOCATE KnowledgeCursor

		--=====================================================
		--==获得指定项目的 Serial
		--=====================================================
		SELECT @GivenItemNewSerial=Serial FROM dbo.Knowledge WHERE [ID]=@KnowledgeItem

		--=====================================================
		--==根据是上移还是下移，处理相邻的两个条目
		--=====================================================
		IF @Action=-1
			BEGIN
				--=====================================================
				--==将指定项目的 Serial -1，而它前面的项目的 Serial + 1
				--=====================================================
				UPDATE dbo.Knowledge SET Serial=Serial+1 WHERE [ID]=(Select [ID] From dbo.Knowledge Where Serial=@GivenItemNewSerial-1 AND  PageDirectoryID=@ParentID)
				UPDATE dbo.Knowledge SET Serial=Serial-1 WHERE [ID]=@KnowledgeItem
			END
		ELSE
			BEGIN
				--=====================================================
				--==将指定项目的 Serial + 1，而它后面的项目的 Serial - 1
				--=====================================================
				UPDATE dbo.Knowledge SET Serial=Serial-1 WHERE [ID]=(Select [ID] From dbo.Knowledge Where Serial=@GivenItemNewSerial+1 AND  PageDirectoryID=@ParentID)
				UPDATE dbo.Knowledge SET Serial=Serial+1 WHERE [ID]=@KnowledgeItem
			END
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeOrder]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.CommunityOrder    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CommunityOrder]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CommunityOrder]
GO

--====================================================================================
--==将指定 Community, Forum 进行上移/下移
--==原理：
--==1. 首先将给定 Community / Forum 条目的上级知识条目下的所有条目都选出来（获得全部兄弟条目）（当然按 Serial 排序）
--==2. 将它们的 Serial 重新建立（从 1 开始累加），这样，可以去掉其中的漏洞
--==如果是上移
--==3. 找到指定条目，以及它的前面的条目（Serial 比它小 1 的条目 -  我们上面已经重建了 Serial）
--==4. 将指定条目的 Serial -1 ， 前方条目的 Serial +1 
--==如果是下移
--==3. 找到指定条目，以及它的后面的条目（Serial 比它大 1 的条目 -  我们上面已经重建了 Serial）
--==4. 将指定条目的 Serial +1 ，后方条目的 Serial -1 
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28 
--====================================================================================

CREATE PROCEDURE dbo.CommunityOrder

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@CommunityDirectory nvarchar(100),		--将被上移/下移的 Community/Forum  条目的的 Directory
@CommunityItem int,				--将被上移/下移的 Community/Forum  条目的 ID
@Action int					--上移还是下移  （上移是 -1； 下移是 +1）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==公用变量 ID, Serial, NewSerial, GivenItemNewSerial, ParentID 
--=====================================================
DECLARE @ID INT, @Serial INT, @NewSerial INT,  @GivenItemNewSerial INT, @ParentID INT
SET @NewSerial=1

--=====================================================
--==分 CommunityDirectory 不同进行处理
--=====================================================

IF LOWER(RTRIM(LTRIM(@CommunityDirectory)))=LOWER(N'Community')

	BEGIN

		--=====================================================
		--==使用 CURSOR 重新建立 Serial （去掉原来 Serial 中的漏洞）
		--=====================================================
		DECLARE CommunityCursor CURSOR FOR SELECT [ID], Serial FROM dbo.Community  ORDER BY Serial

		OPEN CommunityCursor
		FETCH NEXT FROM CommunityCursor  INTO @ID,@Serial

		WHILE @@FETCH_STATUS = 0
		BEGIN
			UPDATE dbo.Community SET Serial=@NewSerial WHERE [ID]=@ID
			SET @NewSerial=@NewSerial+1
			FETCH NEXT FROM CommunityCursor  INTO @ID,@Serial
		END

		CLOSE CommunityCursor
		DEALLOCATE CommunityCursor

		--=====================================================
		--==获得指定项目的 Serial
		--=====================================================
		SELECT @GivenItemNewSerial=Serial FROM dbo.Community WHERE [ID]=@CommunityItem

		--=====================================================
		--==根据是上移还是下移，处理相邻的两个条目
		--=====================================================
		IF @Action=-1
			BEGIN
				--=====================================================
				--==将指定项目的 Serial -1，而它前面的项目的 Serial + 1
				--=====================================================
				UPDATE dbo.Community SET Serial=Serial+1 WHERE [ID]=(Select [ID] From dbo.Community Where Serial=@GivenItemNewSerial-1)
				UPDATE dbo.Community SET Serial=Serial-1 WHERE [ID]=@CommunityItem
			END
		ELSE
			BEGIN
				--=====================================================
				--==将指定项目的 Serial + 1，而它后面的项目的 Serial - 1
				--=====================================================
				UPDATE dbo.Community SET Serial=Serial-1 WHERE [ID]=(Select [ID] From dbo.Community Where Serial=@GivenItemNewSerial+1)
				UPDATE dbo.Community SET Serial=Serial+1 WHERE [ID]=@CommunityItem
			END
	END

ELSE IF LOWER(RTRIM(LTRIM(@CommunityDirectory)))=LOWER(N'Forum')

	BEGIN
		--=====================================================
		--==首先获得当前条目的父条目 ID （下面要用）
		--=====================================================
		SELECT @ParentID=CommunityID FROM dbo.Forum WHERE [ID]=@CommunityItem
		
		--=====================================================
		--==使用 CURSOR 重新建立 Serial （去掉原来 Serial 中的漏洞）
		--=====================================================
		DECLARE ForumCursor CURSOR FOR SELECT [ID], Serial FROM dbo.Forum  WHERE CommunityID=@ParentID   ORDER BY Serial

		OPEN ForumCursor
		FETCH NEXT FROM ForumCursor  INTO @ID,@Serial

		WHILE @@FETCH_STATUS = 0
		BEGIN
			UPDATE dbo.Forum SET Serial=@NewSerial WHERE [ID]=@ID
			SET @NewSerial=@NewSerial+1
			FETCH NEXT FROM ForumCursor  INTO @ID,@Serial
		END

		CLOSE ForumCursor
		DEALLOCATE ForumCursor

		--=====================================================
		--==获得指定项目的 Serial
		--=====================================================
		SELECT @GivenItemNewSerial=Serial FROM dbo.Forum WHERE [ID]=@CommunityItem

		--=====================================================
		--==根据是上移还是下移，处理相邻的两个条目
		--=====================================================
		IF @Action=-1
			BEGIN
				--=====================================================
				--==将指定项目的 Serial -1，而它前面的项目的 Serial + 1
				--=====================================================
				UPDATE dbo.Forum SET Serial=Serial+1 WHERE [ID]=(Select [ID] From dbo.Forum Where Serial=@GivenItemNewSerial-1 AND  CommunityID=@ParentID)
				UPDATE dbo.Forum SET Serial=Serial-1 WHERE [ID]=@CommunityItem
			END
		ELSE
			BEGIN
				--=====================================================
				--==将指定项目的 Serial + 1，而它后面的项目的 Serial - 1
				--=====================================================
				UPDATE dbo.Forum SET Serial=Serial-1 WHERE [ID]=(Select [ID] From dbo.Forum Where Serial=@GivenItemNewSerial+1 AND  CommunityID=@ParentID)
				UPDATE dbo.Forum SET Serial=Serial+1 WHERE [ID]=@CommunityItem
			END
	END



--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[CommunityOrder]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.SeaParameterSave    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SeaParameterSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SeaParameterSave]
GO

--====================================================================================
--==保存 SeaParameter 中的 GoogleVerification, YahooVerification, GoogleAnalyticsCode  参数
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28 
--====================================================================================

CREATE PROCEDURE dbo.SeaParameterSave

@User nvarchar(50),					--从 ASPX 端传递过来的当前用户名

@GoogleVerification nvarchar(2000),			--参数 GoogleVerification 的值
@YahooVerification nvarchar(2000),			--参数 YahooVerification 的值
@GoogleAnalyticsCode nvarchar(2000)			--参数 GoogleAnalyticsCode 的值

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==更新 GoogleVerification （有则改之，无则添加）
--=====================================================
IF (@GoogleVerification<>NULL) AND (@GoogleVerification IS NOT NULL)

BEGIN
	IF NOT EXISTS (Select [Value] From dbo.SeaParameter Where [Parameter]=N'GoogleVerification')

		BEGIN
			INSERT INTO dbo.SeaParameter ([ID],[Parameter],[Value]) VALUES (1,N'GoogleVerification',@GoogleVerification)
		END
	ELSE
		BEGIN
			UPDATE dbo.SeaParameter SET [Value]=@GoogleVerification WHERE [Parameter]=N'GoogleVerification'
		END
END

--=====================================================
--==更新 YahooVerification （有则改之，无则添加）
--=====================================================
IF (@YahooVerification<>NULL) AND (@YahooVerification IS NOT NULL)

BEGIN
	IF NOT EXISTS (Select [Value] From dbo.SeaParameter Where [Parameter]=N'YahooVerification')

		BEGIN
			INSERT INTO dbo.SeaParameter ([ID],[Parameter],[Value]) VALUES (2,N'YahooVerification',@YahooVerification)
		END
	ELSE
		BEGIN
			UPDATE dbo.SeaParameter SET [Value]=@YahooVerification WHERE [Parameter]=N'YahooVerification'
		END
END

--=====================================================
--==更新 GoogleAnalyticsCode （有则改之，无则添加）
--=====================================================
IF (@GoogleAnalyticsCode<>NULL) AND (@GoogleAnalyticsCode IS NOT NULL)

BEGIN
	IF NOT EXISTS (Select [Value] From dbo.SeaParameter Where [Parameter]=N'GoogleAnalyticsCode')

		BEGIN
			INSERT INTO dbo.SeaParameter ([ID],[Parameter],[Value]) VALUES (3,N'GoogleAnalyticsCode',@GoogleAnalyticsCode)
		END
	ELSE
		BEGIN
			UPDATE dbo.SeaParameter SET [Value]=@GoogleAnalyticsCode WHERE [Parameter]=N'GoogleAnalyticsCode'
		END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[SeaParameterSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.SeaParameterSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SeaParameterSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SeaParameterSelect]
GO

--====================================================================================
--==返回 SeaParameter 中的 GoogleVerification, YahooVerification 参数
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28 
--====================================================================================

CREATE PROCEDURE dbo.SeaParameterSelect

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查（不用，因为我们使用 BultinConnectionString）
--=====================================================


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==选取
--=====================================================
SELECT * FROM dbo.SeaParameter

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[SeaParameterSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ContentExistsUnderMainDirectory    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ContentExistsUnderMainDirectory]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ContentExistsUnderMainDirectory]
GO

--====================================================================================
--==当前文化下，指定 MainDirectory 项目下是否存在 Content
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28
--==该 SP 目前已没有实际用处，可以删除了 
--====================================================================================

CREATE PROCEDURE dbo.ContentExistsUnderMainDirectory

@Culture nvarchar(50),		--当前文化
@Item INT,			--指定的 MainDirectory  项目的 ID
@oExists INT OUT		--输出参数：存在返回 1，否则 0

AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--==========================================
--==先假设不存在
--==========================================
SET @oExists=0

--==========================================
--==是否存在
--==========================================
IF EXISTS (SELECT nowc.[ID] FROM dbo.KnowledgeContent nowc WHERE nowc.KnowledgeID IN (Select now.[ID] From dbo.Knowledge now Where now.PageDirectoryID In (select pd.[ID] from dbo.PageDirectory pd where pd.SubDirectoryID in (select sd.[ID] from dbo.SubDirectory sd where sd.MainDirectoryID=@Item))) AND nowc.Culture=@Culture AND LEN(LTRIM(RTRIM(CONVERT(NVARCHAR(4000),nowc.Content))))>0)
BEGIN
	SET @oExists=1
END

--==========================================
--==返回
--==========================================
RETURN

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ContentExistsUnderMainDirectory]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ContentExistsUnderSubDirectory    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ContentExistsUnderSubDirectory]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ContentExistsUnderSubDirectory]
GO

--====================================================================================
--==当前文化下，指定 SubDirectory 项目下是否存在 Content
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28
--==该 SP 目前已没有实际用处，可以删除了 
--====================================================================================

CREATE PROCEDURE dbo.ContentExistsUnderSubDirectory

@Culture nvarchar(50),		--当前文化
@Item INT,			--指定的 SubDirectory  项目的 ID
@oExists INT OUT		--输出参数：存在返回 1，否则 0

AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--==========================================
--==先假设不存在
--==========================================
SET @oExists=0

--==========================================
--==是否存在
--==========================================
IF EXISTS (SELECT nowc.[ID] FROM dbo.KnowledgeContent nowc WHERE nowc.KnowledgeID IN (Select now.[ID] From dbo.Knowledge now Where now.PageDirectoryID In (select pd.[ID] from dbo.PageDirectory pd where pd.SubDirectoryID=@Item)) AND nowc.Culture=@Culture AND LEN(LTRIM(RTRIM(CONVERT(NVARCHAR(4000),nowc.Content))))>0)
BEGIN
	SET @oExists=1
END

--==========================================
--==返回
--==========================================
RETURN

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ContentExistsUnderSubDirectory]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ContentExistsUnderPageDirectory    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ContentExistsUnderPageDirectory]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ContentExistsUnderPageDirectory]
GO

--====================================================================================
--==当前文化下，指定 PageDirectory 项目下是否存在 Content
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28
--==该 SP 目前已没有实际用处，可以删除了 
--====================================================================================

CREATE PROCEDURE dbo.ContentExistsUnderPageDirectory

@Culture nvarchar(50),		--当前文化
@Item INT,			--指定的 PageDirectory  项目的 ID
@oExists INT OUT		--输出参数：存在返回 1，否则 0

AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--==========================================
--==先假设不存在
--==========================================
SET @oExists=0

--==========================================
--==是否存在
--==========================================
IF EXISTS (SELECT nowc.[ID] FROM dbo.KnowledgeContent nowc WHERE nowc.KnowledgeID IN (Select now.[ID] From dbo.Knowledge now Where now.PageDirectoryID=@Item) AND nowc.Culture=@Culture AND LEN(LTRIM(RTRIM(CONVERT(NVARCHAR(4000),nowc.Content))))>0)
BEGIN
	SET @oExists=1
END

--==========================================
--==返回
--==========================================
RETURN

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ContentExistsUnderPageDirectory]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeRelative    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeRelative]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeRelative]
GO

--====================================================================================
--==给出 Tag（可能是 “,” 隔开的多 Tag 列表），从全站所有内容中寻找关联的内容
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-09-06
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeRelative

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名

@KnowledgeContentID int,					--当前 KnowledgeContent  的 ID （我们返回 KnowledgeRelative 的时候，要排除当前 KnowledgeContent 自己）
@Tag nvarchar(500),						--使用的 Tag （进行过滤）
@Culture nvarchar(100)						--当前文化


AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==从 Option 表返回 KnowledgeApprove 属性
--====================================================================================
DECLARE @KnowledgeApprove NVARCHAR(50)
SELECT @KnowledgeApprove=CONVERT(NVARCHAR(50),opt.[Value]) FROM dbo.[Option] opt WHERE opt.[Key]=N'KnowledgeApprove'

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

IF dbo.UDF_UserAdminEditor(@User)=1     

BEGIN
	--===========================================
	--==如果当前用户《是》 Admin Editor
	--===========================================
	SELECT DISTINCT TOP 5
		
		pd.[Name] AS PageDirectoryName,
		now.UpdateTime AS UpdateTime,
		nowc.KnowledgeID AS KnowledgeID,
		nowc.Culture AS Culture,
		nowc.Title AS Title
	
	FROM dbo.UDF_PublicSplit(@Tag,N',') tag
	LEFT JOIN dbo.KnowledgeTags nowt on tag.Element=nowt.Tag
	LEFT JOIN dbo.KnowledgeContent nowc on nowc.[ID]=nowt.KnowledgeContentID
	LEFT JOIN dbo.Knowledge now on now.[ID]=nowc.KnowledgeID
	LEFT JOIN dbo.PageDirectory pd on pd.[ID]=now.PageDirectoryID
	
	WHERE nowc.[ID]<>@KnowledgeContentID AND nowc.Culture=@Culture 

	ORDER BY UpdateTime

END

ELSE

BEGIN
	--===========================================
	--==如果当前用户《不是》 Admin Editor
	--===========================================
	SELECT DISTINCT TOP 5
		
		pd.[Name] AS PageDirectoryName,
		now.UpdateTime AS UpdateTime,
		nowc.KnowledgeID AS KnowledgeID,
		nowc.Culture AS Culture,
		nowc.Title AS Title
	
	FROM dbo.UDF_PublicSplit(@Tag,N',') tag
	LEFT JOIN dbo.KnowledgeTags nowt on tag.Element=nowt.Tag
	LEFT JOIN dbo.KnowledgeContent nowc on nowc.[ID]=nowt.KnowledgeContentID
	LEFT JOIN dbo.Knowledge now on now.[ID]=nowc.KnowledgeID
	LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]
	LEFT JOIN dbo.PageDirectory pd on pd.[ID]=now.PageDirectoryID
	
	WHERE nowc.[ID]<>@KnowledgeContentID AND nowc.Culture=@Culture AND (REPLACE(nowp.DedicatedTo,N',',N'')=N''  or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)  AND  nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N'false')
	
	--WHERE nowc.[ID]<>@KnowledgeContentID AND nowc.Culture=@Culture AND (RTRIM(LTRIM(CONVERT(NVARCHAR(4000),now.DedicatedTo)))=N'' or now.DedicatedTo is NULL or RTRIM(LTRIM(CONVERT(NVARCHAR(4000),now.DedicatedTo)))=N'*' or dbo.UDF_UserDedicatedTo(@User,CONVERT(NVARCHAR(4000),now.DedicatedTo))=1)  AND dbo.UDF_UserAdminEditor(@User)<>1 AND  nowc.Hidden<>1
	--WHERE nowc.[ID]<>@KnowledgeContentID AND nowc.Culture=@Culture AND (RTRIM(LTRIM(CONVERT(NVARCHAR(4000),now.DedicatedTo)))=N'' or now.DedicatedTo is NULL or RTRIM(LTRIM(CONVERT(NVARCHAR(4000),now.DedicatedTo)))=N'*' or dbo.UDF_UserDedicatedTo(@User,CONVERT(NVARCHAR(4000),now.DedicatedTo))=1)  AND dbo.UDF_UserClient(@User)=1 AND dbo.UDF_UserAdmin(@User)<>1 AND  nowc.Hidden<>1

	ORDER BY UpdateTime

END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeRelative]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PublicTableColumnCharacterMaximumLength    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PublicTableColumnCharacterMaximumLength]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PublicTableColumnCharacterMaximumLength]
GO

--====================================================================================
--==获取指定表的指定列的数据定义长度
--==一般用来获得某个表的某个文本类型列的数据长度，为了在 ASPX 端对数据进行长度检测（防止超长）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2008-10-28 
--====================================================================================

CREATE PROCEDURE dbo.PublicTableColumnCharacterMaximumLength

@TableName nvarchar(128), 			--指定表
@ColumnName nvarchar(128),			--指定列

@ReturnValue int OUT				--返回值

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==获得
--====================================================================================
SELECT

	@ReturnValue=CHARACTER_MAXIMUM_LENGTH 

FROM INFORMATION_SCHEMA.[COLUMNS] 

WHERE TABLE_NAME=@TableName AND COLUMN_NAME=@ColumnName

--====================================================================================
--==返回
--====================================================================================
RETURN @ReturnValue
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PublicTableColumnCharacterMaximumLength]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.OptionSelectByCat    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[OptionSelectByCat]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[OptionSelectByCat]
GO

--====================================================================================
--==获取 Option 表指定 Cat 下的所有记录 （当前 Culture 下）
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-04-12  
--====================================================================================

CREATE PROCEDURE dbo.OptionSelectByCat

@Culture nvarchar(100), 			--当前文化
@Cat nvarchar(100)			--指定 Cat

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==首先，我们对给定的 Culture 进行检查，看看 OptionContent 中是否包含该 Culture，如果不包含，我们强迫 @Culture 使用默认的 en-us，防止用户使用不支持的界面语言进入系统管理 | 系统选项
--====================================================================================
IF NOT EXISTS (Select opc.[ID] From dbo.OptionContent opc Where opc.Culture=@Culture)
BEGIN
	SELECT @Culture=N'en-us'
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==返回所有 Option 记录，Join 当前文化下的 OptionContent 记录
--====================================================================================
SELECT 

	opt.[ID] AS [ID],
	opt.Cat AS Cat,
	opt.RightIndent AS RightIndent,
	opt.[Key] AS [Key],
	opt.Value AS Value,
	opt.Legend AS Legend,
	opt.NumberOnly AS NumberOnly,
	opt.TextArea AS TextArea,
	opt.MultiCulture AS MultiCulture,
	opt.ForTheme AS ForTheme,
	opt.Validation AS Validation,
	opc.Title AS Title,
	opc.CatTitle AS CatTitle,
	opc.[Description] As [Description]

FROM dbo.[Option] opt 
LEFT JOIN dbo.OptionContent opc ON opc.OptionID=opt.[ID]

WHERE opc.Culture=@Culture AND opt.Cat=@Cat

ORDER BY opt.[ID]

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[OptionSelectByCat]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PageDirectorySetOverview    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PageDirectorySetOverview]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PageDirectorySetOverview]
GO

--====================================================================================
--==将指定 PageDirectory 项目的 Overview 属性设置为 true
--==需要首先将指定 PageDirectory 的所有兄弟项目 (同一个 SubDirectory 下) 的 Overview 属性设置为 false
--==接着，将所有兄弟项目从 2 开始按原先次序重新配置 Serial
--==最后，将指定 PageDirectory 的 Serial 设置为 1 并将其 Overview 设置为 true
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-12-30
--====================================================================================

CREATE PROCEDURE dbo.PageDirectorySetOverview

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@PageDirectoryID int			--当前 PageDirectory 的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'PageDirectory',@PageDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==首先根据当前 @PageDirectoryID 获得对应的 SubDirectoryID
--=====================================================
DECLARE @SubDirectoryID INT
SELECT @SubDirectoryID=SubDirectoryID FROM dbo.PageDirectory WHERE [ID]=@PageDirectoryID

--=====================================================
--==将当前 SubDirectoryID 下的所有 PageDirectory 中可能的 Overview 属性去掉
--=====================================================
UPDATE dbo.PageDirectory SET Overview=0 WHERE SubDirectoryID=@SubDirectoryID AND Overview=1

--=====================================================
--==将当前 SubDirectoryID 下的所有 PageDirectory 重新排序（根据原先的 Serial），从2开始
--=====================================================
DECLARE @CursorID INT
DECLARE @CursorSerial INT
DECLARE @NewSerial INT
SET @NewSerial=2

DECLARE PageDirectoryCursor CURSOR FOR SELECT [ID], Serial FROM dbo.PageDirectory WHERE SubDirectoryID=@SubDirectoryID ORDER BY Serial
	
OPEN PageDirectoryCursor
FETCH NEXT FROM PageDirectoryCursor  INTO @CursorID,@CursorSerial

WHILE @@FETCH_STATUS = 0
BEGIN
	UPDATE dbo.PageDirectory SET Serial=@NewSerial WHERE [ID]=@CursorID
	SET @NewSerial=@NewSerial+1
	FETCH NEXT FROM PageDirectoryCursor  INTO @CursorID,@CursorSerial
END

CLOSE PageDirectoryCursor
DEALLOCATE PageDirectoryCursor

--=====================================================
--==最后，将当前被指定 Overview=true 的 PageDirectory 的 Serial 设置为 1
--=====================================================
UPDATE dbo.PageDirectory SET Serial=1, Overview=1  WHERE [ID]=@PageDirectoryID

--=====================================================
--==再来一遍，从 1 开始，以便挤掉空隙
--=====================================================
SET @NewSerial=1

DECLARE PageDirectoryCursor CURSOR FOR SELECT [ID], Serial FROM dbo.PageDirectory WHERE SubDirectoryID=@SubDirectoryID ORDER BY Serial
	
OPEN PageDirectoryCursor
FETCH NEXT FROM PageDirectoryCursor  INTO @CursorID,@CursorSerial

WHILE @@FETCH_STATUS = 0
BEGIN
	UPDATE dbo.PageDirectory SET Serial=@NewSerial WHERE [ID]=@CursorID
	SET @NewSerial=@NewSerial+1
	FETCH NEXT FROM PageDirectoryCursor  INTO @CursorID,@CursorSerial
END

CLOSE PageDirectoryCursor
DEALLOCATE PageDirectoryCursor

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（修改了页目录）
--==暂不启用（因为 PageDirectoryModify 会调用本 SP，会导致重复）
--=====================================================
--EXEC dbo.SiteLogSave @User, 12, @PageDirectoryID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PageDirectorySetOverview]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.SubDirectorySetOverview    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SubDirectorySetOverview]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SubDirectorySetOverview]
GO

--====================================================================================
--==将指定 SubDirectory 项目的 Overview 属性设置为 true
--==需要首先将指定 SubDirectory 的所有兄弟项目 (同一个 MainDirectory 下) 的 Overview 属性设置为 false
--==接着，将所有兄弟项目从 2 开始按原先次序重新配置 Serial
--==最后，将指定 SubDirectory 的 Serial 设置为 1 并将其 Overview 设置为 true
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-12-30
--====================================================================================

CREATE PROCEDURE dbo.SubDirectorySetOverview

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@SubDirectoryID int			--当前 SubDirectory 的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'SubDirectory',@SubDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==首先根据当前 @SubDirectoryID 获得对应的 MainDirectoryID
--=====================================================
DECLARE @MainDirectoryID INT
SELECT @MainDirectoryID=MainDirectoryID FROM dbo.SubDirectory WHERE [ID]=@SubDirectoryID

--=====================================================
--==将当前 MainDirectoryID 下的所有 SubDirectory 中可能的 Overview 属性去掉
--=====================================================
UPDATE dbo.SubDirectory SET Overview=0 WHERE MainDirectoryID=@MainDirectoryID AND Overview=1

--=====================================================
--==将当前 MainDirectoryID 下的所有 SubDirectory 重新排序（根据原先的 Serial），从2 开始
--=====================================================
DECLARE @CursorID INT
DECLARE @CursorSerial INT
DECLARE @NewSerial INT
SET @NewSerial=2

DECLARE SubDirectoryCursor CURSOR FOR SELECT [ID], Serial FROM dbo.SubDirectory WHERE MainDirectoryID=@MainDirectoryID ORDER BY Serial
	
OPEN SubDirectoryCursor
FETCH NEXT FROM SubDirectoryCursor  INTO @CursorID,@CursorSerial

WHILE @@FETCH_STATUS = 0
BEGIN
	UPDATE dbo.SubDirectory SET Serial=@NewSerial WHERE [ID]=@CursorID
	SET @NewSerial=@NewSerial+1
	FETCH NEXT FROM SubDirectoryCursor  INTO @CursorID,@CursorSerial
END

CLOSE SubDirectoryCursor
DEALLOCATE SubDirectoryCursor

--=====================================================
--==最后，将当前被指定 Overview=true 的 SubDirectory 的 Serial 设置为 1
--=====================================================
UPDATE dbo.SubDirectory SET Serial=1, Overview=1  WHERE [ID]=@SubDirectoryID

--=====================================================
--==再来一遍，从 1 开始，以便挤掉空隙
--=====================================================
SET @NewSerial=1

DECLARE SubDirectoryCursor CURSOR FOR SELECT [ID], Serial FROM dbo.SubDirectory WHERE MainDirectoryID=@MainDirectoryID ORDER BY Serial
	
OPEN SubDirectoryCursor
FETCH NEXT FROM SubDirectoryCursor  INTO @CursorID,@CursorSerial

WHILE @@FETCH_STATUS = 0
BEGIN
	UPDATE dbo.SubDirectory SET Serial=@NewSerial WHERE [ID]=@CursorID
	SET @NewSerial=@NewSerial+1
	FETCH NEXT FROM SubDirectoryCursor  INTO @CursorID,@CursorSerial
END

CLOSE SubDirectoryCursor
DEALLOCATE SubDirectoryCursor

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（修改了子目录）
--==暂不启用（因为 SubDirectoryModify 会调用本 SP，这样会导致重复记录）
--=====================================================
--EXEC dbo.SiteLogSave @User, 11, @SubDirectoryID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[SubDirectorySetOverview]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.MenuMainDirectorySubDirectoryPageDirectory    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MenuMainDirectorySubDirectoryPageDirectory]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[MenuMainDirectorySubDirectoryPageDirectory]
GO

--====================================================================================
--==给定当前 ASPX 端的用户，返回该用户权限范围内的所有 MainDirectory, SubDirectory, PageDirectory 记录，以便在 ASPX 端构造菜单系统
--==返回的 MainDirectory, SubDirectory, PageDirectory 将被送入 DataSet 并为这三个表建立级联关系
--==注意：我们需要根据 Option.MainMenuAlign 决定输出 MainDirectory 记录的时候使用正序还是倒序 （因为 aspx  端构造导航的时候，如果右对齐，会引起显示次序取反）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-22
--====================================================================================

CREATE PROCEDURE dbo.MenuMainDirectorySubDirectoryPageDirectory

@User nvarchar(50),				--从 ASPX 端传递过来的用户名 （我们使用 Table 级用户系统）
@Culture nvarchar(100)				--当前文化


AS 

--====================================================
--==首先返回 Option 中 MainMenuAlign 的值，后面要根据这个值改变 MainDirectory 选取时的 Order by 条件
--====================================================
DECLARE @MainMenuAlign NVARCHAR(10)
SELECT @MainMenuAlign=CONVERT(NVARCHAR(10),ISNULL(opt.[Value],N'1')) FROM dbo.[Option] opt WHERE opt.[Key]=N'MainMenuAlign'

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
--分当前用户是 Admin Editor ； 还是普通用户两种情形。前者返回全部记录，后者返回符合权限的记录
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
  
IF  dbo.UDF_UserAdminEditor(@User)=1 

BEGIN

	--====================================================
	--==返回全部 MainDirectory
	--====================================================
	SELECT

		N'MainDirectory' AS KnowledgeDirectory,
		md.[ID] AS [ID],
		md.Serial AS Serial,
		md.[Name] AS [Name],
		ISNULL(md.NewWindow,0) AS NewWindow,
		ISNULL(md.[System],0) AS [System],
		ISNULL(mdc.Hidden,0) AS Hidden,
		ISNULL(mdc.HiddenInNavigationOnly,0) AS HiddenInNavigationOnly,
		--CASE WHEN EXISTS (SELECT inowc.[ID] FROM dbo.KnowledgeContent inowc WHERE inowc.KnowledgeID IN (Select inow.[ID] From dbo.Knowledge inow Where inow.PageDirectoryID In (select ipd.[ID] from dbo.PageDirectory ipd where ipd.SubDirectoryID in (select isd.[ID] from dbo.SubDirectory isd where isd.MainDirectoryID=md.[ID]))) AND inowc.Culture=mdc.Culture AND LEN(LTRIM(RTRIM(CONVERT(NVARCHAR(4000),inowc.Content))))>0) THEN N'true' ELSE N'false' END  AS ContentExists,
		md.InActiveMainMenuIconMap AS InActiveMainMenuIconMap,
		md.ActiveMainMenuIconMap AS ActiveMainMenuIconMap,
		md.BannerMap AS BannerMap,
		md.BannerContentLayer AS BannerContentLayer,

		md.Editor AS Editor,
		dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),md.Editor)) AS EditorPermission,

		mdc.Title AS Title,
		mdc.[Description] AS [Description],

		mdc.Url AS Url,
		ISNULL(mdc.ThisIsLink,0) AS ThisIsLink,

		mdc.Culture AS Culture

	FROM dbo.MainDirectory md
	LEFT JOIN dbo.MainDirectoryContent mdc ON mdc.MainDirectoryID=md.[ID]  AND mdc.Culture=@Culture

	ORDER BY  CASE @MainMenuAlign WHEN N'1' THEN  Serial  ELSE  -Serial END ASC

	--====================================================
	--==连同（因为记录中有 NTEXT 项，所以使用 UNION ALL ，因为 UNION 是 DISTINCT UNION，不能和 NTEXT  连用）  
	--==如果当前用户是 Admin Editor，则返回全部  
	--====================================================
	SELECT

		N'SubDirectory' AS KnowledgeDirectory,
		sd.[ID] AS [ID],
		sd.MainDirectoryID AS MainDirectoryID,
		sd.Serial AS Serial,
		sd.[Name] AS [Name],
		ISNULL(sd.NewWindow,0) AS NewWindow,
		ISNULL(sdc.Hidden,0) AS Hidden,
		ISNULL(sdc.HiddenInNavigationOnly,0) AS HiddenInNavigationOnly,
		--CASE WHEN EXISTS (SELECT inowc.[ID] FROM dbo.KnowledgeContent inowc WHERE inowc.KnowledgeID IN (Select inow.[ID] From dbo.Knowledge inow Where inow.PageDirectoryID In (select ipd.[ID] from dbo.PageDirectory ipd where ipd.SubDirectoryID=sd.[ID])) AND inowc.Culture=sdc.Culture AND LEN(LTRIM(RTRIM(CONVERT(NVARCHAR(4000),inowc.Content))))>0) THEN N'true' ELSE N'false' END AS ContentExists,
		ISNULL(sd.Overview,0) AS Overview,
		ISNULL(sd.Wizard,0) AS Wizard,


		sd.Editor AS Editor,
		dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),sd.Editor)) AS EditorPermission,

		sdc.Title AS Title,
		sdc.[Description] AS [Description],
		sdc.WizardPreviousTitle AS WizardPreviousTitle,
		sdc.WizardNextTitle AS WizardNextTitle,

		sdc.Url AS Url,
		ISNULL(sdc.ThisIsLink,0) AS ThisIsLink,

		sdc.Culture AS Culture

	FROM dbo.SubDirectory sd
	LEFT JOIN dbo.SubDirectoryContent sdc ON sdc.SubDirectoryID=sd.[ID]  AND sdc.Culture=@Culture

	ORDER BY Serial

	--====================================================
	--==返回全部 PageDirectory 记录
	--==如果当前用户是 Admin Editor，则返回全部
	--====================================================
	SELECT

		N'PageDirectory' AS KnowledgeDirectory,
		pd.[ID] AS [ID],
		pd.SubDirectoryID AS SubDirectoryID,
		pd.Serial AS Serial,
		pd.[Name] AS [Name],
		pd.PageSize AS PageSize,
		ISNULL(pd.NewWindow,0) AS NewWindow,
		ISNULL(pd.Overview,0) AS Overview,
		ISNULL(pd.FastAccess,0) AS FastAccess,
		ISNULL(pd.Home,0) AS Home,
		ISNULL(pdc.Hidden,0) AS Hidden,
		ISNULL(pdc.HiddenInNavigationOnly,0) AS HiddenInNavigationOnly,
		--CASE WHEN EXISTS (SELECT inowc.[ID] FROM dbo.KnowledgeContent inowc WHERE inowc.KnowledgeID IN (Select inow.[ID] From dbo.Knowledge inow Where inow.PageDirectoryID=pd.[ID]) AND inowc.Culture=pdc.Culture AND LEN(LTRIM(RTRIM(CONVERT(NVARCHAR(4000),inowc.Content))))>0) THEN N'true' ELSE N'false' END AS ContentExists,

		ISNULL(pd.RightIndent,0) AS RightIndent,

		ISNULL(pd.jQuery,0) AS jQuery,

		ISNULL(pd.LogoHide,0) AS LogoHide,
		ISNULL(pd.MainMenuHide,0) AS MainMenuHide,
		ISNULL(pd.BannerHide,0) AS BannerHide,
		ISNULL(pd.BreadcrumbHide,0) AS BreadcrumbHide,
		ISNULL(pd.PageMenuHide,0) AS PageMenuHide,
		ISNULL(pd.PageBarHide,0) AS PageBarHide,
		ISNULL(pd.CopyrightHide,0) AS CopyrightHide,

		pd.Editor AS Editor,
		dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),pd.Editor)) AS EditorPermission,

		pdc.SeoTitle AS SeoTitle,
		pdc.SeoDescription AS SeoDescription,
		pdc.SeoKeywords AS SeoKeywords,

		pdc.Title AS Title,
		pdc.[Description] AS [Description],

		pdc.Url AS Url,
		ISNULL(pdc.ThisIsLink,0) AS ThisIsLink,

		pdc.Culture AS Culture

	FROM dbo.PageDirectory pd
	LEFT JOIN dbo.PageDirectoryContent pdc ON pdc.PageDirectoryID=pd.[ID]  AND pdc.Culture=@Culture

	ORDER BY Serial

END

ELSE

BEGIN


	DECLARE @TempTable TABLE 
	(
		MainDirectoryID int,
		SubDirectoryID int,
		PageDirectoryID int
	)

	INSERT INTO @TempTable SELECT nowp.MainDirectoryID, nowp.SubDirectoryID, nowp.PageDirectoryID FROM dbo.View_KnowledgePermission nowp Where REPLACE(nowp.DedicatedTo,N',',N'')=N'' or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1

	--====================================================
	--==返回符合访问权限的 MainDirectory 记录  （后面 Where 条件的意思：1. DedicatedTo 累积起来为空（记住考虑 ,,,,, 这样的累积结果）；DedicatedTo 累积起来符合访问权限；当前 pd 下没有 now （就是 IS NULL 的由来））
	--====================================================
	SELECT 

		N'MainDirectory' AS KnowledgeDirectory,
		md.[ID] AS [ID],
		md.Serial AS Serial,
		md.[Name] AS [Name],
		ISNULL(md.NewWindow,0) AS NewWindow,
		ISNULL(md.[System],0) AS [System],
		ISNULL(mdc.Hidden,0) AS Hidden,
		ISNULL(mdc.HiddenInNavigationOnly,0) AS HiddenInNavigationOnly,
		--CASE WHEN EXISTS (SELECT inowc.[ID] FROM dbo.KnowledgeContent inowc WHERE inowc.KnowledgeID IN (Select inow.[ID] From dbo.Knowledge inow Where inow.PageDirectoryID In (select ipd.[ID] from dbo.PageDirectory ipd where ipd.SubDirectoryID in (select isd.[ID] from dbo.SubDirectory isd where isd.MainDirectoryID=md.[ID]))) AND inowc.Culture=mdc.Culture AND LEN(LTRIM(RTRIM(CONVERT(NVARCHAR(4000),inowc.Content))))>0) THEN N'true' ELSE N'false' END  AS ContentExists,
		md.InActiveMainMenuIconMap AS InActiveMainMenuIconMap,
		md.ActiveMainMenuIconMap AS ActiveMainMenuIconMap,
		md.BannerMap AS BannerMap,
		md.BannerContentLayer AS BannerContentLayer,

		md.Editor AS Editor,
		dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),md.Editor)) AS EditorPermission,

		mdc.Title AS Title,
		mdc.[Description] AS [Description],

		mdc.Url AS Url,
		ISNULL(mdc.ThisIsLink,0) AS ThisIsLink,

		mdc.Culture AS Culture

	FROM dbo.MainDirectory md
	LEFT JOIN dbo.MainDirectoryContent mdc ON mdc.MainDirectoryID=md.[ID]  AND mdc.Culture=@Culture

	--WHERE  EXISTS (Select nowp.KnowledgeID From dbo.View_KnowledgePermission nowp Where nowp.MainDirectoryID=md.[ID] And (REPLACE(nowp.DedicatedTo,N',',N'')=N'' or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1))
	--WHERE  md.[ID] IN (Select nowp.MainDirectoryID From dbo.View_KnowledgePermission nowp Where REPLACE(nowp.DedicatedTo,N',',N'')=N'' or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)
	WHERE md.[ID] IN (Select tt.MainDirectoryID From @TempTable tt)

	--ORDER BY Serial
	ORDER BY  CASE @MainMenuAlign WHEN N'1' THEN  Serial  ELSE  -Serial END ASC


	--====================================================
	--==返回符合访问权限的 SubDirectory 记录  （后面 Where 条件的意思：1. DedicatedTo 累积起来为空（记住考虑 ,,,,, 这样的累积结果）；DedicatedTo 累积起来符合访问权限；当前 pd 下没有 now （就是 IS NULL 的由来））
	--====================================================
	SELECT 

		N'SubDirectory' AS KnowledgeDirectory,
		sd.[ID] AS [ID],
		sd.MainDirectoryID AS MainDirectoryID,
		sd.Serial AS Serial,
		sd.[Name] AS [Name],
		ISNULL(sd.NewWindow,0) AS NewWindow,
		ISNULL(sdc.Hidden,0) AS Hidden,
		ISNULL(sdc.HiddenInNavigationOnly,0) AS HiddenInNavigationOnly,
		--CASE WHEN EXISTS (SELECT inowc.[ID] FROM dbo.KnowledgeContent inowc WHERE inowc.KnowledgeID IN (Select inow.[ID] From dbo.Knowledge inow Where inow.PageDirectoryID In (select ipd.[ID] from dbo.PageDirectory ipd where ipd.SubDirectoryID=sd.[ID])) AND inowc.Culture=sdc.Culture AND LEN(LTRIM(RTRIM(CONVERT(NVARCHAR(4000),inowc.Content))))>0) THEN N'true' ELSE N'false' END AS ContentExists,
		ISNULL(sd.Overview,0) AS Overview,
		ISNULL(sd.Wizard,0) AS Wizard,

		sd.Editor AS Editor,
		dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),sd.Editor)) AS EditorPermission,

		sdc.Title AS Title,
		sdc.[Description] AS [Description],
		sdc.WizardPreviousTitle AS WizardPreviousTitle,
		sdc.WizardNextTitle AS WizardNextTitle,

		sdc.Url AS Url,
		ISNULL(sdc.ThisIsLink,0) AS ThisIsLink,

		sdc.Culture AS Culture

	FROM dbo.SubDirectory sd
	LEFT JOIN dbo.SubDirectoryContent sdc ON sdc.SubDirectoryID=sd.[ID]  AND sdc.Culture=@Culture

	--WHERE EXISTS (Select nowp.KnowledgeID From dbo.View_KnowledgePermission nowp Where nowp.SubDirectoryID=sd.[ID] And (REPLACE(nowp.DedicatedTo,N',',N'')=N'' or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1))
	--WHERE sd.[ID] IN  (Select nowp.SubDirectoryID From dbo.View_KnowledgePermission nowp Where REPLACE(nowp.DedicatedTo,N',',N'')=N'' or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)
	WHERE sd.[ID] IN (Select tt.SubDirectoryID From @TempTable tt)

	ORDER BY Serial




	--====================================================
	--==返回符合访问权限的 PageDirectory 记录  （后面 Where 条件的意思：1. DedicatedTo 累积起来为空（记住考虑 ,,,,, 这样的累积结果）；DedicatedTo 累积起来符合访问权限；当前 pd 下没有 now （就是 IS NULL 的由来））
	--====================================================
	SELECT

		N'PageDirectory' AS KnowledgeDirectory,
		pd.[ID] AS [ID],
		pd.SubDirectoryID AS SubDirectoryID,
		pd.Serial AS Serial,
		pd.[Name] AS [Name],
		pd.PageSize AS PageSize,
		ISNULL(pd.NewWindow,0) AS NewWindow,
		ISNULL(pd.Overview,0) AS Overview,
		ISNULL(pd.FastAccess,0) AS FastAccess,
		ISNULL(pd.Home,0) AS Home,
		ISNULL(pdc.Hidden,0) AS Hidden,
		ISNULL(pdc.HiddenInNavigationOnly,0) AS HiddenInNavigationOnly,
		--CASE WHEN EXISTS (SELECT inowc.[ID] FROM dbo.KnowledgeContent inowc WHERE inowc.KnowledgeID IN (Select inow.[ID] From dbo.Knowledge inow Where inow.PageDirectoryID=pd.[ID]) AND inowc.Culture=pdc.Culture AND LEN(LTRIM(RTRIM(CONVERT(NVARCHAR(4000),inowc.Content))))>0) THEN N'true' ELSE N'false' END AS ContentExists,
	
		ISNULL(pd.RightIndent,0) AS RightIndent,
	
		ISNULL(pd.jQuery,0) AS jQuery,

		ISNULL(pd.LogoHide,0) AS LogoHide,
		ISNULL(pd.MainMenuHide,0) AS MainMenuHide,
		ISNULL(pd.BannerHide,0) AS BannerHide,
		ISNULL(pd.BreadcrumbHide,0) AS BreadcrumbHide,

		ISNULL(pd.PageMenuHide,0) AS PageMenuHide,
		ISNULL(pd.PageBarHide,0) AS PageBarHide,
		ISNULL(pd.CopyrightHide,0) AS CopyrightHide,

		pd.Editor AS Editor,
		dbo.UDF_EditorDedicatedTo(@User,convert(nvarchar(4000),pd.Editor)) AS EditorPermission,

		pdc.SeoTitle AS SeoTitle,
		pdc.SeoDescription AS SeoDescription,
		pdc.SeoKeywords AS SeoKeywords,
		pdc.Title AS Title,
		pdc.[Description] AS [Description],

		pdc.Url AS Url,
		ISNULL(pdc.ThisIsLink,0) AS ThisIsLink,

		pdc.Culture AS Culture

	FROM dbo.PageDirectory pd
	LEFT JOIN dbo.PageDirectoryContent pdc ON pdc.PageDirectoryID=pd.[ID]  AND pdc.Culture=@Culture

	--WHERE EXISTS (Select nowp.KnowledgeID From dbo.View_KnowledgePermission nowp Where nowp.PageDirectoryID=pd.[ID] And (REPLACE(nowp.DedicatedTo,N',',N'')=N'' or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1))
	--WHERE pd.[ID] IN  (Select nowp.PageDirectoryID From dbo.View_KnowledgePermission nowp Where REPLACE(nowp.DedicatedTo,N',',N'')=N'' or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)
	WHERE pd.[ID] IN (Select tt.PageDirectoryID From @TempTable tt)

	ORDER BY Serial

END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
--返回一个独立的表（UserChiefEditorUserColumnEditor），输出 UserChiefEditor, UserColumnEditor 两个属性，供 Menu.cs 消费
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

SELECT 

	dbo.UDF_UserChiefEditor(@User) AS UserChiefEditor,
	dbo.UDF_UserColumnEditor(@User) AS UserColumnEditor
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[MenuMainDirectorySubDirectoryPageDirectory]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.MenuCommunityForum    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MenuCommunityForum]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[MenuCommunityForum]
GO

--====================================================================================
--==给定当前 ASPX 端的用户，返回该用户权限范围内的所有 Community, Forum 记录，以便在 ASPX 端构造菜单系统
--==返回的 Community, Forum 将被送入 DataSet 并为这2个表建立级联关系
--==我们需要根据 Option.MainMenuAlign 不同值，使用不同的排序方式返回 Community 记录 （注：由于该 SP 使用了 Union All， 因此 Order By 那里无法使用条件）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-24
--====================================================================================

CREATE PROCEDURE dbo.MenuCommunityForum

@User nvarchar(50),				--从 ASPX 端传递过来的用户名 （我们使用 Table 级用户系统）
@Culture nvarchar(100)				--当前文化

AS
  
--====================================================
--==首先返回 Option 中 MainMenuAlign 的值，后面要根据这个值改变 MainDirectory 选取时的 Order by 条件
--====================================================
DECLARE @MainMenuAlign NVARCHAR(10)
SELECT @MainMenuAlign=CONVERT(NVARCHAR(10),ISNULL(opt.[Value],N'1')) FROM dbo.[Option] opt WHERE opt.[Key]=N'MainMenuAlign'

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
--返回指定用户权限内的 Community 列表 
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================
--==根据主菜单左右对齐设定，分不同 Order By 进行 （以下两段脚本唯一的区别是 Order By 不同）
--====================================================
IF @MainMenuAlign=N'1'

	BEGIN

		--====================================================
		--==在主菜单设定为左对齐时，Order By Serial ASC
		--====================================================
		SELECT
		
			N'Community' AS CommunityDirectory,
			co.[ID] AS [ID],
			co.Serial AS Serial,
			co.[Name] AS [Name],
			co.Moderator AS Moderator,
			ISNULL(co.[Public],N'false') AS [Public],
			ISNULL(coc.Hidden,0) AS Hidden,
			co.InActiveMainMenuIconMap AS InActiveMainMenuIconMap,
			co.ActiveMainMenuIconMap AS ActiveMainMenuIconMap,
			co.BannerMap AS BannerMap,
			co.BannerContentLayer AS BannerContentLayer,
			co.ReadPermission AS ReadPermission,
			co.TopicWritePermission AS TopicWritePermission,
			co.FollowUpWritePermission AS FollowUpWritePermission,
			coc.Culture AS Culture,
			coc.Title As Title,
			coc.[Description] AS [Description],
			dbo.UDF_GetForumIDFromCommunityID(@User,co.[ID]) AS FirstForumID
		
		FROM dbo.Community co
		LEFT JOIN dbo.CommunityContent coc ON coc.CommunityID=co.[ID] AND coc.Culture=@Culture

		WHERE EXISTS (Select fo.[ID] From dbo.Forum fo Where dbo.UDF_ForumReadable(@User,fo.[ID])=1 And fo.CommunityID=co.[ID])		

		ORDER BY co.Serial ASC

		/*
		--====================================================
		--==首先返回 Public Forum 所在的 Community （而且当前用户不为 Admin）
		--====================================================
		SELECT TOP 100 PERCENT
		
			N'Community' AS CommunityDirectory,
			co.[ID] AS [ID],
			co.Serial AS Serial,
			co.[Name] AS [Name],
			co.Moderator AS Moderator,
			ISNULL(co.[Public],N'false') AS [Public],
			ISNULL(coc.Hidden,0) AS Hidden,
			co.InActiveMainMenuIconMap AS InActiveMainMenuIconMap,
			co.ActiveMainMenuIconMap AS ActiveMainMenuIconMap,
			co.BannerMap AS BannerMap,
			co.BannerContentLayer AS BannerContentLayer,
			co.ReadPermission AS ReadPermission,
			co.TopicWritePermission AS TopicWritePermission,
			co.FollowUpWritePermission AS FollowUpWritePermission,
			coc.Culture AS Culture,
			coc.Title As Title,
			coc.[Description] AS [Description],
			dbo.UDF_GetForumIDFromCommunityID(@User,co.[ID]) AS FirstForumID
		
		FROM dbo.Community co
		LEFT JOIN dbo.CommunityContent coc ON coc.CommunityID=co.[ID] AND coc.Culture=@Culture
		
		WHERE
		 
			(
		
				(co.[ID] IN (Select fo.CommunityID From dbo.Forum fo WHERE fo.[Public]=N'true')) 
		
				OR 
		
				(co.[ID] IN
					(
						Select fo.CommunityID 
						From dbo.Forum fo 
						Left Join dbo.UserForums uf ON uf.[Forum]=fo.[ID] 
						Where uf.[User]=@User And (uf.ReadEnabled=1 or uf.TopicWriteEnabled=1 or uf.FollowUpWriteEnabled=1) And dbo.UDF_UserCommunity(@User)=1 And fo.[Public]<>N'true'
					)
				)
			) 
			
			AND 
		
			dbo.UDF_UserAdmin(@User)<>1
		
		
		
		UNION ALL
		
		--====================================================
		--==如果当前用户是 Admin ，则返回全部
		--====================================================
		SELECT TOP 100 PERCENT
		
			N'Community' AS CommunityDirectory,
			co.[ID] AS [ID],
			co.Serial AS Serial,
			co.[Name] AS [Name],
			co.Moderator AS Moderator,
			ISNULL(co.[Public],N'false') AS [Public],
			ISNULL(coc.Hidden,0) AS Hidden,
			co.InActiveMainMenuIconMap AS InActiveMainMenuIconMap,
			co.ActiveMainMenuIconMap AS ActiveMainMenuIconMap,
			co.BannerMap AS BannerMap,
			co.BannerContentLayer AS BannerContentLayer,
			co.ReadPermission AS ReadPermission,
			co.TopicWritePermission AS TopicWritePermission,
			co.FollowUpWritePermission AS FollowUpWritePermission,
			coc.Culture AS Culture,
			coc.Title As Title,
			coc.[Description] AS [Description],
			dbo.UDF_GetForumIDFromCommunityID(@User,co.[ID]) AS FirstForumID
		
		FROM dbo.Community co
		LEFT JOIN dbo.CommunityContent coc ON coc.CommunityID=co.[ID] AND coc.Culture=@Culture
		WHERE dbo.UDF_UserAdmin(@User)=1
		
		--====================================================
		--==使用 UNION 的时候，只有最后一个 UNION 语句才可以使用 ORDER BY
		--====================================================
		ORDER BY Serial ASC
		*/
	END

ELSE

	BEGIN

		--====================================================
		--==在主菜单设定为右对齐时，Order By Serial DESC
		--====================================================
		SELECT
		
			N'Community' AS CommunityDirectory,
			co.[ID] AS [ID],
			co.Serial AS Serial,
			co.[Name] AS [Name],
			co.Moderator AS Moderator,
			ISNULL(co.[Public],N'false') AS [Public],
			ISNULL(coc.Hidden,0) AS Hidden,
			co.InActiveMainMenuIconMap AS InActiveMainMenuIconMap,
			co.ActiveMainMenuIconMap AS ActiveMainMenuIconMap,
			co.BannerMap AS BannerMap,
			co.BannerContentLayer AS BannerContentLayer,
			co.ReadPermission AS ReadPermission,
			co.TopicWritePermission AS TopicWritePermission,
			co.FollowUpWritePermission AS FollowUpWritePermission,
			coc.Culture AS Culture,
			coc.Title As Title,
			coc.[Description] AS [Description],
			dbo.UDF_GetForumIDFromCommunityID(@User,co.[ID]) AS FirstForumID
		
		FROM dbo.Community co
		LEFT JOIN dbo.CommunityContent coc ON coc.CommunityID=co.[ID] AND coc.Culture=@Culture

		WHERE EXISTS (Select fo.[ID] From dbo.Forum fo Where dbo.UDF_ForumReadable(@User,fo.[ID])=1 And fo.CommunityID=co.[ID])
		
		ORDER BY co.Serial DESC

		/*
		--====================================================
		--==首先返回 Public Forum 所在的 Community （而且当前用户不为 Admin）
		--====================================================
		SELECT TOP 100 PERCENT
		
			N'Community' AS CommunityDirectory,
			co.[ID] AS [ID],
			co.Serial AS Serial,
			co.[Name] AS [Name],
			co.Moderator AS Moderator,
			ISNULL(co.[Public],N'false') AS [Public],
			ISNULL(coc.Hidden,0) AS Hidden,
			co.InActiveMainMenuIconMap AS InActiveMainMenuIconMap,
			co.ActiveMainMenuIconMap AS ActiveMainMenuIconMap,
			co.BannerMap AS BannerMap,
			co.BannerContentLayer AS BannerContentLayer,
			co.ReadPermission AS ReadPermission,
			co.TopicWritePermission AS TopicWritePermission,
			co.FollowUpWritePermission AS FollowUpWritePermission,
			coc.Culture AS Culture,
			coc.Title As Title,
			coc.[Description] AS [Description],
			dbo.UDF_GetForumIDFromCommunityID(@User,co.[ID]) AS FirstForumID
		
		FROM dbo.Community co
		LEFT JOIN dbo.CommunityContent coc ON coc.CommunityID=co.[ID] AND coc.Culture=@Culture
		
		WHERE
		 
			(
		
				(co.[ID] IN (Select fo.CommunityID From dbo.Forum fo WHERE fo.[Public]=N'true')) 
		
				OR 
		
				(co.[ID] IN
					(
						Select fo.CommunityID 
						From dbo.Forum fo 
						Left Join dbo.UserForums uf ON uf.[Forum]=fo.[ID] 
						Where uf.[User]=@User And (uf.ReadEnabled=1 or uf.TopicWriteEnabled=1 or uf.FollowUpWriteEnabled=1) And dbo.UDF_UserCommunity(@User)=1 And fo.[Public]<>N'true'
					)
				)
			) 
			
			AND 
		
			dbo.UDF_UserAdmin(@User)<>1
		
		
		
		UNION ALL
		
		--====================================================
		--==如果当前用户是 Admin ，则返回全部
		--====================================================
		SELECT TOP 100 PERCENT
		
			N'Community' AS CommunityDirectory,
			co.[ID] AS [ID],
			co.Serial AS Serial,
			co.[Name] AS [Name],
			co.Moderator AS Moderator,
			ISNULL(co.[Public],N'false') AS [Public],
			ISNULL(coc.Hidden,0) AS Hidden,
			co.InActiveMainMenuIconMap AS InActiveMainMenuIconMap,
			co.ActiveMainMenuIconMap AS ActiveMainMenuIconMap,
			co.BannerMap AS BannerMap,
			co.BannerContentLayer AS BannerContentLayer,
			co.ReadPermission AS ReadPermission,
			co.TopicWritePermission AS TopicWritePermission,
			co.FollowUpWritePermission AS FollowUpWritePermission,
			coc.Culture AS Culture,
			coc.Title As Title,
			coc.[Description] AS [Description],
			dbo.UDF_GetForumIDFromCommunityID(@User,co.[ID]) AS FirstForumID
		
		FROM dbo.Community co
		LEFT JOIN dbo.CommunityContent coc ON coc.CommunityID=co.[ID] AND coc.Culture=@Culture
		WHERE dbo.UDF_UserAdmin(@User)=1
		
		--====================================================
		--==使用 UNION 的时候，只有最后一个 UNION 语句才可以使用 ORDER BY
		--====================================================
		ORDER BY Serial DESC
		*/

	END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
--返回当前给定用户权限范围内的所有 Forum 记录
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

SELECT

	N'Forum' AS CommunityDirectory,
	fo.[ID] AS [ID],
	fo.CommunityID AS CommunityID,
	fo.Serial AS Serial,
	fo.[Name] AS [Name],
	fo.Moderator AS Moderator,
	ISNULL(fo.[Public],N'false') AS [Public],
	fo.ReadPermission AS ReadPermission,
	fo.TopicWritePermission AS TopicWritePermission,
	fo.FollowUpWritePermission AS FollowUpWritePermission,

	foc.Culture AS Culture,

	foc.Title As Title,
	foc.[Description] AS [Description],
	ISNULL(foc.Hidden,0) AS Hidden,

	fuc.CommandTitleTaskList,
	fuc.CommandTitleTaskListDescription,
	fuc.CommandTitleAdd,
	fuc.CommandTitleAddDescription,
	fuc.CommandTitleQuery,
	fuc.CommandTitleQueryDescription

FROM dbo.Forum fo
LEFT JOIN dbo.ForumContent foc ON foc.ForumID=fo.[ID]  AND foc.Culture=@Culture
LEFT JOIN dbo.View_ForumUiCustomization fuc ON fuc.ForumContentID=foc.[ID]

WHERE dbo.UDF_ForumReadable(@User,fo.[ID])=1

ORDER BY fo.Serial


/*
--====================================================
--==首先获得 Public Forum  （而且当前用户不是 admin）
--====================================================
SELECT TOP 100 PERCENT

	N'Forum' AS CommunityDirectory,
	fo.[ID] AS [ID],
	fo.CommunityID AS CommunityID,
	fo.Serial AS Serial,
	fo.[Name] AS [Name],
	fo.Moderator AS Moderator,
	ISNULL(fo.[Public],N'false') AS [Public],
	fo.ReadPermission AS ReadPermission,
	fo.TopicWritePermission AS TopicWritePermission,
	fo.FollowUpWritePermission AS FollowUpWritePermission,
	ISNULL(foc.Hidden,0) AS Hidden,
	foc.Culture AS Culture,
	foc.Title As Title,
	foc.[Description] AS [Description],
	foc.CommandTitleTaskList,
	foc.CommandTitleTaskListDescription,
	foc.CommandTitleAdd,
	foc.CommandTitleAddDescription,
	foc.CommandTitleQuery,
	foc.CommandTitleQueryDescription

FROM dbo.Forum fo
LEFT JOIN dbo.ForumContent foc ON foc.ForumID=fo.[ID]  AND foc.Culture=@Culture

WHERE 
	(
		(fo.[Public]=N'true' ) Or

		(fo.[ID] in (Select uf.Forum From dbo.UserForums uf Where uf.[User]=@User And (uf.ReadEnabled=1 or uf.TopicWriteEnabled=1 or uf.FollowUpWriteEnabled=1)) And dbo.UDF_UserCommunity(@User)=1 And fo.[Public]<>N'true' )
	)  

	AND

	dbo.UDF_UserAdmin(@User)<>1


UNION ALL

--====================================================
--==如果是 Amin 用户则返回全部
--====================================================
SELECT TOP 100 PERCENT

	N'Forum' AS CommunityDirectory,
	fo.[ID] AS [ID],
	fo.CommunityID AS CommunityID,
	fo.Serial AS Serial,
	fo.[Name] AS [Name],
	fo.Moderator AS Moderator,
	ISNULL(fo.[Public],N'false') AS [Public],
	fo.ReadPermission AS ReadPermission,
	fo.TopicWritePermission AS TopicWritePermission,
	fo.FollowUpWritePermission AS FollowUpWritePermission,
	ISNULL(foc.Hidden,0) AS Hidden,
	foc.Culture AS Culture,
	foc.Title As Title,
	foc.[Description] AS [Description],
	foc.CommandTitleTaskList,
	foc.CommandTitleTaskListDescription,
	foc.CommandTitleAdd,
	foc.CommandTitleAddDescription,
	foc.CommandTitleQuery,
	foc.CommandTitleQueryDescription

FROM dbo.Forum fo
LEFT JOIN dbo.ForumContent foc ON foc.ForumID=fo.[ID]  AND foc.Culture=@Culture
WHERE dbo.UDF_UserAdmin(@User)=1

--====================================================
--==使用 UNION 的时候，只有最后一个 UNION 语句才可以使用 ORDER BY
--====================================================
ORDER BY Serial
*/
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[MenuCommunityForum]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PublicGetBannerMapByMainDirectoryName    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PublicGetBannerMapByMainDirectoryName]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PublicGetBannerMapByMainDirectoryName]
GO

--====================================================================================
--==根据给定的 MainDirectoryName 从 MainDirectory 或 Community 表返回对应的 BannerMap
--====================================================================================
--==版权所有 2001-2011 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2011-01-14
--====================================================================================

CREATE PROCEDURE dbo.PublicGetBannerMapByMainDirectoryName

@MainDirectoryName nvarchar(100)			--表 MainDirectory / Community 的 MainDirectoryName

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--================================================
--==获得 （根据 @MainDirectoryName 来自 MainDirectory 还是 Community 决定从哪里获得）（系统的 MainDirectoryName 是不能重复的，不管是来自 MainDirectory 还是 Community）
--================================================

IF EXISTS (Select [ID] From dbo.MainDirectory Where [Name]=@MainDirectoryName)

BEGIN

	SELECT 

		md.BannerMap AS BannerMap

	FROM dbo.MainDirectory md WHERE md.[Name]=@MainDirectoryName

END

ELSE

BEGIN

	SELECT 

		co.BannerMap AS BannerMap

	FROM dbo.Community co WHERE co.[Name]=@MainDirectoryName

END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PublicGetBannerMapByMainDirectoryName]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PublicSetBannerMapByMainDirectoryName    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PublicSetBannerMapByMainDirectoryName]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PublicSetBannerMapByMainDirectoryName]
GO

--====================================================================================
--==根据给定的 MainDirectoryName 将 BannerMap 写入 MainDirectory 或 Community 表
--====================================================================================
--==版权所有 2001-2011 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2011-01-14
--====================================================================================

CREATE PROCEDURE dbo.PublicSetBannerMapByMainDirectoryName

@MainDirectoryName nvarchar(100),			--表 MainDirectory / Community  的 MainDirectoryName
@BannerMap ntext					--表 MainDirectory / Community  的 BannerMap

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--================================================
--==保存 （根据 @MainDirectoryName 是来自 MainDirectory 还是 Community 表，决定将 @BannerContentLayer 保存到 MainDirectory 还是 Community 表）（系统的 MainDirectoryName 是不会重复的，不管是来自 MainDirectory 还是 Community）
--================================================

IF EXISTS (Select [ID] From dbo.MainDirectory Where [Name]=@MainDirectoryName)

BEGIN

	UPDATE dbo.MainDirectory SET BannerMap=@BannerMap WHERE [Name]=@MainDirectoryName

END

ELSE

BEGIN

	UPDATE dbo.Community SET BannerMap=@BannerMap WHERE [Name]=@MainDirectoryName

END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PublicSetBannerMapByMainDirectoryName]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PageDirectoryGetNeighbour    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PageDirectoryGetNeighbour]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PageDirectoryGetNeighbour]
GO

--====================================================================================
--==给定 PageDirectoryName 返回其 Neighbour （就是和该 PageDirectory 位于同一 SubDirectory, 或同一 MainDirectory 的 PageDirectory）
--==
--==该 SP 用于 Knowledge 删除后的重定向，分以下几种情形：
--==1. 如果删除的是 PageDirectory 条目，则检查当前项目是否有同属一个 SubDirectory 下的 Brother，如果有，则取之，否则，取同一个 MainDirectory 下的，其它 SubDirectory 项下的 PageDirectory，或其他 MainDirectory 下的最后一个 SubDirectory 下的最后一个 PageDirectory
--==2. 如果删除的是 SubDirectory 条目，则取同一 MainDirectory 项下，其它 SubDirectory 下的最后一个 PageDirectory
--==3. 如果删除的是 MainDirectory 条目，则取临近 MainDirectory 下最后一个 SubDirectory 下的最后一个 PageDirectory
--==4. 如果 MainDirectory 都删光了，则进入 "管理 | 内容管理 | 内容树"
--==
--==返回结果：
--==如果是自己删自己，则我们尝试去寻找其 Neighbour, 找到了就返回这个 Neighbour，否则返回空；
--==如果不是自己删自己，则原封不动返回这个 @PageDirectoryName 作 Neighbour
--==在 ASPX 端，人如果看到返回来的 Neighbour 不为空，则替换当前 Context  PageMenuName，如果为空，说明已经删光了（已经没有 MainDirectory 了），则退守 "管理 | 内容管理 | 内容树"
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-01-15 
--====================================================================================

CREATE PROCEDURE dbo.PageDirectoryGetNeighbour

@PageDirectoryName nvarchar(100),	--给定的 @PageDirectoryName
@KnowledgeDirectory nvarchar(100),	--是 MainDirectory, SubDirectory, PageDirectory?
@KnowledgeItem int,			--被删除条目的 ID

@Neighbour nvarchar(100) OUT		--返回参数, 指定 @KnowledgeItem 的 Neighbour

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--================================================
--==获得 @PageDirectoryName 对应的 PageDirectoryID, SubDirectoryID, MainDirectoryID
--================================================
DECLARE @PageDirectoryID INT
DECLARE @SubDirectoryID INT
DECLARE @MainDirectoryID INT

DECLARE @PageDirectorySerial INT
DECLARE @SubDirectorySerial INT
DECLARE @MainDirectorySerial INT

SELECT 

	@PageDirectoryID=pd.[ID],
	@PageDirectorySerial=pd.Serial,
	@SubDirectoryID=sd.[ID],
	@SubDirectorySerial=sd.Serial,
	@MainDirectoryID=md.[ID],
	@MainDirectorySerial=md.Serial

FROM dbo.PageDirectory pd 
LEFT JOIN dbo.SubDirectory sd ON sd.[ID]=pd.SubDirectoryID
LEFT JOIN dbo.MainDirectory md ON md.[ID]=sd.MainDirectoryID

WHERE pd.[Name]=@PageDirectoryName

--================================================
--==获得 @PageDirectoryID, @SubDirectoryID, @MainDirectoryID 的邻居 ID （如果有 Serial 大一个的，用大一个的，否则用小一个的）
--==首先，初始化为  @PageDirectoryNeighbourID=@PageDirectoryID，@SubDirectoryNeighbourID=@SubDirectoryID， @MainDirectoryNeighbourID=@MainDirectoryID (事实上，在后面，我们将孤家寡人已经排斥在外了)
--================================================
DECLARE @PageDirectoryNeighbourID INT
DECLARE @SubDirectoryNeighbourID INT
DECLARE @MainDirectoryNeighbourID INT

SET @PageDirectoryNeighbourID=@PageDirectoryID
SET @SubDirectoryNeighbourID=@SubDirectoryID
SET @MainDirectoryNeighbourID=@MainDirectoryID

--================================
--==获得 @PageDirectoryNeighbourID （找 Serial 临近的，或者 ID 临近的 （有时候 Serial 可能根本没设过，都是 1，这是就要找 ID 临近的））
--================================
IF EXISTS (Select pd.[ID] From dbo.PageDirectory pd Where pd.Serial>@PageDirectorySerial And pd.SubDirectoryID=@SubDirectoryID)

	BEGIN
		SELECT @PageDirectoryNeighbourID=(Select Top 1 pd.[ID]  From dbo.PageDirectory pd Where pd.Serial>@PageDirectorySerial And pd.SubDirectoryID=@SubDirectoryID Order By pd.Serial ASC)
	END

ELSE IF EXISTS (Select pd.[ID] From dbo.PageDirectory pd Where pd.Serial<@PageDirectorySerial And pd.SubDirectoryID=@SubDirectoryID)

	BEGIN
		SELECT @PageDirectoryNeighbourID=(Select Top 1 pd.[ID]  From dbo.PageDirectory pd Where pd.Serial<@PageDirectorySerial And pd.SubDirectoryID=@SubDirectoryID Order By pd.Serial DESC)
	END
ELSE

	BEGIN

		IF EXISTS (Select pd.[ID] From dbo.PageDirectory pd Where pd.[ID]>@PageDirectoryID And pd.SubDirectoryID=@SubDirectoryID)

			BEGIN
				SELECT @PageDirectoryNeighbourID=(Select Top 1 pd.[ID]  From dbo.PageDirectory pd Where pd.[ID]>@PageDirectoryID And pd.SubDirectoryID=@SubDirectoryID Order By pd.[ID] ASC)			
			END
		ELSE
			BEGIN
				SELECT @PageDirectoryNeighbourID=(Select Top 1 pd.[ID]  From dbo.PageDirectory pd Where pd.[ID]<@PageDirectoryID And pd.SubDirectoryID=@SubDirectoryID Order By pd.[ID] DESC)			
			END
	END

--================================
--==获得 @SubDirectoryNeighbourID （找 Serial 临近的，或者 ID 临近的 （有时候 Serial 可能根本没设过，都是 1，这是就要找 ID 临近的））
--================================
IF EXISTS (Select sd.[ID] From dbo.SubDirectory sd Where sd.Serial>@SubDirectorySerial And sd.MainDirectoryID=@MainDirectoryID)

	BEGIN
		SELECT @SubDirectoryNeighbourID=(Select Top 1 sd.[ID]  From dbo.SubDirectory sd Where sd.Serial>@SubDirectorySerial And sd.MainDirectoryID=@MainDirectoryID Order By sd.Serial ASC)
	END

ELSE IF EXISTS (Select sd.[ID] From dbo.SubDirectory sd Where sd.Serial<@SubDirectorySerial And sd.MainDirectoryID=@MainDirectoryID)

	BEGIN
		SELECT @SubDirectoryNeighbourID=(Select Top 1 sd.[ID]  From dbo.SubDirectory sd Where sd.Serial<@SubDirectorySerial And sd.MainDirectoryID=@MainDirectoryID Order By sd.Serial DESC)
	END

ELSE

	BEGIN

		IF EXISTS (Select sd.[ID] From dbo.SubDirectory sd Where sd.[ID]>@SubDirectoryID And sd.MainDirectoryID=@MainDirectoryID)

			BEGIN
				SELECT @SubDirectoryNeighbourID=(Select Top 1 sd.[ID]  From dbo.SubDirectory sd Where sd.[ID]>@SubDirectoryID And sd.MainDirectoryID=@MainDirectoryID Order By sd.[ID] ASC)			
			END
		ELSE
			BEGIN
				SELECT @SubDirectoryNeighbourID=(Select Top 1 sd.[ID]  From dbo.SubDirectory sd Where sd.[ID]<@SubDirectoryID And sd.MainDirectoryID=@MainDirectoryID Order By sd.[ID] DESC)			
			END
	END


--================================
--==获得 @MainDirectoryNeighbourID （找 Serial 临近的，或者 ID 临近的 （有时候 Serial 可能根本没设过，都是 1，这是就要找 ID 临近的））
--================================
IF EXISTS (Select md.[ID] From dbo.MainDirectory md Where md.Serial>@MainDirectorySerial)

	BEGIN
		SELECT @MainDirectoryNeighbourID=(Select Top 1 md.[ID]  From dbo.MainDirectory md Where md.Serial>@MainDirectorySerial Order By md.Serial ASC)
	END

ELSE IF EXISTS (Select md.[ID] From dbo.MainDirectory md Where md.Serial<@MainDirectorySerial)

	BEGIN
		SELECT @MainDirectoryNeighbourID=(Select Top 1 md.[ID]  From dbo.MainDirectory md Where md.Serial<@MainDirectorySerial Order By md.Serial DESC)
	END

ELSE

	BEGIN

		IF EXISTS (Select md.[ID] From dbo.MainDirectory md Where md.[ID]>@MainDirectoryID)

			BEGIN
				SELECT @MainDirectoryNeighbourID=(Select Top 1 md.[ID]  From dbo.MainDirectory md Where md.[ID]>@MainDirectoryID Order By md.[ID] ASC)			
			END
		ELSE
			BEGIN
				SELECT @MainDirectoryNeighbourID=(Select Top 1 md.[ID]  From dbo.MainDirectory md Where md.[ID]<@MainDirectoryID Order By md.[ID] DESC)			
			END
	END


--================================================
--==分 @KnowledgeDirectory=  PageDirectory |  SubDirectory | MainDirectory  三种情形考虑
--================================================

IF @KnowledgeDirectory=N'PageDirectory'

	--================================================	
	--==如果是 PageDirectory 情形
	--================================================
	BEGIN

		--================================================
		--==首先看看是不是孤家寡人，是的话，根据我们在 SP PageDirectoryDelete 中的约定，孤家寡人的删除会被禁止，则这里也就不存在输出 Neighbour 的问题，直接输出  @PageDirectoryName 作为 @Neighbour OUT
		--================================================
		
		DECLARE @PageDirectoryCount INT
		SELECT @PageDirectoryCount=COUNT(pd.[ID]) FROM dbo.PageDirectory pd WHERE pd.SubDirectoryID=@SubDirectoryID

		--================================================
		--==是否孤家寡人
		--================================================
		IF @PageDirectoryCount<=1

			--================================================
			--==如果《是》孤家寡人
			--================================================
			BEGIN
				SELECT @Neighbour=@PageDirectoryName
			END

		ELSE

			--================================================
			--==如果《不是》孤家寡人
			--================================================
			BEGIN

				--================================================
				--==分是否自己删自己分别考虑
				--================================================
				IF @PageDirectoryID=@KnowledgeItem
	
					BEGIN
						--================================================
						--==如果《是》自己删自己 ...
						--================================================			
						SELECT  @Neighbour=(Select pd.[Name] From dbo.PageDirectory pd Where pd.[ID]=@PageDirectoryNeighbourID)
					END

				ELSE
					BEGIN			
						--================================================
						--==如果《不是》自己删自己，直接输出 @PageDirectoryName 作为 @Neighbour OUT
						--================================================			
						SELECT @Neighbour=@PageDirectoryName
					END

			END


	END

ELSE IF  @KnowledgeDirectory=N'SubDirectory'


	--================================================	
	--==如果是 SubDirectory 情形
	--================================================
	BEGIN

		--================================================
		--==首先看看是不是孤家寡人，是的话，根据我们在 SP PageDirectoryDelete 中的约定，孤家寡人的删除会被禁止，则这里也就不存在输出 Neighbour 的问题，直接输出  @PageDirectoryName 作为 @Neighbour OUT
		--================================================
		
		DECLARE @SubDirectoryCount INT
		SELECT @SubDirectoryCount=COUNT(sd.[ID]) FROM dbo.SubDirectory sd WHERE sd.MainDirectoryID=@MainDirectoryID

		--================================================
		--==是否孤家寡人
		--================================================
		IF @SubDirectoryCount<=1

			--================================================
			--==如果《是》孤家寡人
			--================================================
			BEGIN
				SELECT @Neighbour=@PageDirectoryName
			END

		ELSE

			--================================================
			--==如果《不是》孤家寡人
			--================================================
			BEGIN

				--================================================
				--==分是否自己删自己分别考虑
				--================================================
				IF @SubDirectoryID=@KnowledgeItem
	
					BEGIN
						--================================================
						--==如果《是》自己删自己 ...
						--================================================			
						SELECT  @Neighbour=(Select Top 1 pd.[Name] From dbo.PageDirectory pd Where pd.SubDirectoryID=@SubDirectoryNeighbourID Order By pd.Serial ASC)
					END

				ELSE
					BEGIN			
						--================================================
						--==如果《不是》自己删自己，直接输出 @PageDirectoryName 作为 @Neighbour OUT
						--================================================			
						SELECT @Neighbour=@PageDirectoryName
					END

			END


	END



ELSE


	--================================================	
	--==如果是 MainDirectory 情形
	--================================================
	BEGIN

		--================================================
		--==首先看看是不是孤家寡人，是的话，输出 @Neighbour=""   ASPX 端看到空的 @Neighbour 会跳到系统管理那里
		--================================================
		
		DECLARE @MainDirectoryCount INT
		SELECT @MainDirectoryCount=COUNT(md.[ID]) FROM dbo.MainDirectory md

		--================================================
		--==是否孤家寡人
		--================================================
		IF @MainDirectoryCount<=1

			--================================================
			--=如果《是》孤家寡人
			--================================================
			BEGIN
				SELECT @Neighbour=N''
			END

		ELSE

			--================================================
			--=如果《不是》孤家寡人
			--================================================
			BEGIN

				--================================================
				--==分是否自己删自己分别考虑
				--================================================
				IF @MainDirectoryID=@KnowledgeItem
	
					BEGIN
						--================================================
						--==如果《是》自己删自己 ...
						--================================================			
						SELECT  @Neighbour=(Select Top 1 pd.[Name] From dbo.PageDirectory pd Where pd.SubDirectoryID=(select top 1 sd.[ID] from dbo.SubDirectory sd where sd.MainDirectoryID=@MainDirectoryNeighbourID order by sd.[ID] ASC) Order By pd.Serial ASC)
					END

				ELSE
					BEGIN			
						--================================================
						--==如果《不是》自己删自己，直接输出 @PageDirectoryName 作为 @Neighbour OUT
						--================================================			
						SELECT @Neighbour=@PageDirectoryName
					END

			END


	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PageDirectoryGetNeighbour]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.AdminEditorUserAuthentication    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AdminEditorUserAuthentication]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[AdminEditorUserAuthentication]
GO

--====================================================================================
--==检查当前用户是否可以对 Knowledge （各 Level）进行保存，修改
--==表 Users 中的用户角色如果不是 Admin, ChiefEditor 或符合权限设定的 Column Editor 则不能进行保存修改
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.AdminEditorUserAuthentication

@User NVARCHAR(50),				--参数：指定用户

@KnowledgeDirectory nvarchar(100),		--将被检查对照的 Knowledge  条目的的 Directory
@KnowledgeItem int,				--将被检查对照的 Knowledge  条目的 ID

@oPass INT OUT				--输出参数：通过返回 1，否则 0

AS


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=========================================
--==变量
--=========================================
DECLARE @EditorPermission INT
SET @EditorPermission=0

--=========================================
--==如果 @User 是 NULL，则强制为 N''
--=========================================
IF @User IS NULL

BEGIN
	SET @User=N''
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=========================================
--==变量一堆
--=========================================
DECLARE @MainDirectoryEditor NVARCHAR(4000)
DECLARE @SubDirectoryEditor NVARCHAR(4000)
DECLARE @PageDirectoryEditor NVARCHAR(4000)
DECLARE @KnowledgeEditor NVARCHAR(4000)

DECLARE @UserInEditorList INT

DECLARE @MainDirectoryID INT
DECLARE @SubDirectoryID INT
DECLARE @PageDirectoryID INT

--=========================================
--==如果是 MainDirectory
--=========================================

IF @KnowledgeDirectory=N'MainDirectory'

	BEGIN

		--=========================================
		--==获取当前 MainDirectory 编辑列表
		--=========================================
		SELECT @MainDirectoryEditor=ISNULL(CONVERT(NVARCHAR(4000),md.Editor),N'') FROM dbo.MainDirectory md WHERE md.[ID]=@KnowledgeItem

		--=========================================
		--==当前 @User 是否在编辑列表
		--=========================================
		SET @UserInEditorList=0
		
		--IF  (@User In (select Element from dbo.UDF_PublicSplit(@MainDirectoryEditor,N',')))  And  (@User<>N'') 
		IF  (@User In (select [User] from dbo.UDF_UserResolve(@MainDirectoryEditor)))  And  (@User<>N'') 
		BEGIN
			SET @UserInEditorList=1
		END

		--=========================================
		--==如果是 Admin 或 ChiefEditor 或该 Knowledge 授权编辑列表中的人，则可以编辑
		--=========================================
		IF (dbo.UDF_UserAdmin(@User)=1)  OR  (dbo.UDF_UserChiefEditor(@User)=1)  OR  (@UserInEditorList=1)

		BEGIN
			SET @EditorPermission=1
		END

	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=========================================
--==如果是 SubDirectory
--=========================================

ELSE IF @KnowledgeDirectory=N'SubDirectory'

	BEGIN

		--=========================================
		--==根据 SubDirectoryID 获得 MainDirectoryID
		--=========================================
		SELECT @MainDirectoryID=sd.MainDirectoryID FROM dbo.SubDirectory sd WHERE sd.[ID]=@KnowledgeItem

		--=========================================
		--==获取当前 MainDirectory, SubDirectory 编辑列表
		--=========================================
		SELECT @MainDirectoryEditor=ISNULL(CONVERT(NVARCHAR(4000),md.Editor),N'') FROM dbo.MainDirectory md WHERE md.[ID]=@MainDirectoryID
		SELECT @SubDirectoryEditor=ISNULL(CONVERT(NVARCHAR(4000),sd.Editor),N'') FROM dbo.SubDirectory sd WHERE sd.[ID]=@KnowledgeItem

		--=========================================
		--==当前 @User 是否在编辑列表 (二者任一即可)
		--=========================================
		SET @UserInEditorList=0

		--IF  (@User In (select Element from dbo.UDF_PublicSplit(@MainDirectoryEditor,N',')))  And  (@User<>N'') 
		IF  (@User In (select [User] from dbo.UDF_UserResolve(@MainDirectoryEditor)))  And  (@User<>N'') 
		BEGIN
			SET @UserInEditorList=1
		END
		
		--IF  (@User In (select Element from dbo.UDF_PublicSplit(@SubDirectoryEditor,N',')))  And  (@User<>N'') 
		IF  (@User In (select [User] from dbo.UDF_UserResolve(@SubDirectoryEditor)))  And  (@User<>N'') 
		BEGIN
			SET @UserInEditorList=1
		END

		--=========================================
		--==如果是 Admin 或 ChiefEditor 或该 Knowledge 授权编辑列表中的人，则可以编辑
		--=========================================
		IF (dbo.UDF_UserAdmin(@User)=1)  OR  (dbo.UDF_UserChiefEditor(@User)=1)  OR  (@UserInEditorList=1)

		BEGIN
			SET @EditorPermission=1
		END

	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=========================================
--==如果是 PageDirectory
--=========================================

ELSE IF @KnowledgeDirectory=N'PageDirectory'

	BEGIN
		--=========================================
		--==根据 PageDirectoryID 获得 SubDirectoryID 和 MainDirectoryID
		--=========================================
		SELECT @SubDirectoryID=pd.SubDirectoryID FROM dbo.PageDirectory pd WHERE pd.[ID]=@KnowledgeItem
		SELECT @MainDirectoryID=sd.MainDirectoryID FROM dbo.SubDirectory sd WHERE sd.[ID]=@SubDirectoryID

		--=========================================
		--==获取当前 MainDirectory, SubDirectory, PageDirectory  编辑列表
		--=========================================
		SELECT @MainDirectoryEditor=ISNULL(CONVERT(NVARCHAR(4000),md.Editor),N'') FROM dbo.MainDirectory md WHERE md.[ID]=@MainDirectoryID
		SELECT @SubDirectoryEditor=ISNULL(CONVERT(NVARCHAR(4000),sd.Editor),N'') FROM dbo.SubDirectory sd WHERE sd.[ID]=@SubDirectoryID
		SELECT @PageDirectoryEditor=ISNULL(CONVERT(NVARCHAR(4000),pd.Editor),N'') FROM dbo.PageDirectory pd WHERE pd.[ID]=@KnowledgeItem

		--=========================================
		--==当前 @User 是否在编辑列表 (三者任一即可)
		--=========================================
		SET @UserInEditorList=0

		--IF  (@User In (select Element from dbo.UDF_PublicSplit(@MainDirectoryEditor,N',')))  And  (@User<>N'') 
		IF  (@User In (select [User] from dbo.UDF_UserResolve(@MainDirectoryEditor)))  And  (@User<>N'') 
		BEGIN
			SET @UserInEditorList=1
		END
		
		--IF  (@User In (select Element from dbo.UDF_PublicSplit(@SubDirectoryEditor,N',')))  And  (@User<>N'') 
		IF  (@User In (select [User] from dbo.UDF_UserResolve(@SubDirectoryEditor)))  And  (@User<>N'') 
		BEGIN
			SET @UserInEditorList=1
		END

		--IF  (@User In (select Element from dbo.UDF_PublicSplit(@PageDirectoryEditor,N',')))  And  (@User<>N'') 
		IF  (@User In (select [User] from dbo.UDF_UserResolve(@PageDirectoryEditor)))  And  (@User<>N'') 
		BEGIN
			SET @UserInEditorList=1
		END

		--=========================================
		--==如果是 Admin 或 ChiefEditor 或该 Knowledge 授权编辑列表中的人，则可以编辑
		--=========================================
		IF (dbo.UDF_UserAdmin(@User)=1)  OR  (dbo.UDF_UserChiefEditor(@User)=1)  OR  (@UserInEditorList=1)

		BEGIN
			SET @EditorPermission=1
		END

	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=========================================
--==如果是 Knowledge
--=========================================

ELSE IF @KnowledgeDirectory=N'Knowledge'

	BEGIN

		--=========================================
		--==根据KnowledgeID 获得 PageDirectoryID, SubDirectoryID 和 MainDirectoryID
		--=========================================
		SELECT @PageDirectoryID=now.PageDirectoryID FROM dbo.Knowledge now WHERE now.[ID]=@KnowledgeItem
		SELECT @SubDirectoryID=pd.SubDirectoryID FROM dbo.PageDirectory pd WHERE pd.[ID]=@PageDirectoryID
		SELECT @MainDirectoryID=sd.MainDirectoryID FROM dbo.SubDirectory sd WHERE sd.[ID]=@SubDirectoryID

		--=========================================
		--==获取当前 MainDirectory, SubDirectory, PageDirectory, Knowledge  编辑列表
		--=========================================
		SELECT @MainDirectoryEditor=ISNULL(CONVERT(NVARCHAR(4000),md.Editor),N'') FROM dbo.MainDirectory md WHERE md.[ID]=@MainDirectoryID
		SELECT @SubDirectoryEditor=ISNULL(CONVERT(NVARCHAR(4000),sd.Editor),N'') FROM dbo.SubDirectory sd WHERE sd.[ID]=@SubDirectoryID
		SELECT @PageDirectoryEditor=ISNULL(CONVERT(NVARCHAR(4000),pd.Editor),N'') FROM dbo.PageDirectory pd WHERE pd.[ID]=@PageDirectoryID
		SELECT @KnowledgeEditor=ISNULL(CONVERT(NVARCHAR(4000),now.Editor),N'') FROM dbo.Knowledge now WHERE now.[ID]=@KnowledgeItem

		--=========================================
		--==当前 @User 是否在编辑列表 (四者任一即可)
		--=========================================
		SET @UserInEditorList=0

		--IF  (@User In (select Element from dbo.UDF_PublicSplit(@MainDirectoryEditor,N',')))  And  (@User<>N'') 
		IF  (@User In (select [User] from dbo.UDF_UserResolve(@MainDirectoryEditor)))  And  (@User<>N'') 
		BEGIN
			SET @UserInEditorList=1
		END
		
		--IF  (@User In (select Element from dbo.UDF_PublicSplit(@SubDirectoryEditor,N',')))  And  (@User<>N'') 
		IF  (@User In (select [User] from dbo.UDF_UserResolve(@SubDirectoryEditor)))  And  (@User<>N'') 
		BEGIN
			SET @UserInEditorList=1
		END

		--IF  (@User In (select Element from dbo.UDF_PublicSplit(@PageDirectoryEditor,N',')))  And  (@User<>N'') 
		IF  (@User In (select [User] from dbo.UDF_UserResolve(@PageDirectoryEditor)))  And  (@User<>N'') 
		BEGIN
			SET @UserInEditorList=1
		END

		--IF  (@User In (select Element from dbo.UDF_PublicSplit(@KnowledgeEditor,N',')))  And  (@User<>N'') 
		IF  (@User In (select [User] from dbo.UDF_UserResolve(@KnowledgeEditor)))  And  (@User<>N'') 
		BEGIN
			SET @UserInEditorList=1
		END

		--=========================================
		--==如果是 Admin 或 ChiefEditor 或该 Knowledge 授权编辑列表中的人，则可以编辑
		--=========================================
		IF (dbo.UDF_UserAdmin(@User)=1)  OR  (dbo.UDF_UserChiefEditor(@User)=1)  OR  (@UserInEditorList=1)

		BEGIN
			SET @EditorPermission=1
		END

	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=========================================
--==如果是空字符，则需要  Admin 或 Chief Editor 权限
--=========================================

ELSE IF @KnowledgeDirectory=N''

	BEGIN
		--=========================================
		--==如果是 Admin 或 ChiefEditor
		--=========================================
		IF (dbo.UDF_UserAdmin(@User)=1)  OR  (dbo.UDF_UserChiefEditor(@User)=1) 

		BEGIN
			SET @EditorPermission=1
		END

	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=========================================
--==如果是其它  （一般可以使用  N'AdminEditor' ，这时是笼统地判断，是要是 Admin 或 Chief Editor 或 Column Editor 均可）
--=========================================

ELSE

	BEGIN
		--=========================================
		--==如果是 Admin 或 ChiefEditor, 或 ColumnEditor
		--=========================================
		IF (dbo.UDF_UserAdmin(@User)=1)  OR  (dbo.UDF_UserChiefEditor(@User)=1)  OR  (dbo.UDF_UserColumnEditor(@User)=1)

		BEGIN
			SET @EditorPermission=1
		END

	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=========================================
--==最终
--=========================================

IF @EditorPermission=0

BEGIN
	SET @oPass=0
	RAISERROR(N'很抱歉，您不是网站管理员或拥有相应权限的编辑，不允许进行该操作。',16,1)
	RETURN
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[AdminEditorUserAuthentication]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserForgetPassword    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserForgetPassword]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserForgetPassword]
GO

--====================================================================================
--用户忘记密码后，提供用户名和邮箱，这里验证用户名和邮箱是否一致，如果一致，则返回用户密码和相应 Result 代码
--输出： oResult 结果代码 （0：相符  -1：用户不存在   -2：邮箱账户不匹配）
--输出： oPassword 用户的密码
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.UserForgetPassword

@Name nvarchar(50),				--用户名（输入）
@EmailAddress nvarchar(100),			--邮箱地址

@oAdminEmailAddress nvarchar(100) OUT,	--系统管理员的 Email 地址
@oPassword nvarchar(200) OUT,		--密码（加密的）（输出）
@oResult int OUT				--是否通过（输出）


AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==如果用户不存在 | 存在
--======================================================

IF NOT EXISTS (Select us.[ID] From dbo.Users us Where us.[Name]=@Name)

	BEGIN 
		--======================================================
		--==如果用户不存在
		--======================================================
		SELECT @oResult=-1
		SELECT @oPassword=N''
		SELECT @oAdminEmailAddress=N''
		RETURN
	END	

ELSE

	BEGIN 
		--======================================================
		--==如果用户存在
		--======================================================
		IF NOT EXISTS (Select us.[ID] From dbo.Users us Where us.[Name]=@Name And us.[Email]=@EmailAddress)

			BEGIN
				--======================================================
				--==如果邮箱地址不匹配
				--======================================================
				SELECT @oResult=-2
				SELECT @oPassword=N''
				SELECT @oAdminEmailAddress=N''
				RETURN
			END
		ELSE
			BEGIN
				--======================================================
				--==如果邮箱地址匹配
				--======================================================
				SELECT @oResult=0
				SELECT @oPassword=ISNULL(us.[Password],N'') From dbo.[Users] us Where us.[Name]=@Name
				SELECT @oAdminEmailAddress=ISNULL(us.[Email],N'') From dbo.[Users] us Where dbo.UDF_UserAdmin(us.[Name])=1
				RETURN
			END
	END	


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserForgetPassword]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserChangePassword    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserChangePassword]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserChangePassword]
GO

--====================================================================================
--用户修改密码：检查用户是否存在，旧密码是否正确，新密码两次输入是否一致
--输出： oResult 结果代码 （0：成功  -1：用户不存在   -2：旧密码不匹配  -3：新密码两次输入不一致）
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.UserChangePassword

@Name nvarchar(50),					--用户名（输入）

@OldEncryptedPassword nvarchar(200),			--旧密码（加密的）
@NewEncryptedPassword nvarchar(200),			--新密码
@NewEncryptedPasswordRetype nvarchar(200),		--新密码（第二遍输入）

@NewPassword nvarchar(200),				--新密码
@NewPasswordRetype nvarchar(200),			--新密码（第二遍输入）

@oResult int OUT					--是否通过（输出）


AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==如果用户不存在 | 存在
--======================================================

IF NOT EXISTS (Select us.[ID] From dbo.Users us Where us.[Name]=@Name)

	BEGIN 
		--======================================================
		--==如果用户不存在
		--======================================================
		SELECT @oResult=-1
		RETURN
	END	

ELSE

	BEGIN 
		--======================================================
		--==如果用户存在
		--======================================================
		IF NOT EXISTS (Select us.[ID] From dbo.Users us Where us.[Name]=@Name And us.[Password]=@OldEncryptedPassword)

			BEGIN
				--======================================================
				--==如果旧密码不匹配
				--======================================================
				SELECT @oResult=-2
				RETURN
			END
		ELSE
			BEGIN
				--======================================================
				--==如果旧密码匹配
				--======================================================
				IF (@NewEncryptedPassword<>@NewEncryptedPasswordRetype) OR (@NewPassword=N'') OR (@NewPasswordRetype=N'')
				
					BEGIN
						--======================================================
						--==如果新密码两次输入不一致
						--======================================================
						SELECT @oResult=-3
						RETURN
					END

				ELSE

					BEGIN
						--======================================================
						--==如果新密码两次输入一致（同时，旧密码也匹配；同时，用户也存在）
						--======================================================
						UPDATE dbo.[Users] SET [Password]=@NewEncryptedPassword WHERE [Name]=@Name
						SELECT @oResult=0
						RETURN
					END

			END
	END	


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserChangePassword]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PublicGetBannerContentLayerByMainDirectoryName    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PublicGetBannerContentLayerByMainDirectoryName]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PublicGetBannerContentLayerByMainDirectoryName]
GO

--====================================================================================
--==根据给定的 MainDirectoryName 从 MainDirectory 或 Community 表返回对应的 BannerContentLayer
--====================================================================================
--==版权所有 2001-2011 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2011-01-14
--====================================================================================

CREATE PROCEDURE dbo.PublicGetBannerContentLayerByMainDirectoryName

@MainDirectoryName nvarchar(100)				--表 MainDirectory / Community 的 MainDirectoryName

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--================================================
--==获得 （根据 @MainDirectoryName 来自 MainDirectory 还是 Community 决定从哪里获得）（系统的 MainDirectoryName 是不能重复的，不管是来自 MainDirectory 还是 Community）
--================================================

IF EXISTS (Select [ID] From dbo.MainDirectory Where [Name]=@MainDirectoryName)

BEGIN

	SELECT 

		md.BannerContentLayer AS BannerContentLayer

	FROM dbo.MainDirectory md WHERE md.[Name]=@MainDirectoryName

END

ELSE

BEGIN

	SELECT 

		co.BannerContentLayer AS BannerContentLayer

	FROM dbo.Community co WHERE co.[Name]=@MainDirectoryName

END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PublicGetBannerContentLayerByMainDirectoryName]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PublicSetBannerContentLayerByMainDirectoryName    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PublicSetBannerContentLayerByMainDirectoryName]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PublicSetBannerContentLayerByMainDirectoryName]
GO

--====================================================================================
--==根据给定的 MainDirectoryName 将 BannerContentLayer 写入 MainDirectory 或 Community 表
--====================================================================================
--==版权所有 2001-2011 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2011-01-14
--====================================================================================

CREATE PROCEDURE dbo.PublicSetBannerContentLayerByMainDirectoryName

@MainDirectoryName nvarchar(100),				--表 MainDirectory / Community 的 MainDirectoryName
@BannerContentLayer ntext					--表 MainDirectory / Community 的 BannerContentLayer

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--================================================
--==保存 （根据 @MainDirectoryName 是来自 MainDirectory 还是 Community 表，决定将 @BannerContentLayer 保存到 MainDirectory 还是 Community 表）（系统的 MainDirectoryName 是不会重复的，不管是来自 MainDirectory 还是 Community）
--================================================

IF EXISTS (Select [ID] From dbo.MainDirectory Where [Name]=@MainDirectoryName)

BEGIN

	UPDATE dbo.MainDirectory SET BannerContentLayer=@BannerContentLayer WHERE [Name]=@MainDirectoryName

END

ELSE

BEGIN

	UPDATE dbo.Community SET BannerContentLayer=@BannerContentLayer WHERE [Name]=@MainDirectoryName

END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PublicSetBannerContentLayerByMainDirectoryName]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ResourcesSave    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ResourcesSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ResourcesSave]
GO

--====================================================================================
--==保存 Resources
--==Tag 将冗余地保存在两个位置：1. Resources 表（以 "," 隔开的字符串）    2. ResourcesTags  （单一 Tag， 以 ResourcesID 对应 Resources 表）
--====================================================================================
--==系统 Score 机制：除了在 Resources 表有 Score 和 ScoreCount 记录之外，ResourcesScore 表还将保存每一次打分记录（ResourceID，打分者的 IP，打分时间，分数），每次打分都自动计算出平均值冗余保存到 Resources 表的 Score 列，打分次数也冗余保存到 ScoreCount 列。这样做的目的是为了快速返回某个资源的分数与打分次数，而不必每次都现计算
--==系统管理员在 ModifyResource 中，可以强行覆盖 Score 列的值，但 ScoreCount 不会覆盖，因为 Resources.Score 随时都是最新的，因此，系统管理员进入 ModifyResource 界面看到的分数也是准确的，他如果不想覆盖这个打分，可以不修改直接保存，这套分数依然保持不变
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2012-02-23
--====================================================================================

CREATE PROCEDURE dbo.ResourcesSave

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@LogicalPath nvarchar(2000),		--当前 Resource 的逻辑路径
@FileDate datetime,			--当前 Resource 的文件日期（最后一次修改的日期）
@DimensionWidth int,			--当前 Resource （如果是图片）的画面宽度
@DimensionHeight int,			--当前 Resource （如果是图片）的画面高度
@FileSize bigint,				--当前 Resource 的文件尺寸
@Tag nvarchar(1000),			--当前 Resource 的标签（以 "," 间隔多个标签）
@Title nvarchar(200),			--当前 Resource 的标题
@Summary ntext,			--当前 Resource 的概要
@Description ntext,			--当前 Resource 的描述
@Hidden bit,				--当前 Resource 是否隐藏
@Approved int,				--当前 Resource 是否审核通过
@ApproveMessage ntext,		--当前 Resource 的审核意见
@Score int				--当前 Resource 的评分

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （只要是 Admin ChiefEditor, ColumnEditor 三个权限都可以）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'AdminEditor',0,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==当前 @LogicalPath 对应的 Resources 记录 ID
--=====================================================
DECLARE @ResourcesID INT
SELECT @ResourcesID=res.[ID] FROM dbo.Resources res WHERE res.LogicalPath=@LogicalPath

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==已有 Score, ScoreCount
--=====================================================
/*
DECLARE @OldScore INT
DECLARE @OldScoreCount INT

SELECT @OldScore=res.Score FROM dbo.Resources res WHERE [ID]=@ResourcesID
SELECT @OldScoreCount=res.ScoreCount FROM dbo.Resources res WHERE [ID]=@ResourcesID

IF @OldScore=NULL OR @OldScore IS NULL
BEGIN
	SELECT @OldScore=0
END

IF @OldScoreCount=NULL OR @OldScoreCount IS NULL
BEGIN
	SELECT @OldScoreCount=0
END
*/

--=====================================================
--==ScoreCount 保持不变，该参数只有在用户打分的时候，才会累加到这里
--=====================================================
DECLARE @ScoreCount INT
SELECT @ScoreCount=res.ScoreCount FROM dbo.Resources res WHERE res.[ID]=@ResourcesID

IF @ScoreCount=NULL OR @ScoreCount IS NULL
BEGIN
	SELECT @ScoreCount=0
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==首先删除 Resources  中可能已经存在了的该文件的记录
--=====================================================
DELETE FROM dbo.Resources WHERE [ID]=@ResourcesID

--=====================================================
--==接着删除 ResourcesTags  中对应的 Tag 记录
--=====================================================
DELETE FROM dbo.ResourcesTags WHERE ResourcesID=@ResourcesID

--=====================================================
--==添加 Resources 记录
--=====================================================
INSERT INTO dbo.Resources(LogicalPath,FileDate,DimensionWidth,DimensionHeight,FileSize,Tag,Title,Summary,[Description],Hidden,Approved,ApproveMessage,ApprovedBy,Score,ScoreCount) VALUES(@LogicalPath,@FileDate,@DimensionWidth,@DimensionHeight,@FileSize,@Tag,@Title,@Summary,@Description,@Hidden,@Approved,@ApproveMessage,@User,@Score,@ScoreCount)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==立即捕获刚刚保存的那条消息的 ID
--======================================================
DECLARE @oNewID INT
SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==将 Tag （可能是“,” 隔开的列表）分解，保存在 ResourcesTags 表
--======================================================
INSERT INTO dbo.ResourcesTags(ResourcesID,Tag) SELECT @oNewID, Element FROM dbo.UDF_PublicSplit(@Tag,N',')

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ResourcesSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ResourcesSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ResourcesSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ResourcesSelect]
GO

--====================================================================================
--==根据给定的  LogicalPath 返回对应的 Tag
--====================================================================================
--==版权所有 2001-2013 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-02-23
--====================================================================================

CREATE PROCEDURE dbo.ResourcesSelect

--@User nvarchar(50),					--从 aspx 端传递过来的用户名

@LogicalPath nvarchar(2000)				--指定 Resource 的逻辑路径

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （只要是 Admin ChiefEditor, ColumnEditor 三个权限都可以）
--=====================================================
--DECLARE @oPass INT
--EXEC dbo.AdminEditorUserAuthentication @User,N'AdminEditor',0,@oPass OUT
--IF @oPass=0 BEGIN RETURN END
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择 Resources 表
--====================================================================================
SELECT
	res.[ID] AS [ID],
	res.LogicalPath AS LogicalPath,
	res.FileDate AS FileDate,
	res.DimensionWidth as DimensionWidth,
	res.DimensionHeight as DimensionHeight,
	res.FileSize as FileSize,
	res.Tag AS Tag,
	res.Title AS Title,
	res.Summary AS Summary,
	res.[Description] AS [Description],
	res.Hidden AS Hidden,
	res.Approved AS Approved,
	res.ApproveMessage AS ApproveMessage,
	res.ApprovedBy AS ApprovedBy,
	res.Score AS Score,
	res.ScoreCount AS ScoreCount

FROM dbo.Resources res

WHERE res.LogicalPath=@LogicalPath


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ResourcesSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ResourcesQueryByTag    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ResourcesQueryByTag]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ResourcesQueryByTag]
GO

--====================================================================================
--==以 Tag 搜索 Resources
--==参数：搜索 Tag （可以是英文逗号隔开的多个 Tag，或者用 + 连接的多个关键词 ： 英文逗号是“或者” 的意思，加号是“并且” 的意思）
--==建立分页机制，先将正常查询结果存入一个结构一样（但多了一个PagingID的表变量），根据PagingID，@PageSize，@CurrentPage选取当前页的记录，并将总页数作为一个追加栏位输出
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-02-23
--====================================================================================

CREATE PROCEDURE dbo.ResourcesQueryByTag

@User nvarchar(50),			--从 aspx 端传递过来的用户名

@Tag nvarchar(1000),			--搜索 Tag （如： N'Logo,Banner'      或者  N'*'     或者   N'视频+广告'）

@SearchDirectory nvarchar(2000),	--从哪个目录下搜索  （注：在调用该 SP 时，为该 SP 提供参数的时候，@SearchDirectory 已经确保包含了最后的 "/"，如 /writable/resource/ ）
@IncludeSubdirectory bit,		--搜索的时候是否包含下级目录

@OrderBy nvarchar(100),		--进行排序的列名
@OrderByOrder nvarchar(10),		--排序方式 ASC, DESC （注意：为了兼容 SQL Server 2000，暂不使用 Order By 变量）

@PageSize INT,			--页码机制：每页的尺寸
@CurrentPage INT			--页码机制：当前页

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==对 @Tag 参数进行处理，将其中的 “*” 通配符换成 %
--=====================================================
SET @Tag=REPLACE(@Tag,N'*',N'%')

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （只要是 Admin ChiefEditor, ColumnEditor 三个权限都可以）（注：2010-07-12：由于引入了 Resource Reference 机制，因此，现在不能再限制该 SP 的权限，因为在 Resource Reference 中，很可能发生普通访问者的页面引用 Resource 的情形）
--=====================================================
--DECLARE @oPass INT
--EXEC dbo.AdminEditorUserAuthentication @User,N'AdminEditor',0,@oPass OUT
--IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==创建分页表 
--=====================================================
SET NOCOUNT ON

DECLARE @Paging TABLE
( 
	PagingID int identity(1,1), 
	[ID] int, 
	LogicalPath nvarchar(2000) COLLATE database_default, 
	[FileName] nvarchar(2000) COLLATE database_default, 
	FileDate datetime,
	DimensionWidth int,
	DimensionHeight int,
	FileSize bigint,
	Tag nvarchar(1000) COLLATE database_default,
	Title nvarchar(200)  COLLATE database_default,
	Summary nvarchar(4000) COLLATE database_default,
	[Description] nvarchar(4000) COLLATE database_default,
	Hidden bit,
	Approved int,
	ApproveMessage nvarchar(4000) COLLATE database_default,
	ApprovedBy nvarchar(50) COLLATE database_default,
	Score int,
	ScoreCount int
 ) 

--=====================================================
--==从 Option 表查看 ResourceApprove 属性
--=====================================================
DECLARE @ResourceApprove NVARCHAR(50)
SELECT @ResourceApprove=CONVERT(NVARCHAR(50),opt.[Value]) FROM dbo.[Option] opt WHERE opt.[Key]=N'ResourceApprove'

--=====================================================
--==参数 @OrderBy 和 @OrderByOrder 初始化
--=====================================================
IF @OrderBy=N'' OR @OrderBy=NULL OR @OrderBy IS NULL

BEGIN
	SELECT @OrderBy=N'FileDate'
END

IF @OrderByOrder=N'' OR @OrderByOrder=NULL OR @OrderByOrder IS NULL

BEGIN
	SELECT @OrderByOrder=N'DESC'
END

--=====================================================
--==填充分页表 （分 @IncludeSubdirectory=1/0 两种情形）
--=====================================================
IF @IncludeSubdirectory=1

BEGIN

	--=====================================================
	--==根据当前用户角色分两种情况 （系统管理员返回全部，非系统管理员只返回 Hidden=false 以及 Approved=1 的项目）
	--=====================================================
	IF dbo.UDF_UserAdmin(@User)=1

	BEGIN

		--=====================================================
		--==搜索《包含》下级目录 |  当前用户《是》 Admin
		--=====================================================

		--=====================================================
		--不同的 OrderBy 和 OrderByOrder  （以下 6 段代码唯一的区别是  Order By 从句）
		--=====================================================
		IF @OrderBy=N'FileName' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(@SearchDirectory,res.LogicalPath)>0		
		ORDER BY [FileName] ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileDate' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(@SearchDirectory,res.LogicalPath)>0		
		ORDER BY res.FileDate ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileScore' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(@SearchDirectory,res.LogicalPath)>0		
		ORDER BY res.Score ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileName' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(@SearchDirectory,res.LogicalPath)>0		
		ORDER BY [FileName] DESC
		--========================

		END

		ELSE IF @OrderBy=N'FileDate' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(@SearchDirectory,res.LogicalPath)>0		
		ORDER BY res.FileDate DESC
		--========================

		END

		ELSE IF @OrderBy=N'FileScore' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(@SearchDirectory,res.LogicalPath)>0		
		ORDER BY res.Score DESC
		--========================

		END

	END

	ELSE

	BEGIN

		--=====================================================
		--==搜索《包含》下级目录 |  当前用户《不是》 Admin
		--=====================================================

		--=====================================================
		--不同的 OrderBy 和 OrderByOrder  （以下 6 段代码唯一的区别是  Order By 从句）
		--=====================================================
		IF @OrderBy=N'FileName' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(@SearchDirectory,res.LogicalPath)>0 AND res.Hidden<>1 AND (res.Approved=1 OR @ResourceApprove=N'false')		
		ORDER BY [FileName] ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileDate' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(@SearchDirectory,res.LogicalPath)>0 AND res.Hidden<>1 AND (res.Approved=1 OR @ResourceApprove=N'false')		
		ORDER BY res.FileDate ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileScore' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(@SearchDirectory,res.LogicalPath)>0 AND res.Hidden<>1 AND (res.Approved=1 OR @ResourceApprove=N'false')		
		ORDER BY res.Score ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileName' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(@SearchDirectory,res.LogicalPath)>0 AND res.Hidden<>1 AND (res.Approved=1 OR @ResourceApprove=N'false')		
		ORDER BY [FileName] DESC
		--========================

		END

		ELSE IF @OrderBy=N'FileDate' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(@SearchDirectory,res.LogicalPath)>0 AND res.Hidden<>1 AND (res.Approved=1 OR @ResourceApprove=N'false')		
		ORDER BY res.FileDate DESC
		--========================

		END

		ELSE IF @OrderBy=N'FileScore' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(@SearchDirectory,res.LogicalPath)>0 AND res.Hidden<>1 AND (res.Approved=1 OR @ResourceApprove=N'false')		
		ORDER BY res.Score DESC
		--========================

		END

	END

END

ELSE

BEGIN

	--=====================================================
	--==根据当前用户角色分两种情况 （系统管理员返回全部，非系统管理员只返回 Hidden=false 以及 Approved=1 的项目）
	--=====================================================
	IF dbo.UDF_UserAdmin(@User)=1

	BEGIN

		--=====================================================
		--==搜索《不》包含下级目录 |  当前用户《是》 Admin
		--=====================================================

		--=====================================================
		--不同的 OrderBy 和 OrderByOrder  （以下 6 段代码唯一的区别是  Order By 从句）
		--=====================================================
		IF @OrderBy=N'FileName' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0		
		ORDER BY [FileName] ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileDate' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]

		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0		
		ORDER BY res.FileDate ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileScore' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		

			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0		
		ORDER BY res.Score ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileName' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0		
		ORDER BY [FileName] DESC
		--========================

		END

		IF @OrderBy=N'FileDate' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0		
		ORDER BY res.FileDate DESC
		--========================

		END

		IF @OrderBy=N'FileScore' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0		
		ORDER BY res.Score DESC
		--========================

		END

	END

	ELSE

	BEGIN

		--=====================================================
		--==搜索《不》包含下级目录 |  当前用户《不是》Admin
		--=====================================================

		--=====================================================
		--不同的 OrderBy 和 OrderByOrder  （以下 6 段代码唯一的区别是  Order By 从句）
		--=====================================================
		IF @OrderBy=N'FileName' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0 AND res.Hidden<>1 AND (res.Approved=1 OR @ResourceApprove=N'false')		
		ORDER BY [FileName] ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileDate' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0 AND res.Hidden<>1 AND (res.Approved=1 OR @ResourceApprove=N'false')		
		ORDER BY res.FileDate ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileScore' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0 AND res.Hidden<>1 AND (res.Approved=1 OR @ResourceApprove=N'false')		
		ORDER BY res.Score ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileName' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0 AND res.Hidden<>1 AND (res.Approved=1 OR @ResourceApprove=N'false')		
		ORDER BY [FileName] DESC
		--========================

		END

		ELSE IF @OrderBy=N'FileDate' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0 AND res.Hidden<>1 AND (res.Approved=1 OR @ResourceApprove=N'false')		
		ORDER BY res.FileDate DESC
		--========================

		END

		ELSE IF @OrderBy=N'FileScore' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		LEFT JOIN dbo.ResourcesTags rest ON rest.ResourcesID=res.[ID]
		LEFT JOIN (Select [Element] From dbo.UDF_PublicSplit(@Tag,N',')) st ON (RTRIM(LTRIM(ISNULL(rest.Tag,N''))) Like (N'%' + RTRIM(LTRIM(st.[Element])) + N'%')) OR (dbo.UDF_PublicListStrictMatch(st.[Element],N'+',res.Tag,N',')=1)		
		WHERE st.[Element] IS NOT NULL AND st.[Element]<>N'' AND CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0 AND res.Hidden<>1 AND (res.Approved=1 OR @ResourceApprove=N'false')		
		ORDER BY res.Score DESC
		--========================

		END

	END

END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
--=====================================================
--==最后从 @Paging 表变量中获取数据
--=====================================================
Declare @FirstRecord int
Declare @LastRecord int
		
set @FirstRecord=(@CurrentPage - 1) * @PageSize	--当前页第一个记录前
set @LastRecord=(@CurrentPage * @PageSize + 1)	--当前页最后一个记录后
		
--=====================================================
--==总记录数，除以每页的记录数，用Ceiling()处理，得到的为页数 （注意：count(*)  和 @PageSize 都为 INT，它们相除将得到 INT，所以，首先要将它们转换成 Decimal(18,2)）
--=====================================================

SELECT 
	*,
	PageCount=CEILING (Convert(decimal(18,2),(select count(*) from @Paging)) / Convert(decimal(18,2),@PageSize)) 

FROM @Paging

WHERE PagingID>@FirstRecord AND PagingID<@LastRecord


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

RETURN

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ResourcesQueryByTag]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ResourcesDelete    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ResourcesDelete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ResourcesDelete]
GO

--====================================================================================
--==删除 Resources
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.ResourcesDelete

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@LogicalPath nvarchar(2000)		--当前 Resource 的逻辑路径

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （只要是 Admin ChiefEditor, ColumnEditor 三个权限都可以）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'AdminEditor',0,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==删除 Resources 中的记录 （Resources 表上有 Trigger，删除 Resources 记录后，会随之删除 ResourcesTags 表中对应记录）
--=====================================================
DELETE FROM dbo.Resources WHERE LogicalPath=@LogicalPath

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ResourcesDelete]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ResourcesMove    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ResourcesMove]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ResourcesMove]
GO

--====================================================================================
--==移动 Resources
--==将 Resources 表中 OldLogicalPath 对应的记录修改为 NewLogicalPath
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.ResourcesMove

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@OldLogicalPath nvarchar(2000),		--旧 Resource 记录的逻辑路径
@NewLogicalPath nvarchar(2000)		--新 Resource 记录的逻辑路径


AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （只要是 Admin ChiefEditor, ColumnEditor 三个权限都可以）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'AdminEditor',0,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将旧 LogicalPath 修改为新 LogicalPath
--=====================================================
UPDATE dbo.Resources SET LogicalPath=@NewLogicalPath WHERE LogicalPath=@OldLogicalPath

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ResourcesMove]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ResourcesCopy    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ResourcesCopy]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ResourcesCopy]
GO

--====================================================================================
--==复制 Resources
--==Tag 将冗余地保存在两个位置：1. Resources 表（以 "," 隔开的字符串）    2. ResourcesTags  （单一 Tag， 以 ResourcesID 对应 Resources 表）
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2012-02-23
--====================================================================================

CREATE PROCEDURE dbo.ResourcesCopy

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@SourceLogicalPath nvarchar(2000),	--源 Resources
@TargetLogicalPath nvarchar(2000)	--目标 Resources

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （只要是 Admin ChiefEditor, ColumnEditor 三个权限都可以）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'AdminEditor',0,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==复制 Resources
--=====================================================
DECLARE @FileDate datetime
DECLARE @DimensionWidth int
DECLARE @DimensionHeight int
DECLARE @FileSize bigint
DECLARE @Tag nvarchar(1000)
DECLARE @Title nvarchar(200)
DECLARE @Summary nvarchar(4000)
DECLARE @Description nvarchar(4000)
DECLARE @Hidden bit
DECLARE @Approved int
DECLARE @ApproveMessage nvarchar(4000)
DECLARE @ApprovedBy nvarchar(50)
DECLARE @Score int
DECLARE @ScoreCount int

SELECT 
	
	@FileDate=res.FileDate,
	@DimensionWidth=res.DimensionWidth,
	@DimensionHeight=res.DimensionHeight,
	@FileSize=res.FileSize,
	@Tag=res.Tag,
	@Title=res.Title,
	@Summary=CONVERT(NVARCHAR(4000),res.Summary),
	@Description=CONVERT(NVARCHAR(4000),res.[Description]),
	@Hidden=res.Hidden,
	@Approved=res.Approved,
	@ApproveMessage=CONVERT(NVARCHAR(4000),res.ApproveMessage),
	@ApprovedBy=res.ApprovedBy,
	@Score=res.Score,
	@ScoreCount=res.ScoreCount 

FROM dbo.Resources res 
WHERE res.LogicalPath=@SourceLogicalPath

INSERT INTO dbo.Resources (LogicalPath,FileDate,DimensionWidth,DimensionHeight,FileSize,Tag,Title,Summary,[Description],Hidden,Approved,ApproveMessage,ApprovedBy,Score,ScoreCount) VALUES (@TargetLogicalPath,@FileDate,@DimensionWidth,@DimensionHeight,@FileSize,@Tag,@Title,@Summary,@Description,@Hidden,@Approved,@ApproveMessage,@ApprovedBy,@Score,@ScoreCount)

--======================================================
--==立即捕获刚刚保存的那条消息的 ID
--======================================================
DECLARE @oNewID INT
SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==将 Tag （可能是“,” 隔开的列表）分解，保存在 ResourcesTags 表
--======================================================
INSERT INTO dbo.ResourcesTags(ResourcesID,Tag) SELECT @oNewID, Element FROM dbo.UDF_PublicSplit(@Tag,N',')

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ResourcesCopy]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserGroupSave    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserGroupSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserGroupSave]
GO

--====================================================================================
--==保存 UserGroup
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.UserGroupSave

@User nvarchar(50),				--从 ASPX 端传递过来的当前登录用户名（权限）

@GroupName nvarchar(50),			--当前组名
@RegisterDefault int,				--是否注册用户默认组（1/2）

@oNewID int OUT				--新记录的 ID ，输出参数

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--=====================================================
--==参数清洁
--=====================================================
SET @GroupName=LTRIM(RTRIM(@GroupName))

--=====================================================
--==参数检查
--=====================================================
IF (@GroupName=N'') OR (@GroupName IS NULL)
BEGIN
	RAISERROR(N'组名不能为空。',16,1)
	RETURN
END

--=====================================================
--==如果组已经存在，则举错
--=====================================================
IF EXISTS (Select ug.[ID] from dbo.UserGroup ug Where ug.GroupName=@GroupName)
BEGIN
	RAISERROR(N'该组已经存在。',16,1)
	RETURN
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加 UserGroup
--=====================================================
INSERT INTO dbo.UserGroup (GroupName,RegisterDefault) VALUES (@GroupName,@RegisterDefault)

--======================================================
--==立即捕获刚刚保存的那条消息的 ID
--======================================================
SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Session 内的本表）


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserGroupSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserGroupsSave    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserGroupsSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserGroupsSave]
GO

--====================================================================================
--==保存 UserGroups
--==为什么单独保存 UserGroups 而不是在 UserGroupSave 中直接使用 "abc,eft,xyz" 一类的字符串传递 GroupMembers 直接保存？：因为要考虑用户量庞大的情形，如果使用字符串传递所有 GroupMembers 列表，必须用到 UDF_PublicSplit() 函数，而该函数的输入参数有 4000 字符限制。
--==本 SP 可能被大量调用，因此必须保证其性能。
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.UserGroupsSave

@User nvarchar(50),				--从 ASPX 端传递过来的当前登录用户名（权限）

@UserGroupID int,				--组 ID
@GroupMember nvarchar(50)			--成员

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加 UserGroups 记录 （注意，本 SP 可能被大量调用，因此必须保证其性能，因此，这里并不检查当期 UserGroup 下是否已经保存过当前 Member，相反，我们在 UserGroupSave 那里对 UserGroups 表中的 Member 作一清理先）
--=====================================================
INSERT INTO dbo.UserGroups (UserGroupID,[User]) VALUES (@UserGroupID,@GroupMember)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserGroupsSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserGroupModify    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserGroupModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserGroupModify]
GO

--====================================================================================
--==修改 UserGroup
--==修改 UserGroup 后，我们需要将 UserGroups 下对应的 Member 全删除，因为在运行 SP UserGroupModify  的场合，必然会跟着大量 SP UserGroupsSave 的运行以保存新的 Member 情况，因此，将旧的 Member 设定删除是应该的。
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.UserGroupModify

@User nvarchar(50),				--从 ASPX 端传递过来的当前登录用户名（权限）

@ID int,						--被修改组的 ID
@GroupName nvarchar(50),			--新组名
@RegisterDefault int				--是否注册用户默认组（1/2）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--=====================================================
--==参数清洁
--=====================================================
SET @GroupName=LTRIM(RTRIM(@GroupName))

--=====================================================
--==参数检查
--=====================================================
IF (@GroupName=N'') OR (@GroupName IS NULL)
BEGIN
	RAISERROR(N'组名不能为空。',16,1)
	RETURN
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==修改 UserGroup
--=====================================================
UPDATE dbo.UserGroup SET GroupName=@GroupName, RegisterDefault=@RegisterDefault  WHERE [ID]=@ID

--=====================================================
--==删除对应的 UserGroups 记录 （在 UserGroupSave cs 中，会再次保存新的 Group 成员表）
--=====================================================
DELETE FROM dbo.UserGroups WHERE UserGroupID=@ID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserGroupModify]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserGroupSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserGroupSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserGroupSelect]
GO

--====================================================================================
--==返回所有 UserGroup 记录
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.UserGroupSelect

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

SELECT 
	[ID],
	GroupName,
	RegisterDefault

FROM dbo.UserGroup ORDER BY GroupName

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserGroupSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserGroupsSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserGroupsSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserGroupsSelect]
GO

--====================================================================================
--==从 UserGroups 表返回当前 UserGroup 对应的  members
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.UserGroupsSelect

@UserGroupID int				--指定 UserGroup

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择 UserGroups 表
--====================================================================================
SELECT 
	ugs.[ID] AS [ID],
	ugs.UserGroupID AS  UserGroupID,
	ugs.[User] AS GroupMember

FROM dbo.UserGroups ugs

WHERE ugs.UserGroupID=@UserGroupID


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserGroupsSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserGroupDelete    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserGroupDelete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserGroupDelete]
GO

--====================================================================================
--==删除用户组  UserGroup 中使用了 Trigger，删除 UserGroup 后会自动删除对应的 UserGroups 中的记录
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.UserGroupDelete

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@ID int				--即将被删除的 UserGroup 的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--========================================
--==权限检查
--========================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--========================================
--==删除 UserGroup
--========================================
DELETE FROM dbo.UserGroup WHERE [ID]=@ID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserGroupDelete]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserGroupQuery    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserGroupQuery]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserGroupQuery]
GO

--====================================================================================
--==这个 SP 的作用：根据更多的线索，查询用户组
--==参数：所有检索线索作为参数，如果参数为NULL, 则该项不参与检索
--==建立分页机制，先将正常查询结果存入一个结构一样（但多了一个PagingID的表变量），根据PagingID，@PageSize，@CurrentPage选取当前页的记录，并将总页数作为一个追加栏位输出
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.UserGroupQuery

@GroupName nvarchar(50),	--用户组

@PageSize INT,		--页码机制：每页的尺寸
@CurrentPage INT,		--页码机制：当前页
@OrderBy nvarchar(100),	--进行排序的列名
@OrderByOrder nvarchar(10)	--排序方式 ASC, DESC

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==参数的逃逸处理（仅在存在动态语句的地方使用）
--=====================================================
SET @GroupName=dbo.UDF_PublicStringEscape(@GroupName)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==权限检查（不需要）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==动态查询语句中可能出现 Unicode 字符（比如：FirstName='刘'），nvarchar()不能超过4000，而下面两个动态语句最后还要连接到一起，所以定义为 nvarchar(4000)
--==用动态SQL语句来完成统计(注意：要加上Set Nocount on 消除对最终输出记录集的影响)
--==用来构建Where从句
--=====================================================
DECLARE @DynSQL NVARCHAR(4000)      
DECLARE @DynWhere NVARCHAR(4000) 

--=====================================================
--==创建分页表 
--=====================================================
SET @DynSQL=N' SET NOCOUNT ON   '
SET @DynSQL=@DynSQL + N' Declare @Paging table '
SET @DynSQL=@DynSQL + N' ( '
SET @DynSQL=@DynSQL + N' PagingID int identity(1,1), '
SET @DynSQL=@DynSQL + N' [ID] INT, '
SET @DynSQL=@DynSQL + N' [GroupName] nvarchar(50) COLLATE database_default,  '
SET @DynSQL=@DynSQL + N' RegisterDefault INT, '
SET @DynSQL=@DynSQL + N' GroupMembersCount INT '	
SET @DynSQL=@DynSQL + N' ) '

--=====================================================
--==填充分页表 
--=====================================================
SET @DynSQL=@DynSQL + N' Insert into @Paging '

SET @DynSQL=@DynSQL + N' Select distinct   '  
SET @DynSQL=@DynSQL + N' ug.[ID] as [ID], '
SET @DynSQL=@DynSQL + N' ug.GroupName as GroupName, '
SET @DynSQL=@DynSQL + N' ug.RegisterDefault as RegisterDefault, '
SET @DynSQL=@DynSQL + N' (select COUNT(ugs.[ID]) from dbo.UserGroups ugs where ugs.UserGroupID=ug.[ID]) as GroupMembersCount '

SET @DynSQL=@DynSQL + N' From dbo.UserGroup ug '

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==WHERE 1=1 巧妙地避免了下面动态 WHERE 从句中的 ‘AND’ 问题
--=====================================================
SET @DynSQL=@DynSQL + N' WHERE 1=1 '

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==其它动态 WHERE 从句
--=====================================================
SET @DynWhere=N''

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@GroupName 统计线索（等于0或者空字符表示不参与统计限制: 这里支持模糊统计 :）
--=====================================================
IF @GroupName IS NOT NULL   
BEGIN
	--=====================================================
	--==滤掉空格 (因为 @GroupName 可能为NULL,所以将滤除空格的操作放到这里)
	--=====================================================
	SET @GroupName=RTRIM(LTRIM(@GroupName)) 
	IF @GroupName<>N'' 
	BEGIN
		If CHARINDEX (N'*' , @GroupName) >=1
		Begin   set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(ug.[GroupName])) like ''' + REPLACE(@GroupName,N'*',N'%') + N'''' End
		Else
		Begin   set @DynWhere=@DynWhere + N' and RTRIM(LTRIM(ug.[GroupName]))=''' + @GroupName + N'''' End
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--===========================================================
--==前面的 SQL 语句最后加 其它动态 WHERE 从句 （@DynSQL 中已经包含 WHERE 1=1）
--===========================================================
SET @DynSQL=@DynSQL + @DynWhere

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==加上 Order By 从句
--==如果 OrderBy='' 则，使用缺省 order by Name ASC
--=====================================================
SET @OrderBy=LTRIM(RTRIM(@OrderBy))
SET @OrderByOrder=LTRIM(RTRIM(@OrderByOrder))

IF LEN(@OrderBy)=0 OR  LEN(@OrderByOrder)=0

	BEGIN
	SET @DynSQL=@DynSQL + N' order by [GroupName] ASC '
	END
ELSE
	BEGIN
	SET @DynSQL=@DynSQL + N' order by [' + @OrderBy + N'] ' + @OrderByOrder
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==最后从 @Paging 表变量中获取数据
--===================================================== 
Declare @FirstRecord int
Declare @LastRecord int

set @FirstRecord=(@CurrentPage - 1) * @PageSize	--当前页第一个记录前
set @LastRecord=(@CurrentPage * @PageSize + 1)	--当前页最后一个记录后

--=====================================================
--==总记录数，除以每页的记录数，用Ceiling()处理，得到的为页数 （注意：count(*)  和 @PageSize 都为 INT，它们相除将得到 INT，所以，首先要将它们转换成 Decimal(18,2)）
--=====================================================
set @DynSQL=@DynSQL + N' Select *,PageCount=CEILING (Convert(decimal(18,2),(select count(*) from @Paging)) / Convert(decimal(18,2),' + Convert(nvarchar(20),@PageSize) + N')) From @Paging Where PagingID>' + Convert(nvarchar(20),@FirstRecord) + N' and PagingID<' + Convert(nvarchar(20),@LastRecord)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--============================================
--==检查动态语句的长度，不可以超过系统上限
--============================================
DECLARE @oPassDynSQL INT
EXEC dbo.PublicDynSQLLengthCheck @DynSQL,@oPassDynSQL OUT
IF @oPassDynSQL=0 BEGIN RETURN END

--=====================================================
--==执行动态 SQL 语句， 开始统计
--=====================================================
EXEC(@DynSQL)
RETURN

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserGroupQuery]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserUserGroupsSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserUserGroupsSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserUserGroupsSelect]
GO

--====================================================================================
--==从 UserGroups 表返回指定用户的 UserGroupID 和 GroupName （即：指定用户所属的组）
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.UserUserGroupsSelect

@UserName  nvarchar(50)				--指定用户

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择 UserGroups 表
--====================================================================================
SELECT DISTINCT

	ugs.UserGroupID AS  UserGroupID,
	ug.GroupName AS GroupName

FROM dbo.UserGroups ugs
INNER JOIN dbo.UserGroup ug ON ug.[ID]=ugs.UserGroupID

WHERE ugs.[User]=@UserName


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserUserGroupsSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgePermissionSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgePermissionSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgePermissionSelect]
GO

--====================================================================================
--==根据给定的 KnowledgeDirectory （MainDirectory, SubDirectory, PageDirectory, Knowledge） 返回相应的 Editor, DedicatedTo, CommentsPermission
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-22
--====================================================================================

CREATE PROCEDURE dbo.KnowledgePermissionSelect

@User NVARCHAR(50),				--从 ASPX 传递过来的用户

@KnowledgeDirectory NVARCHAR(100),		--当前 KnowledgeDirectory
@Parent INT,					--当前 Knowledge 的 Parent ID

@Culture NVARCHAR(50),			--指定文化

@CurrentPage INT				--页码机制：当前页

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择不同 KnowledgeDirectory 
--====================================================================================
IF @KnowledgeDirectory=N'MainDirectory'

	--============================================================
	--==MainDirectory
	--============================================================
	BEGIN
		SELECT

			md.[ID] AS [ID],
			md.Serial AS Serial,
			mdc.Hidden AS Hidden,
			mdc.HiddenInNavigationOnly AS HiddenInNavigationOnly,
			md.Editor AS Editor,
			md.DedicatedTo AS DedicatedTo,
			md.CommentsPermission AS CommentsPermission,
			mdc.Title AS Title

		FROM dbo.MainDirectory md
		LEFT JOIN dbo.MainDirectoryContent mdc ON mdc.MainDirectoryID=md.[ID] AND mdc.Culture=@Culture		

		ORDER BY Serial
	END

ELSE IF @KnowledgeDirectory=N'SubDirectory'

	--============================================================
	--==SubDirectory
	--============================================================
	BEGIN
		SELECT

			sd.[ID] AS [ID],
			sd.Serial AS Serial,
			sdc.Hidden AS Hidden,
			sdc.HiddenInNavigationOnly AS HiddenInNavigationOnly,
			sd.Overview AS Overview,
			sd.Editor AS Editor,
			sd.DedicatedTo AS DedicatedTo,
			sd.CommentsPermission AS CommentsPermission,
			sdc.Title AS Title

		FROM dbo.SubDirectory sd
		LEFT JOIN dbo.SubDirectoryContent sdc ON sdc.SubDirectoryID=sd.[ID] AND sdc.Culture=@Culture

		WHERE sd.[MainDirectoryID]=@Parent

		ORDER BY Serial
	END

ELSE IF @KnowledgeDirectory=N'PageDirectory'

	--============================================================
	--==PageDirectory
	--============================================================
	BEGIN
		SELECT

			pd.[ID] AS [ID],
			pd.Serial AS Serial,
			pdc.Hidden AS Hidden,
			pdc.HiddenInNavigationOnly AS HiddenInNavigationOnly,
			pd.Overview AS Overview,
			pd.Editor AS Editor,
			pd.DedicatedTo AS DedicatedTo,
			pd.CommentsPermission AS CommentsPermission,
			pdc.Title AS Title

		FROM dbo.PageDirectory pd
		LEFT JOIN dbo.PageDirectoryContent pdc ON pdc.PageDirectoryID=pd.[ID] AND pdc.Culture=@Culture

		WHERE pd.[SubDirectoryID]=@Parent

		ORDER BY Serial
	END

ELSE 

	--============================================================
	--==Knowledge
	--============================================================
	BEGIN

		--====================================================================================
		--==获得当前 PageDirectory  的 Type 值，如果是 1，则我们后面的结果将使用 Order By Serial （普通内容，以 Serial 排序）； 如果是 2 则 Order By UpdateTime （基于时间的内容以发布时间排序）
		--====================================================================================
		DECLARE @Type INT
		SELECT @Type=Type FROM dbo.PageDirectory WHERE [ID]=@Parent

		--====================================================================================
		--==获得 @PageDirectoryName  所在的 PageDirectory 记录中的 PageSize 值
		--====================================================================================
		DECLARE @PageSize INT
		SELECT TOP 1 @PageSize=PageSize FROM dbo.PageDirectory WHERE [ID]=@Parent

		--====================================================================================
		--==建立分页
		--====================================================================================
		DECLARE @Paging TABLE 
		( 
			PagingID int identity(1,1), 
			[ID] int, 
			Serial int,
			Hidden bit,
			Approved int,
			UpdateTime datetime,
			Author nvarchar(50) COLLATE database_default, 		
			Editor ntext COLLATE database_default, 
			DedicatedTo ntext COLLATE database_default, 
			CommentsPermission ntext COLLATE database_default,			
			Title nvarchar(2000) COLLATE database_default,
			PageDirectoryName nvarchar(100) COLLATE database_default
		) 

		--====================================================================================
		--==根据 @Type 不同，按 Serial 和 UpdateTime 排序
		--====================================================================================
		IF @Type=1

		BEGIN
			INSERT INTO @Paging
	
			SELECT
				now.[ID] AS [ID],
				now.Serial AS Serial,
				nowc.Hidden AS Hidden,
				nowc.Approved AS Approved,
				now.UpdateTime AS UpdateTime,
				now.Author AS Author,
				now.Editor AS Editor,
				now.DedicatedTo AS DedicatedTo,
				now.CommentsPermission AS CommentsPermission,
				nowc.Title AS Title,
				pd.[Name] AS PageDirectoryName
	
			FROM dbo.Knowledge now
			LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
			LEFT JOIN dbo.PageDirectory pd ON pd.[ID]=now.PageDirectoryID
			WHERE now.[PageDirectoryID]=@Parent

			ORDER BY Serial
		END

		ELSE

		BEGIN
			INSERT INTO @Paging
	
			SELECT
				now.[ID] AS [ID],
				now.Serial AS Serial,
				nowc.Hidden AS Hidden,
				nowc.Approved AS Approved,
				now.UpdateTime AS UpdateTime,
				now.Author AS Author,
				now.Editor AS Editor,
				now.DedicatedTo AS DedicatedTo,
				now.CommentsPermission AS CommentsPermission,
				nowc.Title AS Title,
				pd.[Name] AS PageDirectoryName
	
			FROM dbo.Knowledge now
			LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
			LEFT JOIN dbo.PageDirectory pd ON pd.[ID]=now.PageDirectoryID
			WHERE now.[PageDirectoryID]=@Parent

			ORDER BY UpdateTime DESC
		END

		--=====================================================
		--==最后从 @Paging 表变量中获取当前页第一个和最后一个记录的位置
		--=====================================================
		DECLARE @FirstRecord int
		DECLARE @LastRecord int
				
		SET @FirstRecord=(@CurrentPage - 1) * @PageSize
		SET @LastRecord=(@CurrentPage * @PageSize + 1)
		
		--=====================================================
		--==返回当前页中的记录
		--==总记录数，除以每页的记录数，用Ceiling()处理，得到的为页数 （注意：count(*)  和 @PageSize 都为 INT，它们相除将得到 INT，所以，首先要将它们转换成 Decimal(18,2)）
		--=====================================================
		SELECT 	
			*,
			PageCount=CEILING(Convert(decimal(18,2),(select count(*) from @Paging)) / Convert(decimal(18,2),@PageSize)) 
		
		FROM @Paging 
		WHERE PagingID>@FirstRecord AND PagingID<@LastRecord

	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgePermissionSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeApproveQuery    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeApproveQuery]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeApproveQuery]
GO

--====================================================================================
--==这个 SP 的作用：获取当前用户（Edmin Editor）权限下的内容审核列表 
--==对某个内容拥有上级编辑权限的用户，即：拥有某个内容上级（PageDirectory, SubDirectory, MainDirectory）编辑权限，以及 ChiefEditor, Admin 权限的用户
--==建立分页机制，先将正常查询结果存入一个结构一样（但多了一个PagingID的表变量），根据PagingID，@PageSize，@CurrentPage选取当前页的记录，并将总页数作为一个追加栏位输出
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-04-08 
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeApproveQuery

@User nvarchar(50),			--从 ASPX 端传递来的用户

@Culture nvarchar(100),			--只返回指定语种
@ApproveQueryFlag int,			--查询 “待审核 |  已审核 |  我的审核”   （分别取值  0，1，2）

@PageSize INT,			--页码机制：每页的尺寸
@CurrentPage INT,			--页码机制：当前页
@OrderBy nvarchar(100),		--进行排序的列名
@OrderByOrder nvarchar(10)		--排序方式 ASC, DESC

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==权限检查（不需要）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用来构建 Where 从句
--=====================================================
DECLARE @DynSQL NVARCHAR(4000)    
DECLARE @DynWhere NVARCHAR(4000)

--=====================================================
--==创建分页表 
--=====================================================
SET @DynSQL=N' SET NOCOUNT ON   '
SET @DynSQL=@DynSQL + N' Declare @Paging table '
SET @DynSQL=@DynSQL + N' ( '
SET @DynSQL=@DynSQL + N' PagingID int identity(1,1), '
SET @DynSQL=@DynSQL + N' [ID] int, '
SET @DynSQL=@DynSQL + N' KnowledgeID int, '
SET @DynSQL=@DynSQL + N' UpdateTime datetime, '
SET @DynSQL=@DynSQL + N' Title nvarchar(2000) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' Breadcrumb nvarchar(1500) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' Culture nvarchar(100) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' Hidden bit, '
SET @DynSQL=@DynSQL + N' Approved int, '
SET @DynSQL=@DynSQL + N' ApprovedBy nvarchar(50) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' Author nvarchar(50) COLLATE database_default, '
--SET @DynSQL=@DynSQL + N' Editor nvarchar(50) COLLATE database_default, '
--SET @DynSQL=@DynSQL + N' PageDirectoryEditor nvarchar(50) COLLATE database_default, '
--SET @DynSQL=@DynSQL + N' SubDirectoryEditor nvarchar(50) COLLATE database_default, '
--SET @DynSQL=@DynSQL + N' MainDirectoryEditor nvarchar(50) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' PageDirectoryName nvarchar(100) COLLATE database_default '
SET @DynSQL=@DynSQL + N' ) '

--=====================================================
--==填充分页表 
--=====================================================
SET @DynSQL=@DynSQL + N' Insert into @Paging '

SET @DynSQL=@DynSQL + N' Select    '  
SET @DynSQL=@DynSQL + N' nowc.[ID] as [ID], '
SET @DynSQL=@DynSQL + N' now.[ID] as KnowledgeID, '
SET @DynSQL=@DynSQL + N' now.UpdateTime as UpdateTime, '
SET @DynSQL=@DynSQL + N' Case nowc.Title When Null Then N''No Title'' When N'''' Then N''No Title'' Else nowc.Title End as Title, '
SET @DynSQL=@DynSQL + N' (mdc.Title + N'' -> '' + sdc.Title + N'' -> '' + pdc.Title) as Breadcrumb, '
SET @DynSQL=@DynSQL + N' nowc.Culture as Culture, '
SET @DynSQL=@DynSQL + N' ISNULL(nowc.Hidden,0) as Hidden, '
SET @DynSQL=@DynSQL + N' ISNULL(nowc.Approved,0) as Approved, '
SET @DynSQL=@DynSQL + N' ISNULL(nowc.ApprovedBy,N'''') as ApprovedBy, '
SET @DynSQL=@DynSQL + N' now.Author as Author, '
--SET @DynSQL=@DynSQL + N' Case when (now.Editor is not null and convert(nvarchar(4000),now.Editor)<>N'''') then now.Editor when ((now.Editor is null or convert(nvarchar(4000),now.Editor)=N'''') and (sd.Editor is not null and convert(nvarchar(4000),sd.Editor)<>N'''')) then sd.Editor  End as Editor, '
--SET @DynSQL=@DynSQL + N' pd.Editor as PageDirectoryEditor, '
--SET @DynSQL=@DynSQL + N' sd.Editor as SubDirectoryEditor, '
--SET @DynSQL=@DynSQL + N' md.Editor as MainDirectoryEditor, '
SET @DynSQL=@DynSQL + N' pd.[Name] as PageDirectoryName '

SET @DynSQL=@DynSQL + N' From dbo.KnowledgeContent nowc '
SET @DynSQL=@DynSQL + N' Left Join dbo.Knowledge now on now.[ID]=nowc.KnowledgeID '

SET @DynSQL=@DynSQL + N' Left Join dbo.PageDirectory pd on pd.[ID]=now.PageDirectoryID '
SET @DynSQL=@DynSQL + N' Left Join dbo.PageDirectoryContent pdc on pd.[ID]=pdc.PageDirectoryID And pdc.Culture=nowc.Culture '

SET @DynSQL=@DynSQL + N' Left Join dbo.SubDirectory sd on sd.[ID]=pd.SubDirectoryID '
SET @DynSQL=@DynSQL + N' Left Join dbo.SubDirectoryContent sdc on sd.[ID]=sdc.SubDirectoryID And sdc.Culture=nowc.Culture '

SET @DynSQL=@DynSQL + N' Left Join dbo.MainDirectory md on md.[ID]=sd.MainDirectoryID '
SET @DynSQL=@DynSQL + N' Left Join dbo.MainDirectoryContent mdc on md.[ID]=mdc.MainDirectoryID And mdc.Culture=nowc.Culture '

--=====================================================
--==根据 @ApproveQueryFlag= 0/1/2 使用不同的条件  （0 - 待审核   1- 已审核   2 - 我的审核）
--=====================================================
DECLARE @ApproveQueryFlagClause NVARCHAR(1000)

IF @ApproveQueryFlag=1
	
	BEGIN
		SET @ApproveQueryFlagClause=N'  nowc.Approved=1  '
	END

ELSE IF @ApproveQueryFlag=2
	
	BEGIN
		SET @ApproveQueryFlagClause=N'  nowc.Approved=1 AND nowc.ApprovedBy=N''' + @User + N'''  '
	END
ELSE
	
	BEGIN
		SET @ApproveQueryFlagClause=N'  nowc.Approved<>1  '		
	END

--=====================================================
--==根据当前用户的权限，使用不同条件
--=====================================================
IF (dbo.UDF_UserAdmin(@User)=1 or dbo.UDF_UserChiefEditor(@User)=1)

	BEGIN
		SET @DynSQL=@DynSQL + N'  WHERE ' + @ApproveQueryFlagClause + N' AND nowc.Culture=N''' + @Culture + N'''  '
	END

ELSE

	BEGIN
		SET @DynSQL=@DynSQL + N'  WHERE (dbo.UDF_EditorDedicatedTo(N''' + @User + N''',convert(nvarchar(4000),pd.Editor))=1 or dbo.UDF_EditorDedicatedTo(N''' + @User + N''',convert(nvarchar(4000),sd.Editor))=1 or dbo.UDF_EditorDedicatedTo(N''' + @User + N''',convert(nvarchar(4000),md.Editor))=1) And ' +  @ApproveQueryFlagClause + N' And nowc.Culture=N''' + @Culture + N'''  '
	END


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--===========================================================
--==加上 Order By 从句
--==如果 OrderBy='' 则，使用缺省 order by UpdateTime DESC
--===========================================================
SET @OrderBy=LTRIM(RTRIM(@OrderBy))
SET @OrderByOrder=LTRIM(RTRIM(@OrderByOrder))
		
IF LEN(@OrderBy)=0 OR  LEN(@OrderByOrder)=0
	BEGIN
	SET @DynSQL=@DynSQL + N' order by UpdateTime DESC '
	END
ELSE
	BEGIN
	SET @DynSQL=@DynSQL + N' order by [' + @OrderBy + N'] ' + @OrderByOrder
	END
		

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
--=====================================================
--==最后从 @Paging 表变量中获取数据
--=====================================================
Declare @FirstRecord int
Declare @LastRecord int
		
set @FirstRecord=(@CurrentPage - 1) * @PageSize	--当前页第一个记录前
set @LastRecord=(@CurrentPage * @PageSize + 1)	--当前页最后一个记录后
		
--=====================================================
--==总记录数，除以每页的记录数，用Ceiling()处理，得到的为页数 （注意：count(*)  和 @PageSize 都为 INT，它们相除将得到 INT，所以，首先要将它们转换成 Decimal(18,2)）
--=====================================================
set @DynSQL=@DynSQL + N' Select *,PageCount=CEILING (Convert(decimal(18,2),(select count(*) from @Paging)) / Convert(decimal(18,2),' + Convert(nvarchar(20),@PageSize) + N')) From @Paging Where PagingID>' + Convert(nvarchar(20),@FirstRecord) + N' and PagingID<' + Convert(nvarchar(20),@LastRecord)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--============================================
--==检查动态语句的长度，不可以超过系统上限
--============================================
DECLARE @oPassDynSQL INT
EXEC dbo.PublicDynSQLLengthCheck @DynSQL,@oPassDynSQL OUT
IF @oPassDynSQL=0 BEGIN RETURN END

--=====================================================
--==执行动态 SQL 语句， 开始统计
--=====================================================
EXEC(@DynSQL)
RETURN

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeApproveQuery]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeApproveSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeApproveSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeApproveSelect]
GO

--====================================================================================
--==根据给定的  KnowledgeContent ID 以 获得 KnowledgeContent 表中与内容审核有关的信息
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeApproveSelect

@KnowledgeContentID INT				--KnowledgeContent 记录 ID

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择
--====================================================================================
SELECT
	nowc.[ID] AS [ID],
	nowc.KnowledgeID AS KnowledgeID,
	nowc.Culture AS Culture,
	now.Author AS Author,
	(Select Top 1 us.Email From dbo.Users us Where us.[Name]=now.Author) AS AuthorEmail,
	now.UpdateTime AS UpdateTime,
	nowc.Title AS Title,
	nowc.Hidden AS Hidden,
	nowc.Approved AS Approved,
	nowc.ApproveMessage AS ApproveMessage,
	nowc.ApprovedBy AS ApprovedBy,
	
	pd.[Name] AS PageDirectoryName

FROM dbo.KnowledgeContent nowc
LEFT JOIN dbo.Knowledge now ON now.[ID]=nowc.KnowledgeID
LEFT JOIN dbo.PageDirectory pd ON pd.[ID]=now.PageDirectoryID

WHERE nowc.[ID]=@KnowledgeContentID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeApproveSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeApproveSave    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeApproveSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeApproveSave]
GO

--====================================================================================
--==保存内容审核信息
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-04-08
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeApproveSave

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@KnowledgeContentID int,		--当前 Knowledge Content 的 ID

@Hidden bit,				--是否隐藏 （N'true'  /  N'false'）
@Approved int,				--是否审核通过 （0 / 1）
@ApproveMessage ntext		--审核意见

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据 @KnowledgeID 获得 PageDirectoryID
--=====================================================
DECLARE @PageDirectoryID INT
SELECT @PageDirectoryID=now.PageDirectoryID FROM dbo.Knowledge now WHERE now.[ID]=(Select nowc.KnowledgeID From dbo.KnowledgeContent nowc Where nowc.[ID]=@KnowledgeContentID)

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'PageDirectory',@PageDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==修改 KnowledgeContent 表，修改审核信息以及 Hidden 信息
--=====================================================
UPDATE dbo.KnowledgeContent SET Hidden=@Hidden, Approved=@Approved, ApproveMessage=@ApproveMessage, ApprovedBy=@User WHERE [ID]=@KnowledgeContentID


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeApproveSave]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.XToolOptionAdd    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[XToolOptionAdd]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[XToolOptionAdd]
GO


--====================================================================================
--==系统工具 - 该工具用来为 Option 表补充 Key / Value 
--==比如说，我们想在 Option 表的 Logo Cat 中增加一个项目，这个新项目的编号为 8 （即将原来的 8 以及 8 后面的项往后挤一个数）
--==同时，我们还要以同样的道理对 OptionContent 表进行处理
--==该工具只用于系统只用于开发，部署，升级，最终用户不可以使用该工具进行任何操作
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12  
--====================================================================================

CREATE PROCEDURE dbo.XToolOptionAdd

@ID int,						--新增 Option 的 ID
@Cat nvarchar(100),				--新增 Option 的 Cat
@RightIndent INT,				--新增 Option 的 RightIndent 属性（默认为 0）
@Key nvarchar(100),				--新增 Option 的 Key
@Value ntext,					--新增 Option 的 Value
--@Value nvarchar(3000),			--新增 Option 的 Value
@Legend nvarchar(50),				--新增 Option 的 Legend
@NumberOnly nvarchar(50),			--是否只能输入数字
@TextArea nvarchar(50),			--是否 TextArea 部件
@MultiCulture nvarchar(50),			--是否多语种部件
@ForTheme nvarchar(50),			--是否用于主题
@Validation nvarchar(50),			--是怎样的 Validation 定义 （C/L）
@Cultures INT					--有多少个语种

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--===============================================
--==如果参数 @ID=0 则直接退出
--===============================================
IF @ID=0
BEGIN
	RETURN
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--===============================================
--==在 Option 表后面添加新纪录（ID 使用 -1）（我们最后再调整其 ID 使之调整到应该在的位置）
--===============================================
INSERT INTO dbo.[Option]
(
	[ID],
	[Cat],
	[RightIndent],
	[Key],
	[Value],
	[Legend],
	[NumberOnly],
	[TextArea],
	[MultiCulture],
	[ForTheme],
	[Validation]
)

VALUES   

(
	-1,
	@Cat,
	@RightIndent,
	@Key,
	@Value,
	@Legend,
	@NumberOnly,
	@TextArea,
	@MultiCulture,
	@ForTheme,
	@Validation
)

--===============================================
--==将给定 @ID 位置之后（含该 @ID）的所有记录的 ID++
--===============================================
UPDATE dbo.[Option] SET [ID]=[ID]+1 WHERE [ID]>=@ID

--===============================================
--==最后将新增的那条 Option 记录（其 ID 为 -1）的 ID 修改为正确的 ID （@ID）
--===============================================
UPDATE dbo.[Option] SET [ID]=@ID WHERE [ID]=-1 

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--===============================================
--==在 OptionContent 表添加 @Cultures 个 OptionContent 记录
--===============================================
DECLARE @CultureCounter INT
SET @CultureCounter=1

WHILE @CultureCounter<=@Cultures

BEGIN

	INSERT INTO dbo.[OptionContent]
	(
		[ID],
		[OptionID],
		[Culture],
		[Title],
		[CatTitle],
		[Description]
	)

	VALUES   

	(
		-@CultureCounter,
		-1,
		N'',
		N'',
		N'',
		N''
	)

	--===============================================
	--==@CultureCounter++
	--===============================================
	SET @CultureCounter=@CultureCounter+1

	--===============================================
	--==继续
	--===============================================
	CONTINUE

END

--===============================================
--==将 OptionContent 表中 OptionID>=@ID 的记录的 ID++
--===============================================
UPDATE dbo.[OptionContent] SET [ID]=[ID]+@Cultures,OptionID=OptionID+1 WHERE OptionID>=@ID

--===============================================
--==最后将 OptionContent 表中新增的 @Cultures 个新纪录的 ID 修改为正确值（这些记录所应该处的真实位置）
--===============================================
DECLARE @CultureCounter2 INT
SET @CultureCounter2=1

WHILE @CultureCounter2<=@Cultures

BEGIN

	UPDATE dbo.[OptionContent] SET [ID]=(@ID-1)*@Cultures+@CultureCounter2, OptionID=@ID  WHERE [ID] = - @CultureCounter2

	--===============================================
	--==@CultureCounter2++
	--===============================================
	SET @CultureCounter2=@CultureCounter2+1

	--===============================================
	--==继续
	--===============================================
	CONTINUE

END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

/*
--===============================================
--==获得当前 Option  表最后一条记录的 ID
--===============================================
DECLARE @NewVirtualOptionID INT
SELECT @NewVirtualOptionID=MAX([ID])+1 FROM dbo.[Option] 

--===============================================
--==在 Option 表后面追加一条虚拟记录
--===============================================
INSERT INTO dbo.[Option]
(
	[ID],
	[Cat],
	[RightIndent],
	[Key],
	[Value],
	[Legend],
	[NumberOnly],
	[TextArea],
	[MultiCulture],
	[ForTheme],
	[Validation]
)

VALUES   

(
	@NewVirtualOptionID,
	N'',
	0,
	N'',
	N'',
	N'',
	N'',
	N'',
	N'' ,
	N'' ,
	N''
)

--===============================================
--==从目前 Option 表的最后第二条记录开始往前走，一直到我们需要插入新记录的位置，将这些记录依次后移
--===============================================
DECLARE @OptionCounter INT
SET @OptionCounter=@NewVirtualOptionID-1

WHILE @OptionCounter>=@ID

BEGIN
	--===============================================
	--==从当前位置读出记录
	--===============================================
	DECLARE @CatTemp nvarchar(100)		
	DECLARE @RightIndentTemp INT
	DECLARE @KeyTemp nvarchar(100)	
	DECLARE @ValueTemp nvarchar(3000)	
	DECLARE @LegendTemp nvarchar(50)		
	DECLARE @NumberOnlyTemp nvarchar(50)	
	DECLARE @TextAreaTemp nvarchar(50)		
	DECLARE @MultiCultureTemp nvarchar(50)		
	DECLARE @ForThemeTemp nvarchar(50)		
	DECLARE @ValidationTemp nvarchar(50)		

	SELECT 		

		@CatTemp=[Cat],
		@RightIndentTemp=[RightIndent],
		@KeyTemp=[Key],
		@ValueTemp=[Value],
		@LegendTemp=[Legend],
		@NumberOnlyTemp=[NumberOnly],
		@TextAreaTemp=[TextArea],
		@MultiCultureTemp=[MultiCulture],
		@ForThemeTemp=[ForTheme],
		@ValidationTemp=[Validation]

	FROM dbo.[Option] WHERE [ID]=@OptionCounter

	--===============================================
	--==更新到当前记录后面的记录
	--===============================================
	UPDATE dbo.[Option] SET

		[Cat]=@CatTemp,
		[RightIndent]=@RightIndentTemp,
		[Key]=@KeyTemp,
		[Value]=@ValueTemp,
		[Legend]=@LegendTemp,
		[NumberOnly]=@NumberOnlyTemp,
		[TextArea]=@TextAreaTemp,
		[MultiCulture]=@MultiCultureTemp,
		[ForTheme]=@ForThemeTemp,
		[Validation]=@ValidationTemp

	WHERE [ID]=@OptionCounter+1

	--===============================================
	--==@OptionCounter--
	--===============================================
	SET @OptionCounter=@OptionCounter-1

	--===============================================
	--==继续进行
	--===============================================
	CONTINUE
END

--===============================================
--==将 SP 参数中提供的新内容更新到 @ID 位置
--===============================================
UPDATE dbo.[Option] SET

	[Cat]=@Cat,
	[RightIndent]=@RightIndent,
	[Key]=@Key,
	[Value]=@Value,
	[Legend]=@Legend,
	[NumberOnly]=@NumberOnly,
	[TextArea]=@TextArea,
	[MultiCulture]=@MultiCulture,
	[ForTheme]=@ForTheme,
	[Validation]=@Validation


WHERE [ID]=@ID


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--===============================================
--==获得当前 OptionContent  表最后一条记录的 ID
--===============================================
DECLARE @NewVirtualOptionContentID INT
SELECT @NewVirtualOptionContentID=MAX([ID])+1 FROM dbo.[OptionContent] 

DECLARE @OptionContentCounter INT
SET @OptionContentCounter=@NewVirtualOptionContentID


--===============================================
--==在 OptionContent 表后面追加 N 条虚拟记录 (N=@Cultures 数量)
--===============================================
WHILE @OptionContentCounter<=@NewVirtualOptionContentID+@Cultures-1

BEGIN

	INSERT INTO dbo.[OptionContent]

	(
		[ID],
		[OptionID],
		[Culture],
		[Title],
		[CatTitle],
		[Description]
	)

	VALUES   

	(
		@OptionContentCounter,
		0,
		N'',
		N'',
		N'',
		N''
	)

	--===============================================
	--==@OptionContentCounter++
	--===============================================
	SET @OptionContentCounter=@OptionContentCounter+1

	--===============================================
	--==继续
	--===============================================
	CONTINUE
END

--===============================================
--==再次刷新 @OptionContentCounter
--===============================================
SELECT @OptionContentCounter=@NewVirtualOptionContentID-1

--===============================================
--==从目前 Option 表的最后第二条记录开始往前走，一直到我们需要插入新记录的位置，将这些记录依次后移
--===============================================
WHILE @OptionContentCounter>=(@ID-1)*@Cultures+1

BEGIN
	--===============================================
	--==从当前位置读出记录
	--===============================================
	DECLARE @OptionIDTemp int
	DECLARE @CultureTemp [nvarchar] (100) 
	DECLARE @TitleTemp [nvarchar] (200) 
	DECLARE @CatTitleTemp [nvarchar] (200)
	DECLARE @DescriptionTemp [nvarchar] (3000)

	SELECT 		

		@OptionIDTemp=[OptionID]+1,
		@CultureTemp=[Culture],
		@TitleTemp=[Title],
		@CatTitleTemp=[CatTitle],
		@DescriptionTemp=[Description]

	FROM dbo.[OptionContent] WHERE [ID]=@OptionContentCounter

	--===============================================
	--==更新到当前记录后面的第 N 条记录 （N=@Cultures）
	--===============================================
	UPDATE dbo.[OptionContent] SET

		[OptionID]=@OptionIDTemp,
		[Culture]=@CultureTemp,
		[Title]=@TitleTemp,
		[CatTitle]=@CatTitleTemp,
		[Description]=@DescriptionTemp

	WHERE [ID]=@OptionContentCounter+@Cultures

	--===============================================
	--==@OptionContentCounter--
	--===============================================
	SET @OptionContentCounter=@OptionContentCounter-1

	--===============================================
	--==继续进行
	--===============================================
	CONTINUE
END

--===============================================
--==再次刷新 OptionContentCounter
--===============================================
SET @OptionContentCounter=0

WHILE @OptionContentCounter<=@Cultures-1
BEGIN
	UPDATE dbo.[OptionContent] SET

		[OptionID]=@ID,
		[Culture]=N'',
		[Title]=N'',
		[CatTitle]=N'',
		[Description]=N''

	WHERE [ID]=@ID*@Cultures-@OptionContentCounter

	SET @OptionContentCounter=@OptionContentCounter+1
	CONTINUE
END

*/
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[XToolOptionAdd]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.XToolOptionDelete    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[XToolOptionDelete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[XToolOptionDelete]
GO


--====================================================================================
--==系统工具 - 该工具用来从 Option 表删除某个 Key / Value 
--==同时要从 OptionContent 将该项目对应的内容删除 
--==删除之后，还要将相应的 ID 减去 1 （我们不希望 Option 和 OptionContent ID 出现空洞）
--==！特别注意，该命令切不可连续运行，比如，你要删除 49,50 两个 Option，切不可运行 XToolOptionDelete 49     XToolOptionDelete 50，因为运行了第一个后，原来的 50 也变成 49 了，正确的用法应该是 XToolOptionDelete 49    XToolOptionDelete 49  ！
--==该工具只用于系统只用于开发，部署，升级，最终用户不可以使用该工具进行任何操作
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12  
--====================================================================================

CREATE PROCEDURE dbo.XToolOptionDelete

@ID int						--将被删除的 Option 的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--===============================================
--==对 Option 指定记录执行删除
--===============================================
DELETE FROM dbo.[Option] WHERE [ID]=@ID

--===============================================
--==删除后，对该 ID 后面的记录的 ID 减 1
--===============================================
UPDATE dbo.[Option] SET [ID]=[ID]-1 WHERE [ID]>@ID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--===============================================
--==再处理 OptionContent 
--===============================================


--===============================================  
--==返回所有不重复的文化，缓存到临时表  
--===============================================  
DECLARE @Culture TABLE   
  
(  
	Culture nvarchar(100) COLLATE Chinese_PRC_CI_AS NULL   
)  
  
INSERT INTO @Culture  
  
(  
	Culture  
)  
  
SELECT DISTINCT  
  
(  
	Culture  
)  
  
FROM dbo.OptionContent  
  
--===============================================  
--==计算 Culture 的数目  
--===============================================  
DECLARE @CultureCount INT  
SELECT @CultureCount=COUNT(Culture) FROM @Culture   


--===============================================
--==删除指定记录
--===============================================
DELETE FROM dbo.OptionContent WHERE OptionID=@ID


--===============================================
--==将 @ID 后面的 OptionID-1; [ID]-@CultureCount
--===============================================
UPDATE dbo.OptionContent SET OptionID=OptionID-1, [ID]=[ID]-@CultureCount WHERE OptionID>@ID


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[XToolOptionDelete]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.XToolOptionMove    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[XToolOptionMove]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[XToolOptionMove]
GO


--====================================================================================
--==系统工具 - 该工具将 Option 表中的项目前移或后移
--==比如，我们想把 Option 表中的 ID=5 的项目后移动 2 个位置
--==移动分前移后后移 （-n 和 n），如果移动的 Offset 为 0，则不动作
--==该工具只用于系统只用于开发，部署，升级，最终用户不可以使用该工具进行任何操作
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12  
--====================================================================================

CREATE PROCEDURE dbo.XToolOptionMove

@ID int,						--需要移动的 Option 的 ID
@Offset int,					--移动多少个位置 （+/- 两种值，+ 表示后移，- 表示前移）
@Cultures INT					--有多少个语种


AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--===============================================
--==如果是 @ID 是最后一个 Option 的 ID，且 @Offset>=1 ；或者，@ID 是第一个 Option  的 ID，且 @Offset<=-1；或者 @Offset=0 ，则直接退出
--===============================================
DECLARE @MaxID INT
DECLARE @MinID INT

SELECT @MaxID=MAX(opt.[ID]) FROM dbo.[Option] opt
SELECT @MinID=MIN(opt.[ID]) FROM dbo.[Option] opt

IF (@ID=@MaxID And @Offset>=1) OR (@ID=@MinID And @Offset<=-1) OR (@Offset=0)

BEGIN
	RETURN
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--===============================================
--==首先将 @ID 位置的 Option 的 ID 修改为 -1
--===============================================
UPDATE dbo.[Option] SET [ID]=-1 WHERE [ID]=@ID

--===============================================
--==将 @ID 位置的 OptionContent 的 OptionID 修改为 -1
--===============================================
UPDATE dbo.[OptionContent] SET [OptionID]=-1 WHERE [OptionID]=@ID


--===============================================
--==分 Offset 为 +/- 两种情形分别进行 （注： Offset=0 情形可以不处理）
--===============================================

IF @Offset>0

	BEGIN
		--===============================================
		--==将 @ID 到 @ID+@Offset 之间的记录的 ID--
		--===============================================
		UPDATE dbo.[Option] SET [ID]=[ID]-1 WHERE [ID]>=@ID+1 AND [ID]<=@ID+@Offset

		--===============================================
		--==将 OptionContent 中的
		--===============================================
		UPDATE dbo.[OptionContent] SET [ID]=[ID]-@Cultures, OptionID=OptionID-1 WHERE OptionID>=@ID+1 AND OptionID<=@ID+@Offset
	END

ELSE IF @Offset<0

	BEGIN
		--===============================================
		--==将 @ID+@Offset 到 @ID 之间的记录的 ID++
		--===============================================
		UPDATE dbo.[Option] SET [ID]=[ID]+1 WHERE  [ID]>=@ID+@Offset AND [ID]<=@ID-1

		--===============================================
		--==将 OptionContent 中的
		--===============================================
		UPDATE dbo.[OptionContent] SET [ID]=[ID]+@Cultures, OptionID=OptionID+1 WHERE OptionID>=@ID+@Offset AND OptionID<= @ID-1
	END


--===============================================
--==最后将 [ID]=-1 的记录的 ID 修改为正确的位置
--===============================================
UPDATE dbo.[Option] SET [ID]=@ID+@Offset WHERE [ID]=-1

--===============================================
--==最后将 [OptionID]=-1 的记录的 OptionID 修改为正确的位置
--===============================================
UPDATE dbo.[OptionContent] SET [OptionID]=@ID+@Offset, [ID]=[ID] + (@Offset * @Cultures) WHERE [OptionID]=-1

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

/*

--===============================================
--==分 Offset 为 +/- 两种情形分别进行
--===============================================

IF @Offset>0

	BEGIN

		--===============================================
		--==如果是后移：将当前 Option 项在 @ID + @Offset + 1 这个位置复制一个新的 Entry，然后，再回到 @ID 位置，将这个 Option 项目删除 
		--===============================================

		--===============================================
		--==首先是新复制 Entry 的插入点 （ID）
		--===============================================
		DECLARE @NewPosition INT
		SET @NewPosition=@ID + @Offset + 1

		--===============================================
		--==在新的插入点 XToolOptionAdd 一个新 Option 项目
		--===============================================
		DECLARE @Cat nvarchar(100)
		DECLARE @RightIndent int
		DECLARE @Key nvarchar(100)
		DECLARE @Value nvarchar(3000)
		DECLARE @Legend nvarchar(50)
		DECLARE @NumberOnly nvarchar(50)
		DECLARE @TextArea nvarchar(50)
		DECLARE @MultiCulture nvarchar(50)
		DECLARE @ForTheme nvarchar(50)
		DECLARE @Validation nvarchar(50)

		SELECT 
			@Cat=opt.Cat,
			@RightIndent=opt.RightIndent,
			@Key=opt.[Key],
			@Value=opt.Value,
			@Legend=opt.Legend,
			@NumberOnly=opt.NumberOnly,
			@TextArea=opt.TextArea,
			@MultiCulture=opt.MultiCulture,
			@ForTheme=opt.ForTheme,
			@Validation=opt.Validation

		FROM dbo.[Option] opt
		WHERE opt.[ID]=@ID

		EXEC dbo.XToolOptionAdd @NewPosition,@Cat,@RightIndent,@Key,@Value,@Legend,@NumberOnly,@TextArea,@MultiCulture,@ForTheme,@Validation,@Cultures
		
		--===============================================
		--==在 OptionContent 中，将相应值也克隆到新位置
		--===============================================
		DECLARE @CultureCounter INT
		SET @CultureCounter=1

		WHILE @CultureCounter<=@Cultures

		BEGIN
			--===============================================
			--==获得要被移动的 Option 项的 OptionContent 在当前 Culture 下对应的记录，以便 clone 到新插入点对应的 OptionContent
			--===============================================
			DECLARE @CultureOriginal [nvarchar] (100) 
			DECLARE @TitleOriginal [nvarchar] (200) 
			DECLARE @CatTitleOriginal [nvarchar] (200)
			DECLARE @DescriptionOriginal [nvarchar] (3000)

			SELECT 
				@CultureOriginal=optc.Culture,
				@TitleOriginal=optc.Title,
				@CatTitleOriginal=optc.CatTitle,
				@DescriptionOriginal=optc.[Description]

			FROM dbo.[OptionContent] optc
			WHERE optc.[ID]=(@ID - 1) * @Cultures + @CultureCounter


			UPDATE dbo.[OptionContent] SET

				Culture=@CultureOriginal,
				Title=@TitleOriginal,
				CatTitle=@CatTitleOriginal,
				[Description]=@DescriptionOriginal

			WHERE [ID]=(@NewPosition - 1) * @Cultures + @CultureCounter


			--===============================================
			--==@CultureCounter++
			--===============================================
			SET @CultureCounter=@CultureCounter + 1

			--===============================================
			--==继续进行
			--===============================================
			CONTINUE
		END	


		--===============================================
		--==最后，我们删除那个  Original Option
		--===============================================
		EXEC dbo.XToolOptionDelete @ID

	END

ELSE IF @Offset<0

	BEGIN

		--===============================================
		--==如果是前移：将当前 Option 项在 @ID - ABS(@Offset)  这个位置复制一个新的 Entry，然后，再回到 @ID+1 位置，将这个 Option 项目删除 
		--===============================================

		--===============================================
		--==首先是新复制 Entry 的插入点 （ID）
		--===============================================
		DECLARE @NewPosition2 INT
		SET @NewPosition2=@ID - ABS(@Offset)

		--===============================================
		--==在新的插入点 XToolOptionAdd 一个新 Option 项目
		--===============================================
		DECLARE @Cat2 nvarchar(100)
		DECLARE @RightIndent2 int
		DECLARE @Key2 nvarchar(100)
		DECLARE @Value2 nvarchar(3000)
		DECLARE @Legend2 nvarchar(50)
		DECLARE @NumberOnly2 nvarchar(50)
		DECLARE @TextArea2 nvarchar(50)
		DECLARE @MultiCulture2 nvarchar(50)
		DECLARE @ForTheme2 nvarchar(50)
		DECLARE @Validation2 nvarchar(50)

		SELECT 
			@Cat2=opt.Cat,
			@RightIndent2=opt.RightIndent,
			@Key2=opt.[Key],
			@Value2=opt.Value,
			@Legend2=opt.Legend,
			@NumberOnly2=opt.NumberOnly,
			@TextArea2=opt.TextArea,
			@MultiCulture2=opt.MultiCulture,
			@ForTheme2=opt.ForTheme,
			@Validation2=opt.Validation

		FROM dbo.[Option] opt
		WHERE opt.[ID]=@ID

		EXEC dbo.XToolOptionAdd @NewPosition2,@Cat2,@RightIndent2,@Key2,@Value2,@Legend2,@NumberOnly2,@TextArea2,@MultiCulture2,@ForTheme2,@Validation2,@Cultures
		
		--===============================================
		--==在 OptionContent 中，将相应值也克隆到新位置 （注意：这时，Original OptionID 已经 +1 了，因为我们在前面插入了新值）
		--===============================================
		DECLARE @CultureCounter2 INT
		SET @CultureCounter2=1

		WHILE @CultureCounter2<=@Cultures

		BEGIN
			--===============================================
			--==获得要被移动的 Option 项的 OptionContent 在当前 Culture 下对应的记录，以便 clone 到新插入点对应的 OptionContent
			--===============================================
			DECLARE @CultureOriginal2 [nvarchar] (100) 
			DECLARE @TitleOriginal2 [nvarchar] (200) 
			DECLARE @CatTitleOriginal2 [nvarchar] (200)
			DECLARE @DescriptionOriginal2 [nvarchar] (3000)

			SELECT 
				@CultureOriginal2=optc.Culture,
				@TitleOriginal2=optc.Title,
				@CatTitleOriginal2=optc.CatTitle,
				@DescriptionOriginal2=optc.[Description]

			FROM dbo.[OptionContent] optc
			WHERE optc.[ID]=(@ID + 1 - 1) * @Cultures + @CultureCounter2


			UPDATE dbo.[OptionContent] SET

				Culture=@CultureOriginal2,
				Title=@TitleOriginal2,
				CatTitle=@CatTitleOriginal2,
				[Description]=@DescriptionOriginal2

			WHERE [ID]=(@NewPosition2 - 1) * @Cultures + @CultureCounter2


			--===============================================
			--==@CultureCounter++
			--===============================================
			SET @CultureCounter2=@CultureCounter2 + 1

			--===============================================
			--==继续进行
			--===============================================
			CONTINUE
		END	

		--===============================================
		--==最后，我们删除那个  Original Option  （现在它的 ID 已经 +1 了）
		--===============================================
		DECLARE @IDPlus INT
		SET @IDPlus=@ID+1

		EXEC dbo.XToolOptionDelete @IDPlus

	END

*/

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[XToolOptionMove]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.UserAccountContactCardSelect    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserAccountContactCardSelect]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[UserAccountContactCardSelect]
GO

--====================================================================================
--==调用 UDF_UserResolve 返回给定用户，用户组混合列表最终解析出来的完整用户列表及其资料
--==用来在 ContactCardGenerate.cs 中生成通讯录
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-04-12 
--====================================================================================

CREATE PROCEDURE dbo.UserAccountContactCardSelect 

 @Users nvarchar(4000)			--用户及用户组混合列表

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查（不需要）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

SELECT DISTINCT

	[Name],
	ISNULL(FirstName,N'') AS FirstName,
	ISNULL(LastName,N'') AS LastName,
	ISNULL(Tel,N'') AS Tel,
	ISNULL(Email,N'') AS Email,
	ISNULL(Mobile,N'') AS Mobile,
	ISNULL(Fax,N'') AS Fax,
	ISNULL(MSN,N'') AS MSN,
	ISNULL(Skype,N'') AS Skype,
	ISNULL(Twitter,N'') AS Twitter,
	ISNULL(QQ,N'') AS QQ,
	ISNULL(Address,N'') AS Address,
	CASE Sex WHEN 1 THEN N'M' ELSE N'F' END AS Sex,
	ISNULL(Organization,N'') AS Organization,
	ISNULL([Position],N'') AS [Position],
	ISNULL(Rank,1000000) AS Rank,
	ISNULL(PortraitName,N'') AS PortraitName,
	ISNULL(Remark,N'') AS Remark

FROM dbo.Users

WHERE [Name] IN (Select [User] From dbo.UDF_UserResolve(@Users))

ORDER BY Rank ASC

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[UserAccountContactCardSelect]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.SiteLogSave    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SiteLogSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SiteLogSave]
GO

--====================================================================================
--==保存 SiteLog 记录
--====================================================================================
--==关于 Activity
--====================================================================================
--==0. 登录

--==1. 浏览文章
--==2. 浏览帖子

--==3. 添加主目录
--==4. 添加子目录
--==5. 添加页目录
--==6. 添加内容
--==7. 添加评论
--==8. 添加帖子
--==9. 添加跟帖

--==10.修改主目录
--==11.修改子目录
--==12.修改页目录
--==13.修改内容
--==14.修改帖子
--==15.修改跟帖

--==16.删除主目录
--==17.删除子目录
--==18.删除页目录
--==19.删除内容
--==20.删除评论
--==21.删除帖子
--==22.删除跟帖
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-12-02
--====================================================================================

CREATE PROCEDURE dbo.SiteLogSave

@User nvarchar(50),				--当前用户名（从 ASPX 端一路传递过来的）
@Activity int,					--用户活动（0-19各代表不同含义）
@TargetID int					--用户活动 Target ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （本 SP 是系统运行维护的，无需权限检查）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==当前时间
--=====================================================
DECLARE @CurrentTime nvarchar(50)
SET @CurrentTime=GETDATE()

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==添加 SiteLog 记录
--=====================================================
INSERT INTO dbo.SiteLog([User],Activity,TargetID,ActivityTime) VALUES(@User,@Activity,@TargetID,@CurrentTime)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[SiteLogSave]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.SiteLogQuery    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SiteLogQuery]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SiteLogQuery]
GO

--====================================================================================
--==这个 SP 的作用：根据提供的 @Activity 参数，返回 SiteLog 中指定活动的排行
--==建立分页机制，先将正常查询结果存入一个结构一样（但多了一个PagingID的表变量），根据PagingID，@PageSize，@CurrentPage选取当前页的记录，并将总页数作为一个追加栏位输出
--====================================================================================
--==版权所有 2001-2011 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2011-03-14
--====================================================================================

CREATE PROCEDURE dbo.SiteLogQuery

@Activity int,			--用户活动编号

@DateFrom datetime,		--统计开始日期
@DateTo datetime,		--统计结束日期

@PageSize INT,		--页码机制：每页的尺寸
@CurrentPage INT,		--页码机制：当前页
@OrderBy nvarchar(100),	--进行排序的列名
@OrderByOrder nvarchar(10)	--排序方式 ASC, DESC

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==参数的逃逸处理（仅在存在动态语句的地方使用 - 目前暂无）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==权限检查（不需要）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将 @DateFrom 和 @DateTo 转换为可以在 DynSQL 使用的格式
--=====================================================
DECLARE @DateFromString NVARCHAR(200)
DECLARE @DateToString NVARCHAR(200)

IF (@DateFrom IS NOT NULL)  AND (@DateTo IS NOT NULL)

BEGIN

	SET @DateFromString=N'convert(datetime,N''' + CONVERT(NVARCHAR(20),DATEPART(YEAR,@DateFrom)) + N'-' +  CONVERT(NVARCHAR(20),DATEPART(MONTH,@DateFrom)) + N'-' + CONVERT(NVARCHAR(20),DATEPART(DAY,@DateFrom)) + N' 00:01:01' + N''',102) '
	SET @DateToString=N'convert(datetime,N''' + CONVERT(NVARCHAR(20),DATEPART(YEAR,@DateTo)) + N'-' +  CONVERT(NVARCHAR(20),DATEPART(MONTH,@DateTo)) + N'-' + CONVERT(NVARCHAR(20),DATEPART(DAY,@DateTo)) + N' 23:59:59' + N''',102) '

END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==动态查询语句中可能出现 Unicode 字符（比如：FirstName='刘'），nvarchar()不能超过4000，而下面两个动态语句最后还要连接到一起，所以定义为 nvarchar(4000)
--==用动态SQL语句来完成统计(注意：要加上Set Nocount on 消除对最终输出记录集的影响)
--==用来构建Where从句
--=====================================================
DECLARE @DynSQL NVARCHAR(4000)      
DECLARE @DynWhere NVARCHAR(4000) 

--=====================================================
--==创建分页表 
--=====================================================
SET @DynSQL=N' SET NOCOUNT ON   '
SET @DynSQL=@DynSQL + N' Declare @Paging table '
SET @DynSQL=@DynSQL + N' ( '
SET @DynSQL=@DynSQL + N' PagingID int identity(1,1), '
SET @DynSQL=@DynSQL + N' [User] nvarchar(50) COLLATE database_default,  '
SET @DynSQL=@DynSQL + N' Activity int, '
SET @DynSQL=@DynSQL + N' ActivityCount int '
SET @DynSQL=@DynSQL + N' ) '

--=====================================================
--==填充分页表 
--=====================================================
SET @DynSQL=@DynSQL + N' Insert into @Paging '

SET @DynSQL=@DynSQL + N' Select distinct   '  
SET @DynSQL=@DynSQL + N' sl.[User] as [User], '
SET @DynSQL=@DynSQL + N' sl.Activity as Activity, '
SET @DynSQL=@DynSQL + N' COUNT(sl.Activity) as ActivityCount '

SET @DynSQL=@DynSQL + N' From dbo.SiteLog sl '

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==WHERE 1=1 巧妙地避免了下面动态 WHERE 从句中的 ‘AND’ 问题
--=====================================================
SET @DynSQL=@DynSQL + N' WHERE 1=1  '

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==其它动态 WHERE 从句
--=====================================================
SET @DynWhere=N''

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@Activity 统计线索
--=====================================================
IF @Activity IS NOT NULL 
BEGIN
	set @DynWhere=@DynWhere + N' and sl.Activity=' + CONVERT(NVARCHAR(20),@Activity)
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==@DateFrom, @DateTo 统计线索
--=====================================================
IF (@DateFrom IS NOT NULL)  AND (@DateTo IS NOT NULL)
BEGIN
	set @DynWhere=@DynWhere + N' and sl.ActivityTime>=' +@DateFromString + N' and sl.ActivityTime<=' + @DateToString
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--===========================================================
--==前面的 SQL 语句最后加 其它动态 WHERE 从句 （@DynSQL 中已经包含 WHERE 1=1）
--===========================================================
SET @DynSQL=@DynSQL + @DynWhere

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==加上 Group By 从句
--=====================================================
SET @DynSQL=@DynSQL + N' group by sl.[User],sl.Activity '

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==加上 Order By 从句
--==如果 OrderBy='' 则，使用缺省 order by ActivityCount DESC
--=====================================================
SET @OrderBy=LTRIM(RTRIM(@OrderBy))
SET @OrderByOrder=LTRIM(RTRIM(@OrderByOrder))

IF LEN(@OrderBy)=0 OR  LEN(@OrderByOrder)=0

	BEGIN
	SET @DynSQL=@DynSQL + N' order by [ActivityCount] DESC '
	END
ELSE
	BEGIN
	SET @DynSQL=@DynSQL + N' order by [' + @OrderBy + N'] ' + @OrderByOrder
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==最后从 @Paging 表变量中获取数据
--===================================================== 
Declare @FirstRecord int
Declare @LastRecord int

set @FirstRecord=(@CurrentPage - 1) * @PageSize	--当前页第一个记录前
set @LastRecord=(@CurrentPage * @PageSize + 1)	--当前页最后一个记录后

--=====================================================
--==总记录数，除以每页的记录数，用Ceiling()处理，得到的为页数 （注意：count(*)  和 @PageSize 都为 INT，它们相除将得到 INT，所以，首先要将它们转换成 Decimal(18,2)）
--=====================================================
set @DynSQL=@DynSQL + N' Select *,PageCount=CEILING (Convert(decimal(18,2),(select count(*) from @Paging)) / Convert(decimal(18,2),' + Convert(nvarchar(20),@PageSize) + N')) From @Paging Where PagingID>' + Convert(nvarchar(20),@FirstRecord) + N' and PagingID<' + Convert(nvarchar(20),@LastRecord)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--============================================
--==检查动态语句的长度，不可以超过系统上限
--============================================
DECLARE @oPassDynSQL INT
EXEC dbo.PublicDynSQLLengthCheck @DynSQL,@oPassDynSQL OUT
IF @oPassDynSQL=0 BEGIN RETURN END

--=====================================================
--==执行动态 SQL 语句， 开始统计
--=====================================================
EXEC(@DynSQL)
RETURN



--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[SiteLogQuery]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.GroupMailResolve    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GroupMailResolve]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[GroupMailResolve]
GO

--====================================================================================
--==在站内邮件群发中，可以在邮件地址中填写诸如 “注册用户总部,信息部,Timothy,Lilie” 之类的地址，本 SP 从这类地址表示中解析出对应的邮件地址列表
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2009-12-01
--====================================================================================

CREATE PROCEDURE dbo.GroupMailResolve

@User NVARCHAR(50),				--当前登录用户（从 ASPX 端传递过来）
@To NVARCHAR(4000)				--发送地址 （“注册用户总部,信息部,Timothy,Lilie” 之类的表示方式  ）

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查（站内邮件群发限定只有 Admin 用户有权限进行）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminUserAuthentication @User,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==从 @To 表示字符串解析出真正用户名，并从  Users 表查获这些用户的邮箱地址，最后输出解析出的邮箱地址列表
--====================================================================================
SELECT DISTINCT

	us.Email

FROM dbo.UDF_UserResolve(@To) usr
INNER JOIN dbo.Users us ON us.[Name]=usr.[User]


WHERE (us.Email<>N'') AND (us.Email IS NOT NULL)




--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[GroupMailResolve]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.SubDirectoryCreateOverviewPageDirectory    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SubDirectoryCreateOverviewPageDirectory]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SubDirectoryCreateOverviewPageDirectory]
GO

--====================================================================================
--==为给定的 SubDirectory 创建一个 Overview 性质的  PageDirectory （假如该 SubDirectory 下不存在 Overview PageDirectory 的话）
--====================================================================================
--==版权所有 2001-2014 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2013-09-05
--====================================================================================

CREATE PROCEDURE dbo.SubDirectoryCreateOverviewPageDirectory

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@SubDirectoryID int,				--当前 PageDirectory 对应的 SubDirectory 的 ID
@OverviewPageDirectoryName nvarchar(100),	--内容页名字 （从 SubDirectorySave 传递来）

@oNewID int OUT				--新记录的 ID ，输出参数

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查（这里调用的 SP PageDirectorySave 本身已经有权限检查）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果 SubDirectorySave 传递来的 @OverviewPageDirectoryName 不为空，则用之，否则，从系统取一个唯一的 Number 用来构造这个新 PageDirectory 的名字
--=====================================================
DECLARE @Name NVARCHAR(100)

IF LEN(RTRIM(LTRIM(@OverviewPageDirectoryName)))=0

	BEGIN
		DECLARE @UniqueNumber INT
		EXEC dbo.UniqueNumberGet @UniqueNumber OUT
		SELECT @Name=N'p' + CONVERT(NVARCHAR(20),@UniqueNumber)
	END

ELSE

	BEGIN
		SELECT @Name=@OverviewPageDirectoryName
	END

--=====================================================
--==在 Sub Directory 创建 Overview Page Directory 情形，我们让自动创建的 Page Directory 继承  Sub Directory 的名字
--==该机制暂缓启用
--=====================================================
/*
DECLARE @Name NVARCHAR(100)
SELECT @Name=[Name] FROM dbo.SubDirectory WHERE [ID]=@SubDirectoryID
*/

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==继承其父 SubDirectory 的 NewWindow 属性
--=====================================================
DECLARE @NewWindow bit

SELECT @NewWindow=sd.NewWindow FROM dbo.SubDirectory sd WHERE sd.[ID]=@SubDirectoryID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

EXEC dbo.PageDirectorySave 

	@User,				--@User

	@SubDirectoryID,		--@SubDirectoryID

	1,				--@Serial
	@Name,			--@Name
	10000,				--@PageSize
	@NewWindow,			--@NewWindow （继承其父 SubDirectory 的）
	
	1,				--@Overview
	0,				--@FastAccess
	0,				--@Home

	0,				--@RightIndent

	0,				--@jQuery

	0,				--@LogoHide
	0,				--@MainMenuHide
	0,				--@BannerHide
	0,				--@BreadcrumbHide
	0,				--@PageMenuHide
	0,				--@PageBarHide
	0,				--@CopyrightHide

	1,				--@Type
	1,				--@Presentation
	0,				--@JumpToContent

	0,				--@ShowTitle
	0,				--@ShowAuthor
	0,				--@ShowUpdateTime
	0,				--@ShowHitCount
	0,				--@ShowComments
	0,				--@ShowStaticUrl
	0,				--@ShowKnowledgeHtml
	0,				--@ShowRelative

	N'',				--@Editor
	N'',				--@DedicatedTo
	N'',				--@CommentsPermission

	@oNewID OUT			--@oNewID	


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[SubDirectoryCreateOverviewPageDirectory]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.SubDirectoryCreateOverviewPageDirectoryContent    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SubDirectoryCreateOverviewPageDirectoryContent]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SubDirectoryCreateOverviewPageDirectoryContent]
GO

--====================================================================================
--==为给定的 SubDirectory 创建的 Overview 性质的  PageDirectory 的内容记录的创建（所有语种）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-22
--====================================================================================

CREATE PROCEDURE dbo.SubDirectoryCreateOverviewPageDirectoryContent

@User nvarchar(50),					--从 ASPX 端传递过来的当前用户名

@PageDirectoryID int,					--当前 PageDirectory 对应的 SubDirectory 的 ID

@oNewID int OUT					--新记录的 ID ，输出参数 （多 Culture 无实际意义）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查（这里调用的 SP PageDirectoryContentSave 本身已经有权限检查）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==系统语种列表 Curosr
--=====================================================
DECLARE @Culture NVARCHAR(100)
DECLARE Cultures_Cursor CURSOR FOR SELECT Culture FROM dbo.UDF_PublicCultures()
OPEN Cultures_Cursor
FETCH NEXT FROM Cultures_Cursor INTO @Culture

WHILE @@FETCH_STATUS=0
BEGIN

	--=====================================================
	--==继承 SubDirectory 当前 Culture 下的 Title 和 Description
	--==注：本 SP 在 SP SubDirectorySave 中被调用的时候，在运行SubDirectorySave 的时候，SubDirectoryContentSave 还没来得及执行，因此，继承到的 Title 和 Description 仅仅是 NULL 或空值
	--==注：既然这样，为什么还要保留以下代码？因为本 SP 还将被 SP KnowledgeMove 调用，而 SP KnowledgeMove 中，下面这段代码就有意义了
	--=====================================================	
	DECLARE @Title NVARCHAR(200)
	DECLARE @Description NVARCHAR(1000)

	SELECT 

		@Title=sdc.[Title],
		@Description=sdc.[Description]

	FROM dbo.PageDirectory pd
	LEFT JOIN dbo.SubDirectory sd ON sd.[ID]=pd.SubDirectoryID
	LEFT JOIN dbo.SubDirectoryContent sdc ON sd.[ID]=sdc.SubDirectoryID

	WHERE pd.[ID]=@PageDirectoryID AND sdc.[Culture]=@Culture

	--=====================================================
	--==从 Option 表查询默认的 SeoTitle, SeoDescription, SeoKeywords 三个 SEO 相关的全局参数
	--=====================================================	
	DECLARE @SeoTitle NVARCHAR(200)
	DECLARE @SeoDescription NVARCHAR(4000)
	DECLARE @SeoKeywords NVARCHAR(4000)

	SELECT @SeoTitle=dbo.UDF_MultiCultureOptionValueGet(N'SeoTitle',@Culture)
	SELECT @SeoDescription=dbo.UDF_MultiCultureOptionValueGet(N'SeoDescription',@Culture)
	SELECT @SeoKeywords=dbo.UDF_MultiCultureOptionValueGet(N'SeoKeywords',@Culture)

	--=====================================================
	--==开始添加本语种下的默认 PageDirectoryContent
	--=====================================================	
	EXEC dbo.PageDirectoryContentSave 
	
		@User,				--@User
	
		@PageDirectoryID,		--@PageDirectoryID
	
		@SeoTitle,			--@SeoTitle
		@SeoDescription,		--@SeoDescription
		@SeoKeywords,			--@SeoKeywords

		@Title,				--@Title
		@Description,			--@Description

		N'',				--@Template
		0,				--@Hidden
		0,				--@HiddenInNavigationOnly

		N'',				--@PageHeader
		N'',				--@PageFooter

		N'GetKnowledge.aspx',		--@Url
		0,				--@ThisIsLink

		@Culture,			--@Culture
	
		@oNewID OUT			--@oNewID	

	--=====================================================
	--==下一个语种
	--=====================================================
	FETCH NEXT FROM Cultures_Cursor INTO @Culture

END

CLOSE  Cultures_Cursor
DEALLOCATE  Cultures_Cursor

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[SubDirectoryCreateOverviewPageDirectoryContent]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.MainDirectoryCreateOverviewSubDirectory    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MainDirectoryCreateOverviewSubDirectory]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[MainDirectoryCreateOverviewSubDirectory]
GO

--====================================================================================
--==为给定的 MainDirectory 创建一个 Overview 性质的  SubDirectory （假如该 MainDirectory 下不存在 Overview SubDirectory 的话）
--====================================================================================
--==版权所有 2001-2014 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2013-09-05
--====================================================================================

CREATE PROCEDURE dbo.MainDirectoryCreateOverviewSubDirectory

@User nvarchar(50),				--从 ASPX 端传递过来的当前用户名

@MainDirectoryID int,				--新创建 SubDirectory 对应的 MainDirectory 的 ID
@OverviewPageDirectoryName nvarchar(100),	--内容页名字 （从 MainDirectorySave 传递来）

@oNewID int OUT				--新记录的 ID ，输出参数

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查（这里调用的 SP SubDirectorySave 本身已经有权限检查）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==首先从系统取一个唯一的 Number 用来构造这个新 SubDirectory 的名字
--=====================================================
DECLARE @Name NVARCHAR(100)

DECLARE @UniqueNumber INT
EXEC dbo.UniqueNumberGet @UniqueNumber OUT
		
SELECT @Name=N's' + CONVERT(NVARCHAR(20),@UniqueNumber)

--=====================================================
--==在 Main Directory 创建 Overview Sub Directory 情形，我们让自动创建的 Sub Directory 继承  Main Directory 的名字
--==该机制暂缓启用
--=====================================================
/*
DECLARE @Name NVARCHAR(100)
SELECT @Name=[Name] FROM dbo.MainDirectory WHERE [ID]=@MainDirectoryID
*/

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==继承其父 MainDirectory 的 NewWindow 属性
--=====================================================
DECLARE @NewWindow bit

SELECT @NewWindow=md.NewWindow FROM dbo.MainDirectory md WHERE md.[ID]=@MainDirectoryID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

EXEC dbo.SubDirectorySave 

	@User,				--@User

	@MainDirectoryID,		--@MainDirectoryID

	1,				--@Serial

	@Name,			--@Name
	@OverviewPageDirectoryName,	--@OverviewPageDirectoryName
	@NewWindow,			--@NewWindow （继承其父 MainDirectory 的）
	1,				--@Overview
	0,				--@Wizard

	N'',				--@Editor
	N'',				--@DedicatedTo
	N'',				--@CommentsPermission

	@oNewID OUT			--@oNewID	


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[MainDirectoryCreateOverviewSubDirectory]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.MainDirectoryCreateOverviewSubDirectoryContent    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MainDirectoryCreateOverviewSubDirectoryContent]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[MainDirectoryCreateOverviewSubDirectoryContent]
GO

--====================================================================================
--==为给定的 MainDirectory 创建的 Overview 性质的  SubDirectory 的内容记录的创建（所有语种）
--====================================================================================
--==版权所有 2001-2014 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-22
--====================================================================================

CREATE PROCEDURE dbo.MainDirectoryCreateOverviewSubDirectoryContent

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@SubDirectoryID int,			--即将创建的 SubDirectoryContent 对应的 SubDirectory 的 ID

@oNewID int OUT			--新记录的 ID ，输出参数 （多 Culture 无实际意义）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查（这里调用的 SP SubDirectoryContentSave 本身已经有权限检查）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==系统语种列表 Curosr
--=====================================================
DECLARE @Culture NVARCHAR(100)
DECLARE Cultures_Cursor CURSOR FOR SELECT Culture FROM dbo.UDF_PublicCultures()
OPEN Cultures_Cursor
FETCH NEXT FROM Cultures_Cursor INTO @Culture

WHILE @@FETCH_STATUS=0
BEGIN

	--=====================================================
	--==继承 MainDirectory 当前 Culture 下的 Title 和 Description
	--==注：本 SP 在 SP MainDirectorySave 中被调用的时候，在运行 MainDirectorySave 的时候，MainDirectoryContentSave 还没来得及执行，因此，继承到的 Title 和 Description 仅仅是 NULL 或空值
	--==注：既然这样，为什么还要保留以下代码？因为本 SP 还将被 SP KnowledgeMove 调用，而 SP KnowledgeMove 中，下面这段代码就有意义了
	--=====================================================	
	DECLARE @Title NVARCHAR(200)
	DECLARE @Description NVARCHAR(1000)

	SELECT 

		@Title=mdc.[Title],
		@Description=mdc.[Description]

	FROM dbo.SubDirectory sd
	LEFT JOIN dbo.MainDirectory md ON md.[ID]=sd.MainDirectoryID
	LEFT JOIN dbo.MainDirectoryContent mdc ON md.[ID]=mdc.MainDirectoryID

	WHERE sd.[ID]=@SubDirectoryID AND mdc.[Culture]=@Culture

	--=====================================================
	--==开始添加本语种下的默认 SubDirectoryContent
	--=====================================================	
	EXEC dbo.SubDirectoryContentSave 
	
		@User,				--@User
	
		@SubDirectoryID,		--@SubDirectoryID

		@Title,				--@Title  （继承其父 MainDirectoryContent 的）
		@Description,			--@Description （继承其父 MainDirectoryContent 的）

		N'',				--@WizardPreviousTitle
		N'',				--@WizardNextTitle
		0,				--@Hidden
		0,				--@HiddenInNavigationOnly

		N'',				--@PageHeader
		N'',				--@PageFooter

		N'GetKnowledge.aspx',		--@Url
		0,				--@ThisIsLink

		@Culture,			--@Culture

		@oNewID			--@oNewID

	--=====================================================
	--==下一个语种
	--=====================================================
	FETCH NEXT FROM Cultures_Cursor INTO @Culture

END

CLOSE  Cultures_Cursor
DEALLOCATE  Cultures_Cursor

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[MainDirectoryCreateOverviewSubDirectoryContent]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.CommunityGetNeighbour    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CommunityGetNeighbour]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CommunityGetNeighbour]
GO

--====================================================================================
--==这是 PageDirectoryGetNeighbour 的 Community 版
--==如果系统管理员目前位于社区区域，URL 中必定包含一个 ForumID=xxx QS 参数，我们根据这个 ForumID 可以获知当前所处的 Forum ，继而知道所处的 Community
--==如果是删除 Forum，则检查被删除的 Forum 是否恰好当前所处的 Forum，如果是，则删除结束后，我们重定向到 Neighbour Forum 上
--==如果是删除 Community，则减产被删除的  Community 是否恰好当前所处的 Community，则删除结束后，我们重定向到 Neighbour Community 上
--==如果删除后，Community 已经删光，则，跳到 Admin 菜单避难
--==注：一个 Community 下的 Forum 不存在删光的情形，因为系统有个机制，保护 Community 下唯一的 Forum 不被删除
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-04-05
--====================================================================================

CREATE PROCEDURE dbo.CommunityGetNeighbour

@ForumID int,				--给定的 ForumID

@CommunityDirectory nvarchar(100),	--是 Community, Forum?
@CommunityItem int,			--被删除条目的 ID

@NeighbourID int OUT,			--返回参数,返回的 Neighbour 的 ID （Forum）
@Neighbour nvarchar(100) OUT		--返回参数, 返回的 Neighbour 的名字 （Forum）


AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--================================================
--==获得 @ForumID 对应的  ForumName, CommunityID, CommunitySerial,  ForumSerial
--================================================
DECLARE @ForumName NVARCHAR(100)
DECLARE @CommunityID INT
DECLARE @ForumSerial INT
DECLARE @CommunitySerial INT

SELECT 

	@ForumName=fo.[Name],
	@CommunityID=co.[ID],
	@ForumSerial=fo.Serial,
	@CommunitySerial=co.Serial

FROM dbo.Forum fo 
LEFT JOIN dbo.Community co ON co.[ID]=fo.CommunityID

WHERE fo.[ID]=@ForumID

--================================================
--==获得 @ForumID, @CommunityID 的邻居 ID （如果有 Serial 大一个的，用大一个的，否则用小一个的）
--==首先，初始化为  @ForumNeighbourID=@ForumID，@CommunityNeighbourID=@CommunityID  (事实上，在后面，我们将孤家寡人已经排斥在外了)
--================================================
DECLARE @ForumNeighbourID INT
DECLARE @CommunityNeighbourID INT

SET @ForumNeighbourID=@ForumID
SET @CommunityNeighbourID=@CommunityID

--================================
--==获得 @ForumNeighbourID （找 Serial 临近的，或者 ID 临近的 （有时候 Serial 可能根本没设过，都是 1，这是就要找 ID 临近的）
--================================
IF EXISTS (Select fo.[ID] From dbo.Forum fo Where fo.Serial>@ForumSerial And fo.CommunityID=@CommunityID)

	BEGIN
		SELECT @ForumNeighbourID=(Select Top 1 fo.[ID]  From dbo.Forum fo Where fo.Serial>@ForumSerial And fo.CommunityID=@CommunityID Order By fo.Serial ASC)
	END

ELSE IF EXISTS (Select fo.[ID] From dbo.Forum fo Where fo.Serial<@ForumSerial And fo.CommunityID=@CommunityID)

	BEGIN
		SELECT @ForumNeighbourID=(Select Top 1 fo.[ID]  From dbo.Forum fo Where fo.Serial<@ForumSerial And fo.CommunityID=@CommunityID Order By fo.Serial DESC)
	END
ELSE

	BEGIN

		IF EXISTS (Select fo.[ID] From dbo.Forum fo Where fo.[ID]>@ForumID And fo.CommunityID=@CommunityID)

			BEGIN
				SELECT @ForumNeighbourID=(Select Top 1 fo.[ID]  From dbo.Forum fo Where fo.[ID]>@ForumID And fo.CommunityID=@CommunityID Order By fo.[ID] ASC)			
			END
		ELSE
			BEGIN
				SELECT @ForumNeighbourID=(Select Top 1 fo.[ID]  From dbo.Forum fo Where fo.[ID]<@ForumID And fo.CommunityID=@CommunityID Order By fo.[ID] DESC)			
			END
	END

--================================
--==获得 @CommunityNeighbourID （找 Serial 临近的，或者 ID 临近的 （有时候 Serial 可能根本没设过，都是 1，这是就要找 ID 临近的）
--================================
IF EXISTS (Select co.[ID] From dbo.Community co Where co.Serial>@CommunitySerial)

	BEGIN
		SELECT @CommunityNeighbourID=(Select Top 1 co.[ID]  From dbo.Community co Where co.Serial>@CommunitySerial Order By co.Serial ASC)
	END

ELSE IF EXISTS (Select co.[ID] From dbo.Community co Where co.Serial<@CommunitySerial)

	BEGIN
		SELECT @CommunityNeighbourID=(Select Top 1 co.[ID]  From dbo.Community co Where co.Serial<@CommunitySerial Order By co.Serial DESC)
	END

ELSE

	BEGIN

		IF EXISTS (Select co.[ID] From dbo.Community co Where co.[ID]>@CommunityID)

			BEGIN
				SELECT @CommunityNeighbourID=(Select Top 1 co.[ID]  From dbo.Community co Where co.[ID]>@CommunityID Order By co.[ID] ASC)			
			END
		ELSE
			BEGIN
				SELECT @CommunityNeighbourID=(Select Top 1 co.[ID]  From dbo.Community co Where co.[ID]<@CommunityID Order By co.[ID] DESC)			
			END
	END


--================================================
--==分 @CommunityDirectory=  Community |  Forum  两种情形考虑
--================================================

IF @CommunityDirectory=N'Forum'

	--================================================	
	--==如果是 Forum 情形
	--================================================
	BEGIN

		--================================================
		--==首先看看是不是孤家寡人，是的话，根据我们在 SP ForumDelete 中的约定，孤家寡人的删除会被禁止，则这里也就不存在输出 Neighbour 的问题，直接输出 @ForumID  作为 @NeighbourID 输出
		--================================================
		
		DECLARE @ForumCount INT
		SELECT @ForumCount=COUNT(fo.[ID]) FROM dbo.Forum fo WHERE fo.CommunityID=@CommunityID

		--================================================
		--==是否孤家寡人
		--================================================
		IF @ForumCount<=1

			--================================================
			--==如果《是》孤家寡人
			--================================================
			BEGIN
				SELECT @NeighbourID=@ForumID
				SELECT @Neighbour=@ForumName
			END

		ELSE

			--================================================
			--==如果《不是》孤家寡人
			--================================================
			BEGIN

				--================================================
				--==分是否自己删自己分别考虑
				--================================================
				IF @ForumID=@CommunityItem
	
					BEGIN
						--================================================
						--==如果《是》自己删自己 ...
						--================================================			
						SELECT @NeighbourID=@ForumNeighbourID
						SELECT  @Neighbour=(Select fo.[Name] From dbo.Forum fo Where fo.[ID]=@ForumNeighbourID)
					END

				ELSE
					BEGIN			
						--================================================
						--==如果《不是》自己删自己，直接输出 @ForumID 作为 @NeighbourID OUT
						--================================================			
						SELECT @NeighbourID=@ForumID
						SELECT @Neighbour=@ForumName
					END

			END


	END


ELSE


	--================================================	
	--==如果是 Community 情形
	--================================================
	BEGIN

		--================================================
		--==首先看看是不是孤家寡人，是的话，输出 @NeighbourID=0   ASPX 端看到空的 @NeighbourID 会跳到系统管理那里
		--================================================
		
		DECLARE @CommunityCount INT
		SELECT @CommunityCount=COUNT(co.[ID]) FROM dbo.Community co

		--================================================
		--==是否孤家寡人
		--================================================
		IF @CommunityCount<=1

			--================================================
			--=如果《是》孤家寡人
			--================================================
			BEGIN
				SELECT @NeighbourID=0
				SELECT @Neighbour=N''
			END

		ELSE

			--================================================
			--=如果《不是》孤家寡人
			--================================================
			BEGIN

				--================================================
				--==分是否自己删自己分别考虑
				--================================================
				IF @CommunityID=@CommunityItem
	
					BEGIN
						--================================================
						--==如果《是》自己删自己 ...
						--================================================			
						SELECT  @NeighbourID=(Select Top 1 fo.[ID] From dbo.Forum fo Where fo.CommunityID=@CommunityNeighbourID Order By fo.Serial ASC)
						SELECT  @Neighbour=(Select Top 1 fo.[Name] From dbo.Forum fo Where fo.CommunityID=@CommunityNeighbourID Order By fo.Serial ASC)
					END

				ELSE
					BEGIN			
						--================================================
						--==如果《不是》自己删自己，直接输出 @PageDirectoryName 作为 @Neighbour OUT
						--================================================			
						SELECT @NeighbourID=@ForumID
						SELECT @Neighbour=@ForumName
					END

			END


	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[CommunityGetNeighbour]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeCurrentSerial    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeCurrentSerial]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeCurrentSerial]
GO

--====================================================================================
--==给定 KnowledgeDirectory （MainDirectory, SubDircetory, PageDirectory, Knowledge）
--==给定当前 Parent
--==计算当前 Serial 最大值，再加 1 就是即将新创建 Knowledge 的默认 Serial
--==用途：新添加 MainDirectory/SubDirectory/PageDirectory/Knowledge  的时候，自动为之分配一个最靠后的 Serial
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-04-16
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeCurrentSerial

@KnowledgeDirectory nvarchar(100),		--要添加的 Knowledge 级别 （MainDirectory, SubDircetory, PageDirectory, Knowledge）
@Parent INT,					--要添加的 Knowledge 所属上级目录的 ID

@Serial INT OUT				--当前 Serial 

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==先默认设置 @Serial=1
--====================================================================================
SELECT @Serial=1
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==分 @KnowledgeDirectory 不同情形
--====================================================================================
IF @KnowledgeDirectory=N'MainDirectory'

	BEGIN

		IF EXISTS (Select md.Serial From dbo.MainDirectory md Where md.[System]<>1)
		BEGIN
			SELECT @Serial=MAX(ISNULL(md.Serial,1)) + 1 FROM dbo.MainDirectory md WHERE md.[System]<>1
		END

	END

ELSE IF @KnowledgeDirectory=N'SubDirectory'

	BEGIN

		IF EXISTS (Select sd.Serial From dbo.SubDirectory sd Where sd.MainDirectoryID=@Parent)
		BEGIN
			SELECT @Serial=MAX(ISNULL(sd.Serial,1)) + 1 FROM dbo.SubDirectory sd WHERE sd.MainDirectoryID=@Parent
		END

	END

ELSE IF @KnowledgeDirectory=N'PageDirectory'

	BEGIN

		IF EXISTS (Select pd.Serial From dbo.PageDirectory pd Where pd.SubDirectoryID=@Parent)
		BEGIN
			SELECT @Serial=MAX(ISNULL(pd.Serial,1)) + 1 FROM dbo.PageDirectory pd WHERE pd.SubDirectoryID=@Parent
		END

	END

ELSE IF @KnowledgeDirectory=N'Knowledge'

	BEGIN

		IF EXISTS (Select now.Serial From dbo.Knowledge now Where now.PageDirectoryID=@Parent)
		BEGIN
			SELECT @Serial=MAX(ISNULL(now.Serial,1)) + 1 FROM dbo.Knowledge now WHERE now.PageDirectoryID=@Parent
		END

	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeCurrentSerial]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.CommunityCurrentSerial    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CommunityCurrentSerial]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CommunityCurrentSerial]
GO

--====================================================================================
--==给定 CommunityDirectory （Community, Forum）
--==给定当前 Parent
--==计算当前 Serial 最大值，再加 1 就是即将新创建 Community/Forum  的默认 Serial
--==用途：在添加社区/论坛的时候，可以自动为新社区/论坛设置最靠后的 Serial
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-04-16
--====================================================================================

CREATE PROCEDURE dbo.CommunityCurrentSerial

@CommunityDirectory nvarchar(100),		--要添加的 Community/Forum 级别 （Community, Forum）
@Parent INT,					--要添加的 Community/Forum 所属上级目录的 ID

@Serial INT OUT				--当前 Serial 

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==先默认设置 @Serial=1
--====================================================================================
SELECT @Serial=1
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==分 @CommunityDirectory 不同情形
--====================================================================================
IF @CommunityDirectory=N'Community'

	BEGIN

		IF EXISTS (Select co.Serial From dbo.Community co)
		BEGIN
			SELECT @Serial=MAX(ISNULL(co.Serial,1)) + 1 FROM dbo.Community co
		END

	END

ELSE IF @CommunityDirectory=N'Forum'

	BEGIN

		IF EXISTS (Select fo.Serial From dbo.Forum fo Where fo.CommunityID=@Parent)
		BEGIN
			SELECT @Serial=MAX(ISNULL(fo.Serial,1)) + 1 FROM dbo.Forum fo WHERE fo.CommunityID=@Parent
		END

	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[CommunityCurrentSerial]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeCommentsBatchDelete    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeCommentsBatchDelete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeCommentsBatchDelete]
GO

--====================================================================================
--==批量删除 KnowledgeComments  
--==需要权限检查（只需要判定当前登陆拥护属于 Admin 即可）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-05-15
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeCommentsBatchDelete

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名
@KnowledgeCommentsToBeDeleted nvarchar(4000),		--将被批量删除的 Comments 的 ID 列表

@PageSize int,							--使用该参数计算删除执行后，PageCount 值，以便在删除现场页码定位 （比如，删除时位于第5页，删除后，余下4页，则我们要强迫页码回到第4页）
@PageCount int OUT						--删除后的总页数


AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==如果被删除 KnowledgeComments 列表非空
--=====================================================
IF LEN(RTRIM(LTRIM(@KnowledgeCommentsToBeDeleted)))>0

BEGIN
	
	--=====================================================
	--==获取 @KnowledgeCommentsToBeDeleted 中的第一个记录
	--=====================================================
	DECLARE @KnowledgeCommentsID INT
	SELECT @KnowledgeCommentsID=(Select Top 1 Element From dbo.UDF_PublicSplit(@KnowledgeCommentsToBeDeleted,N','))
	
	--=====================================================
	--==根据 @KnowledgeCommentsToBeDeleted 中的第一个记录获得 KnowledgeID 以便使用 SP AdminEditorUserAuthentication 判断当前用户是否有权限删除
	--==其中 @KnowledgeContentID 是后面 SiteLogSave 使用的
	--=====================================================
	DECLARE @KnowledgeID INT
	DECLARE @KnowledgeContentID INT
	
	SELECT @KnowledgeID=now.[ID] , @KnowledgeContentID=nowc.[ID]
	
	FROM dbo.Knowledge now 
	LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID]
	LEFT JOIN dbo.KnowledgeComments nowcom ON nowcom.KnowledgeContentID=nowc.[ID]
	
	WHERE nowcom.[ID]=@KnowledgeCommentsID
	
	--=====================================================
	--==用户权限检查
	--=====================================================
	DECLARE @oPass INT
	EXEC dbo.AdminEditorUserAuthentication @User,N'Knowledge',@KnowledgeID,@oPass OUT
	IF @oPass=0 BEGIN RETURN END
	
	--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
	
	--=====================================================
	--==执行删除
	--=====================================================
	DELETE FROM dbo.KnowledgeComments WHERE [ID] IN (Select Element From dbo.UDF_PublicSplit(@KnowledgeCommentsToBeDeleted,N','))
	
	--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

	--=====================================================
	--==保存后，返回新的 PageCount
	--=====================================================
	SELECT @PageCount=CEILING (Convert(decimal(18,2),(select count(*) from KnowledgeComments where KnowledgeContentID=@KnowledgeContentID)) / Convert(decimal(18,2),@PageSize))
	
	--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ	

	--=====================================================
	--==记录删除（注：这里记录的是删除了 @KnowledgeContentID 下的 Comments，而不是具体的  @CommentsID）
	--=====================================================
	EXEC dbo.SiteLogSave @User, 20, @KnowledgeContentID

	/*
	DECLARE @CommentsID INT
	DECLARE CommentsID_Cursor CURSOR FOR SELECT Element FROM dbo.UDF_PublicSplit(@KnowledgeCommentsToBeDeleted,N',')
	OPEN CommentsID_Cursor

	FETCH NEXT FROM CommentsID_Cursor INTO @CommentsID
	WHILE @@FETCH_STATUS = 0
	BEGIN
		--=====================================================
		--==将当前活动记录在案（在 @KnowledgeContentID 下删除了评论）
		--=====================================================
		EXEC dbo.SiteLogSave @User, 20, @KnowledgeContentID

		FETCH NEXT FROM CommentsID_Cursor INTO @CommentsID
	END

	CLOSE CommentsID_Cursor
	DEALLOCATE CommentsID_Cursor
	*/

END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeCommentsBatchDelete]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.SystemEntryPageNameGet    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SystemEntryPageNameGet]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SystemEntryPageNameGet]
GO

--====================================================================================
--==从 PageDirectory 表获得其 MainDirectory.System=true 那个记录的 Name
--==用于返回系统区菜单的 Entry 项对应的 PageMenuName （ActivePageMenuName）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-06-16 
--====================================================================================

CREATE PROCEDURE dbo.SystemEntryPageNameGet

@SystemEntryPageName nvarchar(100) OUT		--返回参数,System Entry Page 那页的名字 

AS
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==返回 MainDirectory.System=1 的那个记录
--====================================================================================
SELECT TOP 1

	@SystemEntryPageName=pd.[Name] 

FROM dbo.PageDirectory pd
LEFT JOIN dbo.SubDirectory sd ON sd.[ID]=pd.SubDirectoryID
LEFT JOIN dbo.MainDirectory md ON md.[ID]=sd.MainDirectoryID

WHERE md.[System]=1

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[SystemEntryPageNameGet]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeGetTitles    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeGetTitles]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeGetTitles]
GO

--====================================================================================
--==从 Knowledge 和 KnowledgeContent 表返回指定 @PageDirectoryName 下的 Title 记录（只显示前 5 条）
--==当某个页面（Overview 页面）被设置为 Outline 模式的时候，我们希望在这个页面显示其所有下属栏目的大纲
--==比如，在一个主目录本身的 Overview 内容页面，显示该主目录下，所有子目录，页目录下的前 5 条内容
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-09-06
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeGetTitles

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名

@PageDirectoryName nvarchar(100),				--Page Diretory 的 Name
@Culture nvarchar(100)						--当前文化

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==获得当前 PageDirectory  的 Type 值，如果是 1，则我们后面的结果将使用 Order By Serial （普通内容，以 Serial 排序）； 如果是 2 则 Order By UpdateTime （基于时间的内容以发布时间排序）
--====================================================================================
DECLARE @Type INT
SELECT @Type=Type FROM dbo.PageDirectory WHERE [Name]=@PageDirectoryName
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==从 Option 表返回 KnowledgeApprove 属性
--====================================================================================
DECLARE @KnowledgeApprove NVARCHAR(50)
SELECT @KnowledgeApprove=CONVERT(NVARCHAR(50),opt.[Value]) FROM dbo.[Option] opt WHERE opt.[Key]=N'KnowledgeApprove'

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==根据 Type=1/2 决定后面使用 ORDER BY Serial 还是 UpdateTime （以下两段代码除了 Order By 之外，其它地方完全一致）
--====================================================================================
IF @Type=1

BEGIN

	--====================================================================================
	--==当前用户是 Admin Editor 还是普通用户
	--====================================================================================
	IF  dbo.UDF_UserAdminEditor(@User)=1

	BEGIN

		--====================================================================================
		--==当前用户是 Admin Editor
		--====================================================================================

		SELECT TOP 5

			now.[ID] AS [ID],
			now.PageDirectoryID AS PageDirectoryID,
			now.Serial AS Serial,
			ISNULL(nowc.Hidden,0) AS Hidden,
			ISNULL(nowc.Approved,0) AS Approved,

			nowc.[ID] AS KnowledgeContentID,
			nowc.Title AS Title

		FROM dbo.Knowledge now
		LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
		LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
		WHERE pad.[Name]=@PageDirectoryName

		ORDER BY Serial

	END

	ELSE

	BEGIN
		--====================================================================================
		--==当前用户《不是》 Admin Editor
		--====================================================================================

		SELECT TOP 5

			now.[ID] AS [ID],
			now.PageDirectoryID AS PageDirectoryID,
			now.Serial AS Serial,
			ISNULL(nowc.Hidden,0) AS Hidden,
			ISNULL(nowc.Approved,0) AS Approved,

			nowc.[ID] AS KnowledgeContentID,
			nowc.Title AS Title

		FROM dbo.Knowledge now
		LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]
		LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
		LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
		WHERE pad.[Name]=@PageDirectoryName AND (REPLACE(nowp.DedicatedTo,N',',N'')=N'' or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)  AND  nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N'false')

		ORDER BY Serial
	END

END

ELSE

BEGIN

	--====================================================================================
	--==当前用户是 Admin Editor 还是普通用户
	--====================================================================================
	IF  dbo.UDF_UserAdminEditor(@User)=1

	BEGIN

		--====================================================================================
		--==当前用户是 Admin Editor
		--====================================================================================

		SELECT TOP 5

			now.[ID] AS [ID],
			now.PageDirectoryID AS PageDirectoryID,
			now.Serial AS Serial,
			ISNULL(nowc.Hidden,0) AS Hidden,
			ISNULL(nowc.Approved,0) AS Approved,

			nowc.[ID] AS KnowledgeContentID,
			nowc.Title AS Title

		FROM dbo.Knowledge now
		LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
		LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
		WHERE pad.[Name]=@PageDirectoryName

		ORDER BY UpdateTime DESC

	END

	ELSE

	BEGIN

		--====================================================================================
		--==当前用户《不是》 Admin Editor
		--====================================================================================

		SELECT TOP 5

			now.[ID] AS [ID],
			now.PageDirectoryID AS PageDirectoryID,
			now.Serial AS Serial,
			ISNULL(nowc.Hidden,0) AS Hidden,
			ISNULL(nowc.Approved,0) AS Approved,

			nowc.[ID] AS KnowledgeContentID,
			nowc.Title AS Title

		FROM dbo.Knowledge now
		LEFT JOIN dbo.View_KnowledgePermission nowp ON nowp.KnowledgeID=now.[ID]
		LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID] AND nowc.Culture=@Culture
		LEFT JOIN dbo.PageDirectory pad ON pad.[ID]=now.PageDirectoryID
		WHERE pad.[Name]=@PageDirectoryName AND (REPLACE(nowp.DedicatedTo,N',',N'')=N''  or dbo.UDF_UserDedicatedTo(@User,nowp.DedicatedTo)=1)  AND nowc.Hidden<>1 AND (nowc.Approved=1 OR @KnowledgeApprove=N'false')

		ORDER BY UpdateTime DESC
	END
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeGetTitles]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.PageDirectoryContentSetOutlineMode    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PageDirectoryContentSetOutlineMode]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PageDirectoryContentSetOutlineMode]
GO

--====================================================================================
--==将指定语种下的 PageDirectoryContent 项目的 Outline  属性设置为 true
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-08-29
--====================================================================================

CREATE PROCEDURE dbo.PageDirectoryContentSetOutlineMode

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@PageDirectoryID int,			--当前 PageDirectory 的 ID
@Culture nvarchar(50),			--当前语种
@OutlineMode bit			--是否 OutlineMode （1/0）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'PageDirectory',@PageDirectoryID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前 PageDirectory 的 OutlineMode  设置为 1/0
--=====================================================
UPDATE dbo.PageDirectoryContent SET OutlineMode=@OutlineMode WHERE PageDirectoryID=@PageDirectoryID AND [Culture]=@Culture

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[PageDirectoryContentSetOutlineMode]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ResourcesSelectLightWeight    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ResourcesSelectLightWeight]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ResourcesSelectLightWeight]
GO

--====================================================================================
--==输出指定 Resources 的 LogicalPath, Hidden, Approved, Title 几个属性
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-09-13
--====================================================================================

CREATE PROCEDURE dbo.ResourcesSelectLightWeight

@LogicalPath NVARCHAR(2000)

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （只要是 Admin ChiefEditor, ColumnEditor 三个权限都可以）
--=====================================================
--DECLARE @oPass INT
--EXEC dbo.AdminEditorUserAuthentication @User,N'AdminEditor',0,@oPass OUT
--IF @oPass=0 BEGIN RETURN END
  
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

IF (@LogicalPath=N'') OR (@LogicalPath IS NULL) OR (@LogicalPath=NULL)

BEGIN

	--====================================================================================
	--==选择全部 Resources 表
	--====================================================================================
	SELECT

		res.LogicalPath AS LogicalPath,
		res.Title AS Title,
		res.Hidden AS Hidden,
		res.Approved AS Approved

	FROM dbo.Resources res

END

ELSE

BEGIN

	--====================================================================================
	--==选择指定 Resource
	--====================================================================================
	SELECT

		res.LogicalPath AS LogicalPath,
		res.Title AS Title,
		res.Hidden AS Hidden,
		res.Approved AS Approved

	FROM dbo.Resources res

	WHERE res.LogicalPath=@LogicalPath

END
	
--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ResourcesSelectLightWeight]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ResourcesApproveSave    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ResourcesApproveSave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ResourcesApproveSave]
GO

--====================================================================================
--==保存资源审核信息
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2012-02-23
--====================================================================================

CREATE PROCEDURE dbo.ResourcesApproveSave

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@Name nvarchar(2000),			--当前 Resource 的名字（逻辑路径）
@FileDate datetime,			--当前 Resource 的日期

@DimensionWidth int,			--假如是图片，则这里为图片的宽度
@DimensionHeight int,			--假如是图片，则这里为图片的高度

@FileSize bigint,				--文件尺寸

@Hidden bit,				--是否隐藏 （N'true'  /  N'false'）
@Approved int,				--是否审核通过 （0 / 1）
@ApproveMessage ntext,		--审核意见
@Score int				--评分

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================  
--==用户权限检查 （只要是 Admin ChiefEditor, ColumnEditor 三个权限都可以）  
--=====================================================  
DECLARE @oPass INT  
EXEC dbo.AdminEditorUserAuthentication @User,N'Admin',0,@oPass OUT  
IF @oPass=0 BEGIN RETURN END  

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================  
--==分当前 Resource 记录《是否》存在两种情况
--=====================================================  

IF NOT EXISTS (Select [ID] From dbo.Resources Where LogicalPath=@Name)

BEGIN

	--=====================================================
	--==如果 Resources 中《不存在》该文件，则添加
	--=====================================================

	--=====================================================
	--==添加 Resource 记录到 Resources 表
	--=====================================================
	INSERT dbo.Resources (LogicalPath,FileDate,DimensionWidth,DimensionHeight,FileSize,Tag,Title,Summary,[Description],Hidden,Approved,ApproveMessage,ApprovedBy,Score,ScoreCount) VALUES (@Name,@FileDate,@DimensionWidth,@DimensionHeight,@FileSize,N'',N'',N'',N'',@Hidden,@Approved,@ApproveMessage,@User,@Score,0)

END

ELSE

BEGIN

	--=====================================================
	--==如果 Resources 中已经《存在》该文件，则修改
	--=====================================================

	--=====================================================
	--==修改 Resources  表，修改审核信息以及 Hidden 信息
	--=====================================================
	UPDATE dbo.Resources SET Hidden=@Hidden, Approved=@Approved, ApproveMessage=@ApproveMessage, ApprovedBy=@User, Score=@Score WHERE LogicalPath=@Name

END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ResourcesApproveSave]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ResourcesApproveQuery    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ResourcesApproveQuery]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ResourcesApproveQuery]
GO

--====================================================================================
--==这个 SP 的作用：获取当前用户（Edmin Editor）权限下的资源审核列表 
--==建立分页机制，先将正常查询结果存入一个结构一样（但多了一个PagingID的表变量），根据PagingID，@PageSize，@CurrentPage选取当前页的记录，并将总页数作为一个追加栏位输出
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2011-06-26
--====================================================================================

CREATE PROCEDURE dbo.ResourcesApproveQuery

@User nvarchar(50),			--从 ASPX 端传递来的用户

@ApproveQueryFlag int,			--查询 “待审核 |  已审核 |  我的审核”   （分别取值  0，1，2）

@PageSize INT,			--页码机制：每页的尺寸
@CurrentPage INT,			--页码机制：当前页
@OrderBy nvarchar(100),		--进行排序的列名
@OrderByOrder nvarchar(10)		--排序方式 ASC, DESC

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==权限检查（不需要）
--=====================================================

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用来构建 Where 从句
--=====================================================
DECLARE @DynSQL NVARCHAR(4000)    
DECLARE @DynWhere NVARCHAR(4000)

--=====================================================
--==创建分页表 
--=====================================================
SET @DynSQL=N' SET NOCOUNT ON   '
SET @DynSQL=@DynSQL + N' Declare @Paging table '
SET @DynSQL=@DynSQL + N' ( '
SET @DynSQL=@DynSQL + N' PagingID int identity(1,1), '
SET @DynSQL=@DynSQL + N' [ID] int, '
SET @DynSQL=@DynSQL + N' LogicalPath nvarchar(2000) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' FileDate datetime, '
SET @DynSQL=@DynSQL + N' DimensionWidth int, '
SET @DynSQL=@DynSQL + N' DimensionHeight int, '
SET @DynSQL=@DynSQL + N' FileSize bigint, '
SET @DynSQL=@DynSQL + N' Title nvarchar(200) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' Hidden bit, '
SET @DynSQL=@DynSQL + N' Approved int, '
SET @DynSQL=@DynSQL + N' ApprovedBy nvarchar(50) COLLATE database_default '
SET @DynSQL=@DynSQL + N' ) '

--=====================================================
--==填充分页表
--=====================================================
SET @DynSQL=@DynSQL + N' Insert into @Paging '

SET @DynSQL=@DynSQL + N' Select    '  
SET @DynSQL=@DynSQL + N' res.[ID] as [ID], '
SET @DynSQL=@DynSQL + N' res.LogicalPath as LogicalPath, '
SET @DynSQL=@DynSQL + N' res.FileDate as FileDate, '
SET @DynSQL=@DynSQL + N' ISNULL(res.DimensionWidth,0) as DimensionWidth, '
SET @DynSQL=@DynSQL + N' ISNULL(res.DimensionHeight,0) as DimensionHeight, '
SET @DynSQL=@DynSQL + N' ISNULL(res.FileSize,0) as FileSize, '
SET @DynSQL=@DynSQL + N' Case res.Title When Null Then dbo.UDF_PublicResolveFileName(res.Logicalpath) When N'''' Then dbo.UDF_PublicResolveFileName(res.LogicalPath) Else res.Title End as Title, '
SET @DynSQL=@DynSQL + N' ISNULL(res.Hidden,0) as Hidden, '
SET @DynSQL=@DynSQL + N' ISNULL(res.Approved,0) as Approved, '
SET @DynSQL=@DynSQL + N' ISNULL(res.ApprovedBy,N'''') as ApprovedBy '

SET @DynSQL=@DynSQL + N' From dbo.Resources res '

--=====================================================
--==根据 @ApproveQueryFlag= 0/1/2 使用不同的条件  （0 - 待审核   1- 已审核   2 - 我的审核）
--=====================================================
DECLARE @ApproveQueryFlagClause NVARCHAR(1000)

IF @ApproveQueryFlag=1
	
	BEGIN
		SET @ApproveQueryFlagClause=N'  res.Approved=1  '
	END

ELSE IF @ApproveQueryFlag=2
	
	BEGIN
		SET @ApproveQueryFlagClause=N'  res.Approved=1 AND res.ApprovedBy=N''' + @User + N'''  '
	END
ELSE
	
	BEGIN
		SET @ApproveQueryFlagClause=N'  res.Approved<>1  '		
	END

--=====================================================
--==根据当前用户的权限，使用不同条件
--=====================================================
SET @DynSQL=@DynSQL + N'  WHERE ' + @ApproveQueryFlagClause

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--===========================================================
--==加上 Order By 从句
--==如果 OrderBy='' 则，使用缺省 order by UpdateTime DESC
--===========================================================
SET @OrderBy=LTRIM(RTRIM(@OrderBy))
SET @OrderByOrder=LTRIM(RTRIM(@OrderByOrder))
		
IF LEN(@OrderBy)=0 OR  LEN(@OrderByOrder)=0
	BEGIN
	SET @DynSQL=@DynSQL + N' order by FileDate DESC '
	END
ELSE
	BEGIN
	SET @DynSQL=@DynSQL + N' order by [' + @OrderBy + N'] ' + @OrderByOrder
	END
		

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
--=====================================================
--==最后从 @Paging 表变量中获取数据
--=====================================================
Declare @FirstRecord int
Declare @LastRecord int
		
set @FirstRecord=(@CurrentPage - 1) * @PageSize	--当前页第一个记录前
set @LastRecord=(@CurrentPage * @PageSize + 1)	--当前页最后一个记录后
		
--=====================================================
--==总记录数，除以每页的记录数，用Ceiling()处理，得到的为页数 （注意：count(*)  和 @PageSize 都为 INT，它们相除将得到 INT，所以，首先要将它们转换成 Decimal(18,2)）
--=====================================================
set @DynSQL=@DynSQL + N' Select *,PageCount=CEILING (Convert(decimal(18,2),(select count(*) from @Paging)) / Convert(decimal(18,2),' + Convert(nvarchar(20),@PageSize) + N')) From @Paging Where PagingID>' + Convert(nvarchar(20),@FirstRecord) + N' and PagingID<' + Convert(nvarchar(20),@LastRecord)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--============================================
--==检查动态语句的长度，不可以超过系统上限
--============================================
DECLARE @oPassDynSQL INT
EXEC dbo.PublicDynSQLLengthCheck @DynSQL,@oPassDynSQL OUT
IF @oPassDynSQL=0 BEGIN RETURN END

--=====================================================
--==执行动态 SQL 语句， 开始统计
--=====================================================
EXEC(@DynSQL)
RETURN

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ResourcesApproveQuery]  TO [public]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ResourcesSaveLightWeight    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ResourcesSaveLightWeight]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ResourcesSaveLightWeight]
GO

--====================================================================================
--==保存 Resources 的轻量版本，从资源库逐个获取文件，这些文件可能是 FTP 上来的，这些文件的信息还没入数据库，我们使用本 SP 将这些文件的信息逐个同步上来
--==只保存 Resources 表中不存在的记录 （已经存在的，说明是通过别的方式已经保存上来了）
--==只保存 LogicalPath, FileDate, DimensionWidth,DimensionHeight,FileSize 几个字段； Hidden, Approved 使用默认值 （0,0）
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2012-02-23
--====================================================================================

CREATE PROCEDURE dbo.ResourcesSaveLightWeight

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@LogicalPath nvarchar(2000),		--当前 Resource 的逻辑路径
@FileDate datetime,			--当前 Resource 的文件日期（最后一次修改的日期）
@DimensionWidth int,			--当前 Resource （如果是图片）的图片宽度
@DimensionHeight int,			--当前 Resource （如果是图片）的图片高度
@FileSize bigint,				--当前 Resource 的文件尺寸

@oResult int OUT			--如果该资源还没有入库，添加后返回 1；如果该资源已经在数据库中存在，返回 0 （我们在该 SP 的消费场合会根据这个返回结果，告诉系统对刚刚遍历的资源文件使用不同颜色进行标注）

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （只要是 Admin ChiefEditor, ColumnEditor 三个权限都可以）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'AdminEditor',0,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==不存在，则添加
--=====================================================
IF NOT EXISTS (Select [ID] From dbo.Resources Where LogicalPath=@LogicalPath)

BEGIN

	--=====================================================
	--==添加 Resources 记录
	--=====================================================
	INSERT INTO dbo.Resources(LogicalPath,FileDate,DimensionWidth,DimensionHeight,FileSize,Tag,Title,Summary,[Description],Hidden,Approved,ApproveMessage,ApprovedBy,Score,ScoreCount) VALUES(@LogicalPath,@FileDate,@DimensionWidth,@DimensionHeight,@FileSize,N'',N'',N'',N'',0,0,N'',N'',0,0)

	--=====================================================
	--==文件不存在，添加后返回 1
	--=====================================================
	SELECT @oResult=1

END

ELSE

BEGIN  
	--=====================================================
	--==文件已经存在，则再强迫刷新一下 FileDate, DimensionWidth, DimensionHeight, FileSize
	--=====================================================
	UPDATE dbo.Resources SET FileDate=@FileDate, DimensionWidth=@DimensionWidth, DimensionHeight=@DimensionHeight, FileSize=@FileSize WHERE LogicalPath=@LogicalPath

	--=====================================================
	--==文件已经存在，返回 0
	--=====================================================
	SELECT @oResult=0
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ResourcesSaveLightWeight]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ResourcesQueryByFileName    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ResourcesQueryByFileName]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ResourcesQueryByFileName]
GO

--====================================================================================
--==以 FileName 搜索 Resources
--==建立分页机制，先将正常查询结果存入一个结构一样（但多了一个PagingID的表变量），根据PagingID，@PageSize，@CurrentPage选取当前页的记录，并将总页数作为一个追加栏位输出
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-02-23
--====================================================================================

CREATE PROCEDURE dbo.ResourcesQueryByFileName

@User nvarchar(50),			--从 aspx 端传递过来的用户名

@FileName nvarchar(2000),		--搜索 Tag （如： N'Logo,Banner'      或者  N'*'     或者   N'视频+广告'）

@SearchDirectory nvarchar(2000),	--从哪个目录下搜索  （注：在调用该 SP 时，为该 SP 提供参数的时候，@SearchDirectory 已经确保包含了最后的 "/"，如 /writable/resource/ ）
@IncludeSubdirectory bit,		--搜索的时候是否包含下级目录

@OrderBy nvarchar(100),		--进行排序的列名
@OrderByOrder nvarchar(10),		--排序方式 ASC, DESC

@PageSize INT,			--页码机制：每页的尺寸
@CurrentPage INT			--页码机制：当前页


AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==对 @FileName 参数进行处理，将其中的 “*” 通配符换成 %
--=====================================================
SET @FileName=REPLACE(@FileName,N'*',N'%')

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （只要是 Admin ChiefEditor, ColumnEditor 三个权限都可以）（注：2010-07-12：由于引入了 Resource Reference 机制，因此，现在不能再限制该 SP 的权限，因为在 Resource Reference 中，很可能发生普通访问者的页面引用 Resource 的情形）
--=====================================================
--DECLARE @oPass INT
--EXEC dbo.AdminEditorUserAuthentication @User,N'AdminEditor',0,@oPass OUT
--IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==创建分页表 
--=====================================================
SET NOCOUNT ON

DECLARE @Paging TABLE
( 
	PagingID int identity(1,1), 
	[ID] int, 
	LogicalPath nvarchar(2000) COLLATE database_default, 
	[FileName] nvarchar(2000) COLLATE database_default, 
	FileDate datetime,
	DimensionWidth int,
	DimensionHeight int,
	FileSize bigint,
	Tag nvarchar(1000) COLLATE database_default,
	Title nvarchar(200)  COLLATE database_default,
	Summary nvarchar(4000) COLLATE database_default,
	[Description] nvarchar(4000) COLLATE database_default,
	Hidden bit,
	Approved int,
	ApproveMessage nvarchar(4000) COLLATE database_default,
	ApprovedBy nvarchar(50) COLLATE database_default,
	Score int,
	ScoreCount int
 ) 

--=====================================================
--==从 Option 表查看 ResourceApprove 属性
--=====================================================
DECLARE @ResourceApprove NVARCHAR(50)
SELECT @ResourceApprove=CONVERT(NVARCHAR(50),opt.[Value]) FROM dbo.[Option] opt WHERE opt.[Key]=N'ResourceApprove'

--=====================================================
--==参数 @OrderBy 和 @OrderByOrder 初始化
--=====================================================
IF @OrderBy=N'' OR @OrderBy=NULL OR @OrderBy IS NULL

BEGIN
	SELECT @OrderBy=N'FileDate'
END

IF @OrderByOrder=N'' OR @OrderByOrder=NULL OR @OrderByOrder IS NULL

BEGIN
	SELECT @OrderByOrder=N'DESC'
END

--=====================================================
--==填充分页表 （分 @IncludeSubdirectory=1/0 两种情形）
--=====================================================
IF @IncludeSubdirectory=1

BEGIN

	--=====================================================
	--==根据当前用户角色分两种情况 （系统管理员返回全部，非系统管理员只返回 Hidden=false 以及 Approved=1 的项目）
	--=====================================================
	IF dbo.UDF_UserAdmin(@User)=1

	BEGIN

		--=====================================================
		--==搜索《包含》下级目录 |  当前用户《是》 Admin
		--=====================================================


		--=====================================================
		--不同的 OrderBy 和 OrderByOrder  （以下 6 段代码唯一的区别是  Order By 从句）
		--=====================================================
		IF @OrderBy=N'FileName' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(@SearchDirectory,res.LogicalPath)>0)
		ORDER BY [FileName] ASC	
		--========================

		END

		ELSE IF @OrderBy=N'FileDate' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(@SearchDirectory,res.LogicalPath)>0)
		ORDER BY res.FileDate ASC	
		--========================

		END

		ELSE IF @OrderBy=N'FileScore' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(@SearchDirectory,res.LogicalPath)>0)
		ORDER BY res.Score ASC	
		--========================

		END

		ELSE IF @OrderBy=N'FileName' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(@SearchDirectory,res.LogicalPath)>0)
		ORDER BY [FileName] DESC	
		--========================

		END

		ELSE IF @OrderBy=N'FileDate' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(@SearchDirectory,res.LogicalPath)>0)
		ORDER BY res.FileDate DESC	
		--========================

		END

		ELSE IF @OrderBy=N'FileScore' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(@SearchDirectory,res.LogicalPath)>0)
		ORDER BY res.Score DESC	
		--========================

		END

	END

	ELSE

	BEGIN

		--=====================================================
		--==搜索《包含》下级目录 |  当前用户《不是》 Admin
		--=====================================================

		--=====================================================
		--不同的 OrderBy 和 OrderByOrder  （以下 6 段代码唯一的区别是  Order By 从句）
		--=====================================================
		IF @OrderBy=N'FileName' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount		

		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(@SearchDirectory,res.LogicalPath)>0) AND (res.Hidden<>1) AND (res.Approved=1 OR @ResourceApprove=N'false')
		ORDER BY [FileName] ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileDate' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount		

		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(@SearchDirectory,res.LogicalPath)>0) AND (res.Hidden<>1) AND (res.Approved=1 OR @ResourceApprove=N'false')
		ORDER BY res.FileDate ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileScore' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount		

		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(@SearchDirectory,res.LogicalPath)>0) AND (res.Hidden<>1) AND (res.Approved=1 OR @ResourceApprove=N'false')
		ORDER BY res.Score ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileName' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount		

		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(@SearchDirectory,res.LogicalPath)>0) AND (res.Hidden<>1) AND (res.Approved=1 OR @ResourceApprove=N'false')
		ORDER BY [FileName] DESC
		--========================

		END

		ELSE IF @OrderBy=N'FileDate' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount		

		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(@SearchDirectory,res.LogicalPath)>0) AND (res.Hidden<>1) AND (res.Approved=1 OR @ResourceApprove=N'false')
		ORDER BY res.FileDate DESC
		--========================

		END

		ELSE IF @OrderBy=N'FileScore' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount		

		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(@SearchDirectory,res.LogicalPath)>0) AND (res.Hidden<>1) AND (res.Approved=1 OR @ResourceApprove=N'false')
		ORDER BY res.Score DESC
		--========================

		END

	END

END

ELSE

BEGIN

	--=====================================================
	--==根据当前用户角色分两种情况 （系统管理员返回全部，非系统管理员只返回 Hidden=false 以及 Approved=1 的项目）
	--=====================================================
	IF dbo.UDF_UserAdmin(@User)=1

	BEGIN

		--=====================================================
		--==搜索《不》包含下级目录 |  当前用户《是》Admin
		--=====================================================

		--=====================================================
		--不同的 OrderBy 和 OrderByOrder  （以下 6 段代码唯一的区别是  Order By 从句）
		--=====================================================
		IF @OrderBy=N'FileName' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================

		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0)
		ORDER BY [FileName] ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileDate' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0)
		ORDER BY res.FileDate ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileScore' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0)
		ORDER BY res.Score ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileName' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0)
		ORDER BY [FileName] DESC
		--========================

		END

		ELSE IF @OrderBy=N'FileDate' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0)
		ORDER BY res.FileDate DESC
		--========================

		END

		ELSE IF @OrderBy=N'FileScore' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0)
		ORDER BY res.Score DESC
		--========================

		END

	END

	ELSE

	BEGIN


		--=====================================================
		--==搜索《不》包含下级目录 |  当前用户《不是》 Admin
		--=====================================================

		--=====================================================
		--不同的 OrderBy 和 OrderByOrder  （以下 6 段代码唯一的区别是  Order By 从句）
		--=====================================================
		IF @OrderBy=N'FileName' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0) AND (res.Hidden<>1) AND (res.Approved=1 OR @ResourceApprove=N'false')
		ORDER BY [FileName] ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileDate' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0) AND (res.Hidden<>1) AND (res.Approved=1 OR @ResourceApprove=N'false')
		ORDER BY res.FileDate ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileScore' AND @OrderByOrder=N'ASC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,

			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0) AND (res.Hidden<>1) AND (res.Approved=1 OR @ResourceApprove=N'false')
		ORDER BY res.Score ASC
		--========================

		END

		ELSE IF @OrderBy=N'FileName' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0) AND (res.Hidden<>1) AND (res.Approved=1 OR @ResourceApprove=N'false')
		ORDER BY [FileName] DESC
		--========================

		END

		ELSE IF @OrderBy=N'FileDate' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0) AND (res.Hidden<>1) AND (res.Approved=1 OR @ResourceApprove=N'false')
		ORDER BY res.FileDate DESC
		--========================

		END

		ELSE IF @OrderBy=N'FileScore' AND @OrderByOrder=N'DESC'

		BEGIN

		--========================
		INSERT INTO @Paging 		
		SELECT   DISTINCT
		
			res.[ID] as [ID], 
			res.LogicalPath as LogicalPath, 
			dbo.UDF_PublicResolveFileName(res.LogicalPath) as [FileName],
			res.FileDate as FileDate,
			res.DimensionWidth as DimensionWidth,
			res.DimensionHeight as DimensionHeight,
			res.FileSize as FileSize,
			res.Tag as Tag,
			res.Title as Title,
			CONVERT(NVARCHAR(4000),res.Summary) as Summary,
			CONVERT(NVARCHAR(4000),res.[Description]) as [Description],
			res.Hidden as Hidden,
			res.Approved as Approved,
			CONVERT(NVARCHAR(4000),res.ApproveMessage) as ApproveMessage,
			res.ApprovedBy as ApprovedBy,
			res.Score as Score,
			res.ScoreCount as ScoreCount
		
		FROM dbo.Resources res
		WHERE (dbo.UDF_PublicResolveFileName(res.LogicalPath) LIKE (N'%' + @FileName + N'%')) AND (CHARINDEX(N'/',REPLACE(res.LogicalPath,@SearchDirectory,N''))=0) AND (res.Hidden<>1) AND (res.Approved=1 OR @ResourceApprove=N'false')
		ORDER BY res.Score DESC
		--========================

		END

	END

END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
		
--=====================================================
--==最后从 @Paging 表变量中获取数据
--=====================================================
Declare @FirstRecord int
Declare @LastRecord int
		
set @FirstRecord=(@CurrentPage - 1) * @PageSize	--当前页第一个记录前
set @LastRecord=(@CurrentPage * @PageSize + 1)	--当前页最后一个记录后
		
--=====================================================
--==总记录数，除以每页的记录数，用Ceiling()处理，得到的为页数 （注意：count(*)  和 @PageSize 都为 INT，它们相除将得到 INT，所以，首先要将它们转换成 Decimal(18,2)）
--=====================================================

SELECT 
	*,
	PageCount=CEILING (Convert(decimal(18,2),(select count(*) from @Paging)) / Convert(decimal(18,2),@PageSize)) 

FROM @Paging

WHERE PagingID>@FirstRecord AND PagingID<@LastRecord


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

RETURN

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ResourcesQueryByFileName]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ResourcesModify    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ResourcesModify]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ResourcesModify]
GO

--====================================================================================
--==修改 Resources
--==Tag 将冗余地保存在两个位置：1. Resources 表（以 "," 隔开的字符串）    2. ResourcesTags  （单一 Tag， 以 ResourcesID 对应 Resources 表）
--====================================================================================
--==系统 Score 机制：除了在 Resources 表有 Score 和 ScoreCount 记录之外，ResourcesScore 表还将保存每一次打分记录（ResourceID，打分者的 IP，打分时间，分数），每次打分都自动计算出平均值冗余保存到 Resources 表的 Score 列，打分次数也冗余保存到 ScoreCount 列。这样做的目的是为了快速返回某个资源的分数与打分次数，而不必每次都现计算
--==系统管理员在 ModifyResource 中，可以强行覆盖 Score 列的值，但 ScoreCount 不会覆盖，因为 Resources.Score 随时都是最新的，因此，系统管理员进入 ModifyResource 界面看到的分数也是准确的，他如果不想覆盖这个打分，可以不修改直接保存，这套分数依然保持不变
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2012-02-23
--====================================================================================

CREATE PROCEDURE dbo.ResourcesModify

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@OldLogicalPath nvarchar(2000),	--当前 Resource 的《旧》逻辑路径
@NewLogicalPath nvarchar(2000),	--当前 Resource 的《新》逻辑路径

@FileDate datetime,			--当前 Resource 的文件日期（最后一次修改的日期）

@DimensionWidth int,			--如果是图片，其宽度
@DimensionHeight int,			--如果是图片，其高度
@FileSize bigint,				--文件尺寸

@Tag nvarchar(1000),			--当前 Resource 的标签（以 "," 间隔多个标签）
@Title nvarchar(200),			--当前 Resource 的标题
@Summary ntext,			--当前 Resource 的概要
@Description ntext,			--当前 Resource 的描述
@Hidden bit,				--当前 Resource 是否隐藏
@Approved int,				--当前 Resource 是否审核通过
@ApproveMessage ntext,		--当前 Resource 的审核意见
@Score int				--当前 Resource 的评分

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （只要是 Admin ChiefEditor, ColumnEditor 三个权限都可以）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'AdminEditor',0,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==被修改的 Resources 的记录 ID
--=====================================================
DECLARE @ResourcesID INT
SELECT @ResourcesID=res.[ID] FROM dbo.Resources res WHERE res.LogicalPath=@OldLogicalPath

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==ScoreCount 保持不变，该参数只有在用户打分的时候，才会累加到这里
--=====================================================
DECLARE @ScoreCount INT
SELECT @ScoreCount=res.ScoreCount FROM dbo.Resources res WHERE res.[ID]=@ResourcesID

IF @ScoreCount=NULL OR @ScoreCount IS NULL
BEGIN
	SELECT @ScoreCount=0
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==首先删除 Resources  中可能已经存在了的该文件的记录
--=====================================================
DELETE FROM dbo.Resources WHERE [ID]=@ResourcesID

--=====================================================
--==接着删除 ResourcesTags  中对应的 Tag 记录
--=====================================================
DELETE FROM dbo.ResourcesTags WHERE ResourcesID=@ResourcesID

--=====================================================
--==添加 Resources 记录
--=====================================================
INSERT INTO dbo.Resources(LogicalPath,FileDate,DimensionWidth,DimensionHeight,FileSize,Tag,Title,Summary,[Description],Hidden,Approved,ApproveMessage,ApprovedBy,Score,ScoreCount) VALUES(@NewLogicalPath,@FileDate,@DimensionWidth,@DimensionHeight,@FileSize,@Tag,@Title,@Summary,@Description,@Hidden,@Approved,@ApproveMessage,@User,@Score,@ScoreCount)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==立即捕获刚刚保存的那条消息的 ID
--======================================================
DECLARE @oNewID INT
SELECT @oNewID=SCOPE_IDENTITY()	--输出参数等于刚刚生成的新记录的ID（SCOPE_IDENTITY() 意味着仅限于本 Seesion 内的本表）

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--======================================================
--==将 Tag （可能是“,” 隔开的列表）分解，保存在 ResourcesTags 表
--======================================================
INSERT INTO dbo.ResourcesTags(ResourcesID,Tag) SELECT @oNewID, Element FROM dbo.UDF_PublicSplit(@Tag,N',')

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ResourcesModify]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ResourcesFolderMove    Script Date: 2013-11-13 7:11:51 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ResourcesFolderMove]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ResourcesFolderMove]
GO

--====================================================================================
--==移动某个目录下的全部 Resources
--==对 Resources 表所有记录，将其 LogicalPath 前面的  OldFolder  目录部分，修改为 NewFolder 目录部分
--==比如，如果要将 avi 目录移动到 mppp 目录下，则将 /writable/resources/avi/...  修改为 /writable/resources/mppp/avi/...
--====================================================================================
--==版权所有 2001-2009 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2009-09-25
--====================================================================================

CREATE PROCEDURE dbo.ResourcesFolderMove

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@OldFolder nvarchar(2000),		--就 Resources 文件夹所在目录路径
@NewFolder nvarchar(2000)		--移动后的新文件夹（已经包含了自身部分）所在目录路径


AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （只要是 Admin ChiefEditor, ColumnEditor 三个权限都可以）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'AdminEditor',0,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将 LogicalPath 中，前面为 @OldFolder 的部分修改为 @NewFolder
--==为什么要使用 N'?'+LogicalPath？这样做的目的是为了确保只从路径的左边开始的位置进行替换，以防发生从   /writable/resource/mppp/my/writable/resource/mppp/avi  中替换 /writable/resource/mppp/ 而导致路径中间的 /writable/resource/mppp/ 也被替换的事情 （因为我们的替换是只针对路径左侧的部分的）
--=====================================================

UPDATE dbo.Resources SET LogicalPath= REPLACE(N'?'+LogicalPath,N'?'+@OldFolder,@NewFolder) WHERE CHARINDEX(N'?'+@OldFolder,N'?'+LogicalPath)>0

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ResourcesFolderMove]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.ResourcesFolderCopy    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ResourcesFolderCopy]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ResourcesFolderCopy]
GO

--====================================================================================
--==复制某个目录下的全部 Resources 到一个新目录
--==对 Resources 表所有记录，将其 LogicalPath 前面为  OldFolder  部分的记录进行复制，并将 OldFolder 部分修改为 NewFolder 部分
--==比如，如果要将 avi 目录复制到 mppp 目录下，则将 LogicalPath 前面包含 /writable/resources/avi/...  的记录复制后，并将其 LogicalPath 的  /writable/resources/avi/ 部分修改为 /writable/resources/mppp/avi/...
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2012-02-23
--====================================================================================

CREATE PROCEDURE dbo.ResourcesFolderCopy

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@SourceFolder nvarchar(2000),		--被复制的 Resource 文件夹所在的目录路径
@TargetFolder nvarchar(2000)		--目标文件夹所在的目录路径


AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查 （只要是 Admin ChiefEditor, ColumnEditor 三个权限都可以）
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'AdminEditor',0,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==获取 @SourceFolder 下所有记录，生成 CURSOR
--=====================================================
DECLARE @LogicalPath NVARCHAR(2000)
DECLARE @FileDate DATETIME
DECLARE @DimensionWidth INT
DECLARE @DimensionHeight INT
DECLARE @FileSize BIGINT
DECLARE @Tag NVARCHAR(1000)
DECLARE @Title NVARCHAR(200)
DECLARE @Summary NVARCHAR(4000)
DECLARE @Description NVARCHAR(4000)
DECLARE @Hidden BIT
DECLARE @Approved INT
DECLARE @ApproveMessage NVARCHAR(4000)
DECLARE @ApprovedBy NVARCHAR(50)
DECLARE @Score INT
DECLARE @ScoreCount INT

DECLARE Source_Cursor CURSOR FOR SELECT res.LogicalPath, res.FileDate, res.DimensionWidth,res.DimensionHeight,res.FileSize,res.Tag, res.Title,res.Summary, res.[Description], res.Hidden, res.Approved, res.ApproveMessage, res.ApprovedBy, res.Score, res.ScoreCount FROM dbo.Resources res WHERE CHARINDEX(N'?'+@SourceFolder,N'?'+res.LogicalPath)>0
OPEN Source_Cursor

FETCH NEXT FROM Source_Cursor 
INTO @LogicalPath, @FileDate, @DimensionWidth, @DimensionHeight, @FileSize, @Tag, @Title, @Summary, @Description, @Hidden, @Approved, @ApproveMessage, @ApprovedBy, @Score, @ScoreCount

WHILE @@FETCH_STATUS = 0
BEGIN

	--=====================================================
	--==将当前复制的 @LogicalPath 修改为 @TargetFolder 下的
	--=====================================================
	SELECT @LogicalPath=REPLACE(N'?'+@LogicalPath,N'?'+@SourceFolder,@TargetFolder)

	--=====================================================
	--==将当前记录复制 （调用 SP ResourcesSave）
	--=====================================================
	EXEC  dbo.ResourcesSave @User, @LogicalPath, @FileDate, @DimensionWidth, @DimensionHeight, @FileSize, @Tag, @Title, @Summary, @Description, @Hidden, @Approved, @ApproveMessage, @Score

	--=====================================================
	--==还要补上 SP ResourcesSave 所不具备的两个列 @ApprovedBy 和 @ScoreCount
	--=====================================================
	UPDATE dbo.Resources SET ApprovedBy=@ApprovedBy, ScoreCount=@ScoreCount WHERE LogicalPath=@LogicalPath

	--=====================================================
	--==下一个
	--=====================================================
	FETCH NEXT FROM Source_Cursor 
	INTO @LogicalPath, @FileDate, @DimensionWidth, @DimensionHeight, @FileSize, @Tag, @Title, @Summary, @Description, @Hidden, @Approved, @ApproveMessage, @ApprovedBy, @Score, @ScoreCount

END

CLOSE Source_Cursor
DEALLOCATE Source_Cursor

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[ResourcesFolderCopy]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicStatusSetRevoke    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicStatusSetRevoke]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicStatusSetRevoke]
GO

--====================================================================================
--==撤销 Elite 和 Taboo 的设置
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-21
--====================================================================================

CREATE PROCEDURE dbo.TopicStatusSetRevoke

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@TopicID int			--主题的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查（只有系统管理员和斑竹才有权限撤销对一个主题 Elite 和 Taboo 的设置）
--=====================================================
DECLARE @oPass INT
EXEC dbo.TopicUserAuthenticationSetStatus @User,@TopicID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==首先获得当前 Topic 下的跟帖数量，根据这个数量决定该 Topic 的  Status
--=====================================================
DECLARE @TopicStatus INT

SET @TopicStatus=
(
	Select 
		Case 
			When Count([ID]) IS NULL Then 1 			--空主题
			When Count([ID])<1 Then 1				--空主题
			When Count([ID])>=1 And Count([ID])<10 Then 2		--非空主题
			When Count([ID])>=10 Then 3				--热门主题
		 End 

		From dbo.FollowUp Where TopicID=@TopicID
)

--=====================================================
--==设置
--=====================================================
UPDATE dbo.Topic SET TopicStatus=@TopicStatus WHERE [ID]=@TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicStatusSetRevoke]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicUserAuthenticationSaveSilent    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicUserAuthenticationSaveSilent]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicUserAuthenticationSaveSilent]
GO

--====================================================================================
--==SP TopicUserAuthenticationSave 的安静版本 （只输出 oPass 结果，不返回错误消息）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24 
--====================================================================================

CREATE PROCEDURE dbo.TopicUserAuthenticationSaveSilent

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@Forum INT,			--指定 Forum

@oPass INT OUT		--输出参数：通过返回 1，否则 0

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--==========================================
--==先假设 检查通过
--==========================================
SET @oPass=1

--=========================================
--==使用 UDF_ForumTopicWritable 函数，检查当前用户对当前论坛是否有发贴权限
--=========================================
IF dbo.UDF_ForumTopicWritable(@User,@Forum)=0 OR @User=N''

BEGIN
	SET @oPass=0
	RETURN
END

--SET @oPass=dbo.UDF_ForumTopicWritable(@User,@Forum)
--RETURN

/*
--==========================================
--==先假设 检查通过
--==========================================
SET @oPass=1

--=========================================
--==如果当前用户没有注册为 Community 用户，则返回 0
--=========================================
IF (dbo.UDF_UserCommunity(@User)<>1)  AND (dbo.UDF_UserAdmin(@User)<>1)

BEGIN
	SET @oPass=0
	RETURN
END

--=========================================
--==如果当前用户是 Community，但在 UserForums 中 对本 Forum 配置的 TopicWriteEnabled 权限不是 1，则返回 0
--=========================================
IF (NOT EXISTS (Select [ID] From dbo.UserForums Where [User]=@User And Forum=@Forum And TopicWriteEnabled=1)) AND (dbo.UDF_UserAdmin(@User)<>1)

BEGIN
	SET @oPass=0
	RETURN
END
*/

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicUserAuthenticationSaveSilent]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.FollowUpUserAuthenticationSaveSilent    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FollowUpUserAuthenticationSaveSilent]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[FollowUpUserAuthenticationSaveSilent]
GO

--====================================================================================
--==SP FollowUpUserAuthenticationSave 的安静版本 （只输出结果，不输出错误消息）
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-24
--====================================================================================

CREATE PROCEDURE dbo.FollowUpUserAuthenticationSaveSilent

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@Topic INT,			--指定 Topic

@oPass INT OUT		--输出参数：通过返回 1，否则 0

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--==========================================
--==先假设 检查通过
--==========================================
SET @oPass=1

--=========================================
--==根据 Topic ID 获得 Forum ID
--=========================================
DECLARE @Forum INT
SET @Forum=dbo.UDF_GetForumIDFromTopicID(@Topic)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=========================================
--==使用 UDF_ForumFollowUpWritable 函数，检查当前用户对当前论坛是否有跟贴权限
--=========================================
IF dbo.UDF_ForumFollowUpWritable(@User,@Forum)=0 OR @User=N''

BEGIN
	SET @oPass=0
	RETURN
END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

/*
--=========================================
--==如果当前用户没有注册为 Community用户，则举错，并退出
--=========================================
IF (dbo.UDF_UserCommunity(@User)<>1)  AND (dbo.UDF_UserAdmin(@User)<>1)

BEGIN
	SET @oPass=0
	RETURN
END

--=========================================
--==如果当前用户是 Community，但在 UserForums 中 对本 Forum 配置的 TopicWriteEnabled 权限不是 1，则举错，并退出 （说明用户没有对该 Forum 发帖权限）
--=========================================
IF (NOT EXISTS (Select [ID] From dbo.UserForums Where [User]=@User And Forum=@Forum And FollowUpWriteEnabled=1)) AND (dbo.UDF_UserAdmin(@User)<>1)

BEGIN
	SET @oPass=0
	RETURN
END
*/

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[FollowUpUserAuthenticationSaveSilent]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.TopicStatusSetSticky    Script Date: 2013-11-13 7:11:54 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TopicStatusSetSticky]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[TopicStatusSetSticky]
GO

--====================================================================================
--==将某个主题设置为置顶主题
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2010-11-24 
--====================================================================================

CREATE PROCEDURE dbo.TopicStatusSetSticky

@User nvarchar(50),		--从 ASPX 端传递过来的当前用户名

@TopicID int			--主题的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==用户权限检查（只有系统管理员和斑竹才有权限置顶）
--=====================================================
DECLARE @oPass INT
EXEC dbo.TopicUserAuthenticationSetStatus @User,@TopicID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==设置
--=====================================================
UPDATE dbo.Topic SET TopicStatus=6 WHERE [ID]=@TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（修改了帖子）
--=====================================================
EXEC dbo.SiteLogSave @User, 14, @TopicID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[TopicStatusSetSticky]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.CommunityReference    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CommunityReference]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CommunityReference]
GO

--====================================================================================
--==这个 SP 的作用：在社区引用中，返回给定论坛的 TopN 条记录
--====================================================================================
--==版权所有 2001-2010 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2010-11-24
--====================================================================================

CREATE PROCEDURE dbo.CommunityReference

@User nvarchar(50),			--从 ASPX 端传递过来的当前用户名

@Culture nvarchar(50),			--当前语种 （为了返回该语种下的 TopicStatus 描述）
@ForumID int,				--Forum 的 ID  （社区搜索是指定 Forum 内部的搜索，即只搜索本 Forum 内的内容）
@TopN int				--最新的多少条记录

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==参数的逃逸处理（仅在存在动态语句的地方使用）
--=====================================================
SET @Culture=dbo.UDF_PublicStringEscape(@Culture)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================  
--==用户权限检查  （返回一个表，只有一个列 ForumReadable，记录当前 Forum 针对当前用户，是否有权限浏览，以便社区引用方确定是否输出返回的最新 TopN 帖子 ）
--=====================================================  
SELECT 

	dbo.UDF_ForumReadable(@User,@ForumID) AS ForumReadable, 
	dbo.UDF_UserAdmin(@User) | dbo.UDF_UserModerator(@User,@ForumID) AS ForumReadableEvenHidden,
	coc.Hidden |  foc.Hidden AS ForumHidden

FROM dbo.Community co
LEFT JOIN dbo.CommunityContent coc ON coc.CommunityID=co.[ID] AND coc.Culture=@Culture
LEFT JOIN dbo.Forum fo ON fo.CommunityID=co.[ID]
LEFT JOIN dbo.ForumContent foc ON foc.ForumID=fo.[ID] AND foc.Culture=@Culture

WHERE fo.[ID]=@ForumID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==构建 DynSQL 语句
--=====================================================
DECLARE @DynSQL NVARCHAR(4000)    

SET @DynSQL=N''

SET @DynSQL=@DynSQL + N' Select top  ' + convert(nvarchar(20),@TopN) + N' '  
SET @DynSQL=@DynSQL + N' tp.[ID] as [ID], '
SET @DynSQL=@DynSQL + N' tp.[User] as TopicUser, '
SET @DynSQL=@DynSQL + N' tp.Title as Title, '
SET @DynSQL=@DynSQL + N' convert(nvarchar(4000),tp.Content) as Content, '
SET @DynSQL=@DynSQL + N' tp.Hit as HitCount, '
SET @DynSQL=@DynSQL + N' ts.[ID] as TopicStatus, '
SET @DynSQL=@DynSQL + N' ts.IconName as TopicStatusIconName, '
SET @DynSQL=@DynSQL + N' dbo.UDF_TopicStatusDescription(' +  convert(nvarchar(20),@ForumID) + ',N'''  + @Culture +  ''',ts.[ID]) as TopicStatusDescription, '
SET @DynSQL=@DynSQL + N' tp.PostTime as PostTime, '
SET @DynSQL=@DynSQL + N' COUNT(fu.[ID]) as FollowUps '

SET @DynSQL=@DynSQL + N' From dbo.Topic tp '
SET @DynSQL=@DynSQL + N' Left Join dbo.FollowUp fu ON fu.TopicID=tp.[ID] '
SET @DynSQL=@DynSQL + N' Inner Join dbo.TopicStatus ts ON ts.[ID]=tp.TopicStatus '
SET @DynSQL=@DynSQL + N' Where tp.ForumID= ' + CONVERT(nvarchar(20),@ForumID) + N' '

SET @DynSQL=@DynSQL + N' group by tp.[ID], tp.[User], tp.Title,convert(nvarchar(4000),tp.Content), tp.Hit, ts.[ID], ts.IconName, tp.PostTime '
SET @DynSQL=@DynSQL + N' order by PostTime DESC '


--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--============================================
--==检查动态语句的长度，不可以超过系统上限
--============================================
DECLARE @oPassDynSQL INT
EXEC dbo.PublicDynSQLLengthCheck @DynSQL,@oPassDynSQL OUT
IF @oPassDynSQL=0 BEGIN RETURN END

--=====================================================
--==执行动态 SQL 语句， 开始统计
--=====================================================
EXEC(@DynSQL)
RETURN

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[CommunityReference]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.XToolLogonRecord    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[XToolLogonRecord]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[XToolLogonRecord]
GO


--====================================================================================
--==系统工具 - 该工具用来生成用户登录站点记录报告
--==显示不同用户登录站点次数以及每次登录时间记录
--==该工具只用于系统只用于开发，部署，升级，最终用户不可以使用该工具进行任何操作
--====================================================================================
--==版权所有 2001-2011 COMSHARP CMS （锐商企业CMS） http://www.comsharp.com
--==最新修改 2011-02-23  
--====================================================================================

CREATE PROCEDURE dbo.XToolLogonRecord

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--========================================
--==用户 CURSOR
--========================================
declare @SiteLog_User nvarchar(50)
declare @SiteLog_User_LogonTimes int

declare SiteLog_User_Cursor cursor for select sl.[User],count(sl.[ID]) as LogonTimes from dbo.SiteLog sl where len(sl.[User])>0 and sl.Activity=0 group by sl.[User] order by LogonTimes desc
open SiteLog_User_Cursor

	fetch next from SiteLog_User_Cursor into @SiteLog_User,@SiteLog_User_LogonTimes

	while @@fetch_status=0
	begin

		--========================================
		--==打印当前用户及其登录总次数
		--========================================	
		print @SiteLog_User + N' (Logons: ' + convert(nvarchar(20),@SiteLog_User_LogonTimes) + N')' + char(13)
		print N'-----------------------------------------------------' + char(13)

		--========================================
		--==用户登录记录 CURSOR
		--========================================		
		declare @SiteLog_ActivityTime datetime
		declare SiteLog_ActivityTime_Cursor cursor for select isl.ActivityTime from dbo.SiteLog isl where isl.[User]=@SiteLog_User and isl.Activity=0 order by isl.ActivityTime desc
		open SiteLog_ActivityTime_Cursor
		
			fetch next from SiteLog_ActivityTime_Cursor into @SiteLog_ActivityTime
			while @@fetch_status=0
			begin

				--========================================
				--==打印登录记录
				--========================================	
				print convert(nvarchar(20),@SiteLog_ActivityTime) + char(13)

				--========================================
				--==继续用户登录记录 CURSOR
				--========================================	
				fetch next from SiteLog_ActivityTime_Cursor into @SiteLog_ActivityTime

			end

		close SiteLog_ActivityTime_Cursor
		deallocate SiteLog_ActivityTime_Cursor

		--========================================
		--==当前用户及其登录总次数结束
		--========================================	
		print char(13)
		print char(13)
		print char(13)

		--========================================
		--==继续用户 CURSOR
		--========================================	
		fetch next from SiteLog_User_Cursor into @SiteLog_User,@SiteLog_User_LogonTimes
	end

close SiteLog_User_Cursor
deallocate SiteLog_User_Cursor

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[XToolLogonRecord]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeCommentsGetAdmin    Script Date: 2013-11-13 7:11:52 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeCommentsGetAdmin]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeCommentsGetAdmin]
GO

--====================================================================================
--==以系统后台管理员的名义返回所有 KnowledgeComments
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-12-12
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeCommentsGetAdmin

@PageSize INT,						--页码机制：每页的尺寸
@CurrentPage INT,						--页码机制：当前页
@OrderBy nvarchar(100),					--进行排序的列名
@OrderByOrder nvarchar(10)					--排序方式 ASC, DESC

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==动态 SQL 语句
--====================================================================================
DECLARE @DynSQL nvarchar(4000)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==创建一个 table 变量，容纳结果，以便在后面进行分页处理
--====================================================================================

SET @DynSQL=N' SET NOCOUNT ON   '
SET @DynSQL=@DynSQL + N' Declare @Paging table '
SET @DynSQL=@DynSQL + N' ( '


SET @DynSQL=@DynSQL + N' PagingID int identity(1,1), '
SET @DynSQL=@DynSQL + N' [ID] int, '
SET @DynSQL=@DynSQL + N' CommentsTime datetime, '
SET @DynSQL=@DynSQL + N' CommentsUser nvarchar(50) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' CommentsContent nvarchar(100) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' CommentsContentMore nvarchar(1000) COLLATE database_default, '
SET @DynSQL=@DynSQL + N' KnowledgeTitle nvarchar(2000) COLLATE database_default, '

SET @DynSQL=@DynSQL + N' PageDirectoryName nvarchar(100)  COLLATE database_default, '
SET @DynSQL=@DynSQL + N' KnowledgeID int, '
SET @DynSQL=@DynSQL + N' Culture nvarchar(100)  COLLATE database_default '
SET @DynSQL=@DynSQL + N' ) '

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--====================================================================================
--==选择所有 Knowledge 的 Comments
--====================================================================================
SET @DynSQL=@DynSQL + N' INSERT INTO @Paging '

SET @DynSQL=@DynSQL + N' SELECT '

SET @DynSQL=@DynSQL + N' nowco.[ID] AS [ID], '
SET @DynSQL=@DynSQL + N' nowco.CommentsTime AS CommentsTime, '
SET @DynSQL=@DynSQL + N' nowco.CommentsUser AS CommentsUser, '
SET @DynSQL=@DynSQL + N' LEFT(nowco.CommentsContent,100) AS CommentsContent, '
SET @DynSQL=@DynSQL + N' nowco.CommentsContent AS CommentsContentMore, '
SET @DynSQL=@DynSQL + N' nowc.[Title] AS KnowledgeTitle, '

SET @DynSQL=@DynSQL + N' pd.[Name] AS PageDirectoryName, '
SET @DynSQL=@DynSQL + N' now.[ID] AS KnowledgeID, '
SET @DynSQL=@DynSQL + N' nowc.Culture AS Culture '
	
SET @DynSQL=@DynSQL + N' FROM dbo.KnowledgeComments nowco '
SET @DynSQL=@DynSQL + N' LEFT JOIN dbo.KnowledgeContent nowc ON nowc.[ID]=nowco.KnowledgeContentID '
SET @DynSQL=@DynSQL + N' LEFT JOIN dbo.Knowledge now ON now.[ID]=nowc.KnowledgeID '
SET @DynSQL=@DynSQL + N' LEFT JOIN dbo.PageDirectory pd ON pd.[ID]=now.PageDirectoryID '

--=====================================================
--==加上 Order By 从句
--==如果 OrderBy='' 则，使用缺省 order by CommentsTime DESC
--=====================================================
SET @OrderBy=LTRIM(RTRIM(@OrderBy))
SET @OrderByOrder=LTRIM(RTRIM(@OrderByOrder))

IF LEN(@OrderBy)=0 OR  LEN(@OrderByOrder)=0

	BEGIN
	SET @DynSQL=@DynSQL + N' order by nowco.[CommentsTime] DESC '
	END
ELSE
	BEGIN
	SET @DynSQL=@DynSQL + N' order by nowco.[' + @OrderBy + N'] ' + @OrderByOrder
	END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==最后从 @Paging 表变量中获取数据
--===================================================== 
Declare @FirstRecord int
Declare @LastRecord int

set @FirstRecord=(@CurrentPage - 1) * @PageSize	--当前页第一个记录前
set @LastRecord=(@CurrentPage * @PageSize + 1)	--当前页最后一个记录后

--=====================================================
--==总记录数，除以每页的记录数，用Ceiling()处理，得到的为页数 （注意：count(*)  和 @PageSize 都为 INT，它们相除将得到 INT，所以，首先要将它们转换成 Decimal(18,2)）
--=====================================================
set @DynSQL=@DynSQL + N' Select *,PageCount=CEILING (Convert(decimal(18,2),(select count(*) from @Paging)) / Convert(decimal(18,2),' + Convert(nvarchar(20),@PageSize) + N')) From @Paging Where PagingID>' + Convert(nvarchar(20),@FirstRecord) + N' and PagingID<' + Convert(nvarchar(20),@LastRecord)

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--============================================
--==检查动态语句的长度，不可以超过系统上限
--============================================
DECLARE @oPassDynSQL INT
EXEC dbo.PublicDynSQLLengthCheck @DynSQL,@oPassDynSQL OUT
IF @oPassDynSQL=0 BEGIN RETURN END

--=====================================================
--==执行动态 SQL 语句， 开始统计
--=====================================================
EXEC(@DynSQL)
RETURN
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeCommentsGetAdmin]  TO [public]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

/****** Object:  Stored Procedure dbo.KnowledgeCommentsDeleteAdmin    Script Date: 2013-11-13 7:11:53 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KnowledgeCommentsDeleteAdmin]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[KnowledgeCommentsDeleteAdmin]
GO

--====================================================================================
--==以后台管理员的名义删除 KnowledgeComments  
--==和 KnowledgeCommentsDelete 的区别，KnowledgeCommentsDelete 删除后还要返回的 PageSize 之类的内容以便在内容现场定位到 KnowledgeComments 页码位置，这里不必，这里删除后，重新定位会最新 KnowledgeComments 列表第一页
--==需要权限检查（只需要判定当前登陆拥护属于 Admin 即可）
--====================================================================================
--==版权所有 2001-2012 COMSHARP CMS （锐商企业CMS）http://www.comsharp.com
--==最新修改 2012-12-12
--====================================================================================

CREATE PROCEDURE dbo.KnowledgeCommentsDeleteAdmin

@User nvarchar(50),						--从 ASPX 端传递过来的当前用户名
@KnowledgeCommentsID int					--将被删除的 Comments 的 ID

AS

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==根据 @KnowledgeCommentsID 获得 KnowledgeID 以便使用 SP AdminEditorUserAuthentication 判断当前用户是否有权限删除
--==其中 @KnowledgeContentID 是后面 SiteLogSave 使用的
--=====================================================
DECLARE @KnowledgeID INT
DECLARE @KnowledgeContentID INT

SELECT @KnowledgeID=now.[ID] , @KnowledgeContentID=nowc.[ID]

FROM dbo.Knowledge now 
LEFT JOIN dbo.KnowledgeContent nowc ON nowc.KnowledgeID=now.[ID]
LEFT JOIN dbo.KnowledgeComments nowcom ON nowcom.KnowledgeContentID=nowc.[ID]

WHERE nowcom.[ID]=@KnowledgeCommentsID

--=====================================================
--==用户权限检查
--=====================================================
DECLARE @oPass INT
EXEC dbo.AdminEditorUserAuthentication @User,N'Knowledge',@KnowledgeID,@oPass OUT
IF @oPass=0 BEGIN RETURN END

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==执行删除
--=====================================================
DELETE FROM dbo.KnowledgeComments WHERE [ID]=@KnowledgeCommentsID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

--=====================================================
--==将当前活动记录在案（在 @KnowledgeContentID 下删除了评论）
--=====================================================
EXEC dbo.SiteLogSave @User, 20, @KnowledgeContentID

--ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

GRANT  EXECUTE  ON [dbo].[KnowledgeCommentsDeleteAdmin]  TO [public]
GO

