PDA

View Full Version : select FieldName1 as @Varible1,fldname2 as @Valible2 ...



rezaei manesh
پنج شنبه 21 دی 1385, 13:36 عصر
سلام
من نیاز دارم که در یک حلقه اطلاعات فیلد های یک رکورد رو درون چندتا متغیر در یک پروسیجر بنویسم
یعنی به این شکا


SELECT BBEGINDATE AS @BBEGINDATE, BBEGINTIME AS @BBEGINTIME, BENDDATE AS @BENDDATE, BENDTIME AS @BENDTIME, DBEGINTIME AS @DBEGINTIME, DENDDATE AS @DENDDATE ,
DENDTIME AS @DENDTIME, EBEGINTIME AS @EBEGINTIME, EBEGINDATE AS @EBEGINDATE, EENDDATE AS @EENDDATE, EENDTIME AS @EENDTIME, ENDDATE AS @ENDDATE ,
ENDTIME AS @ENDTIME , HOLIDAY AS @HOLIDAY
FROM dbo.ShiftItemDef

اما خطا می ده آخه بنده خدا نمی دونه که خروجی سلکت حتما یک رکورد هست گیر میده فکر می کنه که چند تا رکورد هست و می نمی شه بزارم تو متغیر
حالا من می خوام یک دستور بگین که این کار رو برام انجام بده ؟
اگه می خواین بگین با کرسر این کار رو بکنم لطفا یه مثال بگید
البته باید خیلی بهینه باشه چون ساختار کارم اشتباه هست اما مجبورم این کار رو بکنم

darvishiali
پنج شنبه 21 دی 1385, 18:33 عصر
سلام؛

اگه می خوای همیشه فقط اولین رکورد رو از DataSet بخونی، باید از SELECT TOP 1 ... استفاده کنی.

ولی اگه با Cursor میخوای بنویسی، یه مثال برای کارت میتونه این باشه :


--تعریف متغیرها
DECLARE @BBEGINDATE, @BBEGINTIME, @BENDDATE, @BENDTIME, @DBEGINTIME, @DENDDATE,
@DENDTIME, @EBEGINTIME, @EBEGINDATE, @EENDDATE, @EENDTIME, @ENDDATE, @ENDTIME, @HOLIDAY DataType
--تعریف کرسر
DECLARE Cursor1 CURSOR FOR
SELECT BBEGINDATE, BBEGINTIME, BENDDATE, BENDTIME, DBEGINTIME,
DENDDATE, DENDTIME, EBEGINTIME, EBEGINDATE, EENDDATE, EENDTIME, ENDDATE, ENDTIME, HOLIDAY
FROM dbo.ShiftItemDef
OPEN Cursor1
FETCH NEXT FROM Cursor1 INTO @BBEGINDATE, @BBEGINTIME, @BENDDATE, @BENDTIME, @DBEGINTIME, @DENDDATE,
@DENDTIME, @EBEGINTIME, @EBEGINDATE, @EENDDATE, @EENDTIME, @ENDDATE, @ENDTIME, @HOLIDAY
--تا زمانی که رکوردی وجود دارد
WHILE @@FETCH_STATUS = 0
BEGIN
--هرکار با دیتا
--...
FETCH NEXT FROM Cursor1 INTO @BBEGINDATE, @BBEGINTIME, @BENDDATE, @BENDTIME, @DBEGINTIME, @DENDDATE,
@DENDTIME, @EBEGINTIME, @EBEGINDATE, @EENDDATE, @EENDTIME, @ENDDATE, @ENDTIME, @HOLIDAY
END
CLOSE Cursor1
DEALLOCATE Cursor1

rezaei manesh
شنبه 23 دی 1385, 11:38 صبح
خوب حالا اگه بخوام این کرسر چندتا رکورد رو بر گردونه به طوری که من از اول بخونم بعد از این که به آخر رسیدم دوباره اگه خواستم برگردم از اول بخونم چکار باید کنم
البته کل این دستورات داخل یک حلقه دیگه هست به طوری که با هر بار اجرای این کرسر برای هر رکورد اون هم به صورت دستی یک مورد جلو می رود
من این کار رو به این شکل انجام دادم در سلکت مربوط به کرسر اون چندتا رکرود رو برگردوندم و هر جا که این جمله بود (FETCH NEXT)او خط رو با این جمع عوض کردم (FETCH FIRST) البته در یک دستور شرطی که اگه به آخر کرسر برسه بره اول اون تا زمانی که اون شرط کی در وایل هم استفاده کردم برقرار اما نمی شه یک مشکلی داره
من نمی دونم چرا توی 2 جا از FETCH NEXT استفاده کردین؟!
اینم کد کامل من


CREATE PROCEDURE [SpCopyFromUntilDefShift]
( @IdShift numeric,
@SDateOlgo [char](5),
@EDateOlgo [char](5),
@SDateRep [char](5),
@EDateRep [char](5),
@YearDate [char](5),
@hasExit [int]output
)
AS
declare @NoDayOlgo int, @NoDayPeriod int, @I int
declare @strTemp Char(20), @strTemp2 char(20)

set @strTemp=dbo.Persian2Civil(@YearDate ,substring( @SDateRep,1,2),substring( @SDateRep,4,2))
set @strTemp2=dbo.Persian2Civil(@YearDate ,substring( @EDateRep,1,2),substring( @EDateRep,4,2))
set @i = DATEDIFF(day,@strTemp,@strTemp2 )

set @strTemp=dbo.Persian2Civil(@YearDate ,substring( @SDateOlgo,1,2),substring( @SDateOlgo,4,2))
set @strTemp2=dbo.Persian2Civil(@YearDate ,substring( @EDateOlgo,1,2),substring( @EDateOlgo,4,2))

set @NoDayOlgo = DATEDIFF(day,@strTemp,@strTemp2) + 1
set @NoDayPeriod = Cast((@i / @NoDayOlgo)as int)

declare @DBEGINDATECur char(5),@DBEGINDATEOlgo char(5)
declare @DBEGINDATE char(5), @BBEGINDATE char(5), @BBEGINTIME char(5), @BENDDATE char(5), @BENDTIME char(5), @DBEGINTIME char(5), @DENDDATE char(5)
declare @DENDTIME char(5), @EBEGINTIME char(5), @EBEGINDATE char(5), @EENDDATE char(5), @EENDTIME char(5), @ENDDATE char(5), @ENDTIME char(5)
declare @HOLIDAY int
--تعریف کرسر

set @DBEGINDATECur =@SDateRep
--set @DBEGINDATEOlgo =@SDateOlgo

WHILE @DBEGINDATECur < = @EDateRep
BEGIN
--WHILE @i =@NoDayOlgo-1
--BEGIN
DECLARE Cursor1 CURSOR FOR
SELECT DBEGINDATE,BBEGINDATE, BBEGINTIME, BENDDATE, BENDTIME, DBEGINTIME,
DENDDATE, DENDTIME, EBEGINTIME, EBEGINDATE, EENDDATE, EENDTIME, ENDDATE, ENDTIME, HOLIDAY
FROM dbo.ShiftItemDef
WHERE (TypeShiftId = @IdShift) AND (DBEGINDATE =@DBEGINDATEOlgo )
OPEN Cursor1
if @EDateOlgo=@DBEGINDATEOlgo and @DBEGINDATECur=@EDateRep
FETCH first FROM Cursor1 INTO @DBEGINDATEOlgo,@BBEGINDATE, @BBEGINTIME, @BENDDATE, @BENDTIME, @DBEGINTIME, @DENDDATE,
@DENDTIME, @EBEGINTIME, @EBEGINDATE, @EENDDATE, @EENDTIME, @ENDDATE, @ENDTIME, @HOLIDAY
else
FETCH next FROM Cursor1 INTO @DBEGINDATEOlgo,@BBEGINDATE, @BBEGINTIME, @BENDDATE, @BENDTIME, @DBEGINTIME, @DENDDATE,
@DENDTIME, @EBEGINTIME, @EBEGINDATE, @EENDDATE, @EENDTIME, @ENDDATE, @ENDTIME, @HOLIDAY

--تا زمانی که رکوردی وجود دارد
WHILE @@FETCH_STATUS = 0
BEGIN
set @BBEGINDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@BBEGINDATE,@DB EGINDATECur,@YearDate)
set @BENDDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@BENDDATE,@DBEG INDATECur,@YearDate)
set @DENDDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@DENDDATE,@DBEG INDATECur,@YearDate)
set @EBEGINDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@EBEGINDATE,@DB EGINDATECur,@YearDate)
set @EENDDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@EENDDATE,@DBEG INDATECur,@YearDate)
set @ENDDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@ENDDATE,@DBEGI NDATECur,@YearDate)

UPDATE ShiftItemDef
SET BBEGINDATE =@BBEGINDATE, BBEGINTIME =@BBEGINTIME, BENDDATE =@BENDDATE, BENDTIME =@BENDTIME, DBEGINTIME =@DBEGINTIME, DENDDATE =@DENDDATE,
DENDTIME =@DENDTIME, EBEGINTIME =@EBEGINTIME, EBEGINDATE =@EBEGINDATE,
EENDDATE =@EENDDATE, EENDTIME =@EENDTIME, ENDDATE =@ENDDATE, ENDTIME =@ENDTIME, HOLIDAY =@HOLIDAY
WHERE (TypeShiftId = @IdShift) AND (DBEGINDATE =@DBEGINDATECur )
/**/
--set @i=@i+1
set @strTemp=dbo.Persian2Civil(@YearDate ,substring( @DBEGINDATECur,1,2),substring( @DBEGINDATECur,4,2))
set @strTemp = DATEADD(day,1,@strTemp2)
set @DBEGINDATECur =dbo.Civil2Persian(DATEPART(month,@strTemp)& substring(@StrTemp,4,8))
if @EDateOlgo=@DBEGINDATEOlgo and @DBEGINDATECur=@EDateRep
FETCH first FROM Cursor1 INTO @DBEGINDATEOlgo,@BBEGINDATE, @BBEGINTIME, @BENDDATE, @BENDTIME, @DBEGINTIME, @DENDDATE,
@DENDTIME, @EBEGINTIME, @EBEGINDATE, @EENDDATE, @EENDTIME, @ENDDATE, @ENDTIME, @HOLIDAY
else
FETCH next FROM Cursor1 INTO @DBEGINDATEOlgo,@BBEGINDATE, @BBEGINTIME, @BENDDATE, @BENDTIME, @DBEGINTIME, @DENDDATE,
@DENDTIME, @EBEGINTIME, @EBEGINDATE, @EENDDATE, @EENDTIME, @ENDDATE, @ENDTIME, @HOLIDAY

END
CLOSE Cursor1
DEALLOCATE Cursor1
--END

END
GO


کجای کدم مشکل داره (می دونم خیلی بد شده)؟
در ضمن اگه می شه ادامه بحث رو در تاپیک زیر دنبال کنیم جواب مربوط به این تاپیک رو گرفتم. با تشکر
http://barnamenevis.org/forum/showthread.php?t=59036