PDA

View Full Version : استفاده از خروجی دستور select در خود sp



ایمان اختیاری
یک شنبه 06 تیر 1389, 10:03 صبح
سلام
چطور می شه از خروجی دستور select توی همون stored procedure استفاده کرد ؟
کد زیر رو نوشتم ولی مشکل داره بازم ..

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
declare @p1 int
ALTER PROCEDURE [dbo].[test]

AS
BEGIN
select pcnum
into @p1
from dbo.temp.setting;
END

Rejnev
یک شنبه 06 تیر 1389, 10:11 صبح
set @p=(select top 1 field from tbl)

اگه مقدارت یک جدول و یا چندتا رکورد باشه باید اونا رو توی یک جدول موقت اینسرت کنی و بعد استفاده کنی
در ضمن یک شرط هم باید بزاری تا محدود بشه و چند تا برنگردونه تا خطا نده

ایمان اختیاری
یک شنبه 06 تیر 1389, 15:28 عصر
بابت راهنمایی متشکر
من کد زیر رو نوشتم ولی از همون متغییری که قراره خروجی select توش ریخته بشه اشکال می گیره .. مشکلم کجاست ؟


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[test2]
@p1 nvarchar(50),
@p2 int,
@p3 nvarchar(50)
AS
BEGIN
set @p1=(SELECT [pcnum] FROM [temp].[dbo].[setting])
set @p2=1
set @p3='offline'

DELETE FROM [temp].[dbo].[pcs]

while @p2 <= @p1
begin
INSERT INTO [temp].[dbo].[pcs]
([id],[state])
VALUES
(@p2,@p3);
set @p2=@p2+1

end

END

behrouzlo
یک شنبه 06 تیر 1389, 18:17 عصر
دستوري كه شما نوشتيد فكر كنم كلا مشكل داره شكل صحيح آن به صورت زير هست:

SELECT [pcnum] INTO TempTbl FROM [temp].[dbo].[setting]
ثانيا فكر كنم بايد به جاي While هم از دستور CURSOR استفاده كنيد البته اگر دقيقا كاري را كه مي خواهيد انجام بدهيد مطرح بكنيد شايد راه حل ساده تري هم باشه

Rejnev
دوشنبه 07 تیر 1389, 12:35 عصر
set @p1=(SELECT [pcnum] FROM [temp].[dbo].[setting])
while @p2 <= @p1



دستور اول رو که مطمئن بشید select بیش از یک مقدار بر نگردونه.
اگه pnum از نوع عدده لازم نیست p1 از نوع رشته باشه.
خطای while هم از همینه که شما یک رشته رو با یک عدد مقایسه کردین.
اگر هم pnum رشته ای هست که باید در دستور while یک cast به عدد انجام بدید



while @p2 <= cast(@p1 as int)

ایمان اختیاری
دوشنبه 07 تیر 1389, 12:50 عصر
دستتون درد نکنه بابت راهنمایی
فهمیدم اشکال کار از کجا بوده .. متغییرها رو باید بعد از begin تعریف می کردم :

alter PROCEDURE test2

AS
BEGIN

declare
@p1 nvarchar(50),
@p2 int,
@p3 nvarchar(50)
set @p1=(SELECT [pcnum] FROM [temp].[dbo].[setting])
set @p2=1
set @p3='offline'

DELETE FROM [temp].[dbo].[pcs]

while @p2 <= @p1
begin
INSERT INTO [temp].[dbo].[pcs]
([id],[state])
VALUES
(@p2,@p3);

set @p2=@p2+1

end

END
GO