PDA

View Full Version : مشکل در Sort کردن اطلاعات بوسیله پارامترهای وروری



hakan648
دوشنبه 28 شهریور 1390, 11:44 صبح
سلام
من برای اینکه سایتی که قرار منتشر کنم , قابلیت شخصی سازی بالایی داشته باشه و از طرفی نیازی به انجام کارهای دشوار برای کاربر نباشه , تعداد رکورد هایی که باید از جدول تاپیک بازیابی بشن , فیلدهایی که اطلاعات باید بوسیله اونها Sort بشن و جهت sort کردن رو بوسیله پارامتر ها به یک SP میفرستم .
با جستحو هایی که انجام دادم تونستم کدهارو در دو بخش View , SP بنویسم - استفاده از View هم بدلیل داشتن دو مقدار در جدول بود که باید تقسیم اونها به عنوان یک فیلد واحد خروجی داده می شدند! ( TopicTotalRate تقسیم بر TopicCountRate که فیلد FinalRate رو خروجی میده ! )
کد View :

SELECT TopicID, TopicCategoryID, TopicAuthorUserID, TopicTitle, TopicSummary, TopicBody, TopicAddDate, TopicUpDate, TopicViewCounter, TopicStatus,
ROUND(CAST(TopicTotalRate AS FLOAT) / CAST(TopicCountRate AS FLOAT), 0) AS FinalRate
FROM dbo.Topics




کد SP :

CREATE PROCEDURE GetAllactiveTopic( @TopicCategoryID int, @SortBy nvarchar(200), -- [view,rate,date,title,author,update]
@SortType varchar(20), -- [asc,desc]
@RowReturnCount int -- <rows to return>
)
AS
BEGIN IF @SortType = 'desc'
BEGIN SELECT TOP (CAST(@RowReturnCount as int)) TopicID, TopicCategoryID, TopicAuthorUserID, TopicTitle, TopicSummary, TopicBody, TopicAddDate, TopicUpDate, TopicViewCounter, FinalRate
FROM View_GetAllActiveTopics WHERE TopicStatus = 1 ORDER BY CASE @SortBy
WHEN 'view' THEN TopicViewCounter
WHEN 'rate' THEN FinalRate
WHEN 'date' THEN TopicAddDate
WHEN 'title' THEN TopicTitle
WHEN 'author' THEN TopicAuthorUserID
WHEN 'update' THEN TopicUpDate
END DESC -- if @SortType is set to desc
END
ELSE
BEGIN
SELECT TOP (CAST(@RowReturnCount as int)) TopicID, TopicCategoryID, TopicAuthorUserID, TopicTitle, TopicSummary, TopicBody, TopicAddDate, TopicUpDate, TopicViewCounter, FinalRate
FROM View_GetAllActiveTopics
WHERE TopicStatus = 1 ORDER BY CASE @SortBy
WHEN 'view' THEN TopicViewCounter
WHEN 'rate' THEN FinalRate
WHEN 'date' THEN TopicAddDate
WHEN 'title' THEN TopicTitle
WHEN 'author' THEN TopicAuthorUserID
WHEN 'update' THEN TopicUpDate END ASC -- if @SortType isnot set to desc
END
END


کد جدول تاپیک ها :




CREATE TABLE [dbo].[Topics](
[TopicID] [int] IDENTITY(1,1) NOT NULL,
[TopicCategoryID] [int] NOT NULL,
[TopicAuthorUserID] [nvarchar](20) NOT NULL,
[TopicTitle] [nvarchar](200) NOT NULL,
[TopicSummary] [nvarchar](2000) NOT NULL,
[TopicBody] [nvarchar](max) NOT NULL,
[TopicAddDate] [datetime] NOT NULL,
[TopicUpDate] [datetime] NULL,
[TopicViewCounter] [int] NOT NULL,
[TopicTotalRate] [int] NOT NULL,
[TopicCountRate] [int] NOT NULL,
[TopicStatus] [int] NOT NULL,
CONSTRAINT [PK_Topics] PRIMARY KEY CLUSTERED
(
[TopicID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Topics] WITH CHECK ADD CONSTRAINT [FK_Topics_Categories] FOREIGN KEY([TopicCategoryID])
REFERENCES [dbo].[Categories] ([CategoryID])
GO

ALTER TABLE [dbo].[Topics] CHECK CONSTRAINT [FK_Topics_Categories]
GO

ALTER TABLE [dbo].[Topics] WITH CHECK ADD CONSTRAINT [FK_Topics_Users] FOREIGN KEY([TopicAuthorUserID])
REFERENCES [dbo].[Users] ([UserID])
GO

ALTER TABLE [dbo].[Topics] CHECK CONSTRAINT [FK_Topics_Users]
GO

ALTER TABLE [dbo].[Topics] ADD CONSTRAINT [DF_Topics_TopicAddDate] DEFAULT (getdate()) FOR [TopicAddDate]
GO

ALTER TABLE [dbo].[Topics] ADD CONSTRAINT [DF_Topics_TopicViews] DEFAULT ((0)) FOR [TopicViewCounter]
GO

ALTER TABLE [dbo].[Topics] ADD CONSTRAINT [DF_Topics_TopicTotalRate] DEFAULT ((3)) FOR [TopicTotalRate]
GO

ALTER TABLE [dbo].[Topics] ADD CONSTRAINT [DF_Topics_TopicCountRate] DEFAULT ((1)) FOR [TopicCountRate]
GO

ALTER TABLE [dbo].[Topics] ADD CONSTRAINT [DF_Topics_TopicStatus] DEFAULT ((1)) FOR [TopicStatus]
GO




حالا مشکل اینجاست که وقتی SP رو به شکل زیر صدا میزنم با درستی کار میکنه :

EXEC GetAllActiveTopic 1 , 'rate' , 'desc' , 5

====================
75491
====================

ولی وقتی به شکل زیر صدا میزنم خطا میده :

EXEC GetAllActiveTopic 1 , 'title' , 'desc' , 5



اگه به توضیحات کدها دقت کنید , میبینید که SP این پارامتر هارو قبول میکنه :
view,rate,date,update,title,author
از بین این پارامترها فقط پارامترهای غیر رشته ای به درستی اجرا میشوند و پارامتر های رشته ای ( title,author ) خطا میدن!!!



Msg 241, Level 16, State 1, Procedure GetAllactiveTopic, Line 17
Conversion failed when converting date and/or time from character string.


حالا نکته جالب اینجاست که وقتی خود View رو مستقیم طبق کد زیر اجرا میکنم , با همه ی پارامتر ها اجرا شده و خطا نمیده :

SELECT * FROM View_GetAllActiveTopics ORDER BY TopicTitle



شرمنده اینقدر طولانی شد سوال , امیدوارم بنده رو راهنمایی بفرمایید !
با تشکر فراوان از دوستان گرامی ... :قلب: