PDA

View Full Version : خطای syntax در with



fakhravari
یک شنبه 10 آذر 1392, 19:37 عصر
declare @PageIndex int = 1;
declare @PageSize int = 10;

declare @RowStart int=0;
declare @RowFnish int=0;
set @RowStart = (@PageIndex -1) * @PageSize;
set @RowFnish = @PageIndex * @PageSize;
Declare @Tbl TABLE([Subject] NVARCHAR(200),[Message]NVARCHAR (max),[Rng] int);


with t1 as
(
SELECT [Subject],[Message],ROW_NUMBER() OVER (ORDER BY TopicID ASC) AS Rng FROM B_Topics
)
INSERT INTO @Tbl SELECT [Subject],[Message],Rng FROM [t1]
with t2 as
(
SELECT * FROM @Tbl WHERE Rng BETWEEN 5 AND (SELECT COUNT(*)-5 FROM @Tbl)
)
SELECT * FROM t2 WHERE Rng BETWEEN @RowStart and @RowFnish

Msg 336, Level 15, State 1, Line 16
Incorrect syntax near 't2'. If this is intended to be a common table expression, you need to explicitly terminate the previous statement with a semi-colon.
:متفکر:

محمد سلیم آبادی
دوشنبه 11 آذر 1392, 18:52 عصر
اگر WITH به عنوان CTE یا مبسوط common table expression در نظر گرفته شده باشه حتما باید عبارت قبلی (در صورت وجود) با کاراکتر سمی کلون خاتمه پیدا کنه. در غیر اینصورت با خطای Syntax مواجه خواهید شد.

در کد قرار داده شده جمله ی قبل از WITH دوم با ; خاتمه نیافته.
ضمن اینکه اصلا نیاز به WITH در اینجا نیست!

بطور نمونه برای WITH اول این کد را جایگزین کنید:


INSERT INTO @tbl
SELECT [Subject],[Message],ROW_NUMBER() OVER (ORDER BY TopicID ASC) AS Rng
FROM B_Topics;

این سوال به تاپیک FAQ افزوده شد.

fakhravari
شنبه 16 آذر 1392, 20:26 عصر
سلام داش ممد
درسته نیازی نیست.
برای یادگیری حالا در مورد with هم ; گذاشتم باز خطا داد.
with t2 as
(
SELECT * FROM @Tbl WHERE Rng BETWEEN 5 AND (SELECT COUNT(*)-5 FROM @Tbl)
);
SELECT * FROM t2 WHERE Rng BETWEEN @RowStart and @RowFnish

محمد سلیم آبادی
شنبه 16 آذر 1392, 21:24 عصر
--این خطوط تماما یک عبارت را تشکیل می دهند
/******************/
with t1 as
(
SELECT [Subject],[Message],ROW_NUMBER() OVER (ORDER BY TopicID ASC) AS Rng FROM B_Topics
)
INSERT INTO @Tbl SELECT [Subject],[Message],Rng FROM [t1]; --سمی کلون در انتهای عبارت اول
/******************/

--این خطوط تماما یک عبارت را تشکیل می دهند
/******************/
with t2 as
(
SELECT * FROM @Tbl WHERE Rng BETWEEN 5 AND (SELECT COUNT(*)-5 FROM @Tbl)
)
SELECT * FROM t2 WHERE Rng BETWEEN @RowStart and @RowFnish; --سمی کلون در انتهای عبارت دوم
/******************/

fakhravari
شنبه 16 آذر 1392, 22:48 عصر
:لبخندساده: o my god
ممنون
declare @PageIndex int = 1;
declare @PageSize int = 10;

declare @RowStart int=0;
declare @RowFnish int=0;
set @RowStart = (@PageIndex -1) * @PageSize;
set @RowFnish = @PageIndex * @PageSize;
Declare @Tbl TABLE([Subject] NVARCHAR(200),[Message]NVARCHAR (max),[Rng] int);


with t1 as
(
SELECT [Subject],[Message],ROW_NUMBER() OVER (ORDER BY TopicID ASC) AS Rng FROM B_Topics
)
INSERT INTO @Tbl SELECT [Subject],[Message],Rng FROM [t1] ;
with t2 as
(
SELECT * FROM @Tbl WHERE Rng BETWEEN 5 AND (SELECT COUNT(*)-5 FROM @Tbl)
)
SELECT * FROM t2 WHERE Rng BETWEEN @RowStart and @RowFnish;