ورود

View Full Version : چگونگی برطرف کردن Syntax error or access violation



لوسیمی
جمعه 13 بهمن 1385, 08:24 صبح
سلام
کدی به شکل زیر نوشته ام که error زیر را دارد، لطفاً مشکل من را حل کنید.

declare test cursor
for
select books.name,borrow.reg,.books.author
from books inner join borrow
on book.reg=borrow.reg
where book.entity_num>1
for read_only
open test
declare @name nvarchar,n int=1
fetch next from test into @name
while @@fetch_status=0 begin
select n=n+1
fetch next absolute{n} from test into @name1
while @@fetch_status=0 begin
if @name=@name1
print @name1
else
print @name
fetch next absolute{n} from test into @name1
end
fetch next from test into @name
end
close test
deallocate test


[Microsoft][ODBC SQL Server Driver]Syntax error or access violation
با تشکر

darvishiali
جمعه 13 بهمن 1385, 14:47 عصر
سلام؛

ببخشید، اما کد شما خیلی عیب داره! (هم Syntax و هم Logic)

1- برای استفاده از ABSOLUTE در CURSOR ، احتیاجی به { } نیست. فقط عدد رو جلوش بنویسین
2- برای استفاده از ABSOLUTE در CURSOR ، نباید نوع حرکت بعدی CURSOR مشخص بشه (نباید از NEXT، PRIOR و ... ) استفاده کنید. باید اینطوری بنویسید :


FETCH ABSOLUTE 5 FROM CursorName


(در حقیقت، ABSOLUTE از رکورد جاری، به n سطر بعد (در صورت مثبت بودن n) پرش می کنه و اون رکورد رو برمی گردونه. RELATIVE هم دقیقا عکسه اینه؛ یعنی به n رکورد قبل (در صورت مثبت بودن n) پرش می کنه و اون رو برمی گردونه)

3- برای استفاده از ABSOLUTE باید از انواع خاص CURSOR (مثلا نوع SCROLL) استفاده کنید. برای استفاده از نوع SCROLL باید از DECLARE CursorName SCROLL استفاده کنید.

در ضمن اون پیغام خطایی هم که به شما میده بخاطر وجود {} در Syntax هست که SQL فکر می کنه این Syntax از یه Data Provider مثلا MSDataShape اومده.

اگه باز هم برای کار با این نوع CURSOR مشکلی داشتی، خوشحال میشم بتونم کمکی کنم!

zerobit-ltd
جمعه 13 بهمن 1385, 15:29 عصر
این script کلی syntax error داره:

1) نوع cursor رو باید بعد از کلمه cursor تعیین کرد:



declare test cursor read_only



2) نقطه قبل از books واسه چیه؟



select books.name,borrow.reg,.books.author
3) n int=1 اشتباس. اولا اگر n متغیره، باید با @ شروع شه. دوما default value برای متغیرهای تعریفی داخل بدنه کد خطاست. باید بعد از تعریف متغیر، با دستور set بهش مقداردهی کنی:




declare @n int
set @n = 1

4) اگر طول متغیر name@ رو تعیین نکنی، طولش رو 1 در نظر می گیره.



declare @name varchar(255)

5) وقتی از دستور fetch استفاده می کنی، باید جلوی into به تعداد فیلدهایی که تو select مربوط به تعریف cursor نوشتی، متغیر بذاری. چون
for select books.name,
borrow.reg,
books.author
from books inner join borrow
on book.reg=borrow.reg
where book.entity_num>1
3 تا فیلد بر می گردونه، باید جلوی fetch سه تا متغیر بذاری که یه دونه گذاشتی.
6) fetch next absolute{n} from test into @name1
متغیر name1@ تعریف نشده.
7) چون از absolute استفاده می کنی، نوع cursor حتما باید از نوی scroll باشه.
8) جلوی absolute یا باید عدد صحیح باشه یا متغیر از نوع tinyint یا smallint یا int. نیازی هم به { } یا ( ) نداره.
script شما رو من اینجوری اصلاح کردم:



declare @Name nvarchar(200),
@Name1 nvarchar(200),
@N int

set @N = 1

declare cur_Test cursor scroll
for select Books.Name
from Books inner join Borrow
on Books.Reg = Borrow.Reg
where Book.Entity_Num > 1

open cur_Test

fetch next from cur_Test
into @Name

print @name

while @@fetch_status = 0
begin
set @N = @N + 1
fetch absolute @N from cur_Test
into @Name1
while @@fetch_status = 0
begin
if @Name = @Name1
print @Name1
else
print @Name
fetch absolute @N from cur_Test into @Name1
end
fetch next from cur_Test into @Name
end

close cur_Test
deallocate cur_Test

نکته آخر اینکه فکر می کنم برنامت از لحاظ منطقی مشکل داره. چون من تست کردم، تو حلقه بدون پایان می افته و فقط رکورد اول رو چاپ می کنه.

لوسیمی
جمعه 13 بهمن 1385, 15:32 عصر
سلام
از راهنماییتان ممنونم در ضمن من syntax کدم را طبق کتاب sql transact نوشتم .