PDA

View Full Version : cte چند بار استفاده از خروجی که با with ایجاد می شود



javad_mjt
سه شنبه 11 آبان 1389, 22:20 عصر
سلام و خسته نباشید
من می خوام از خروجی که با استفاده از with تولید میشه چند بار select بگیریم از دوستان ممنون میشم راهنماییم کنند.
به طور مثال می خوام عمل زیر رو انجام بدم که امکان پذیر نیست

create proc myproc

as
@a int,@b int,@c int,@d int,@e int,@f int
declare @rowcount int;
with cte as (select * from myfunc(@a,@b,@c,@d,@e,@f))
)
select * from cte
select @rowcount=Count(*)from cte
و مجبورم کدم و به این شکل زیر بنویسم که فکر می کنم با فرض اینکه myfunc یک عملیات خیلی سنگین رو روی بانک انجام می دهد یه عملیات سنگین روی بانک رو که میشه یه بار انجام داد و دو بار انجام میدم


create proc myproc
@a int,@b int,@c int,@d int,@e int,@f int
as

declare @rowcount int;
with cte as (select * from myfunc(@a,@b,@c,@d,@e,@f))
)
select * from cte
select @rowcount=Count(*)from myfunc(@a,@b,@c,@d,@e,@f)

حمیدرضاصادقیان
چهارشنبه 12 آبان 1389, 08:57 صبح
سلام.شما اگر گزینه Set rowcount on رو قبل از اجرای دستور اجرا کنید میتونید با استفاده از متغیر عمومی Rowcount@@ مقدار رکوردهای برگشتی رو داشته باشید.
برای توضیحات بیشتر به این لینک (http://technet.microsoft.com/en-us/library/ms187316.aspx) نگاه کنید.

javad_mjt
چهارشنبه 12 آبان 1389, 23:05 عصر
سلام
خسته نباشید.
من نتونستم از روش شما استفاده کنم. وقتی Set rowcount on رو قبل از with می زارم خطا میده.
یه روش هم به شکل زیر رو داخل سایت stackoveflow دیدم



DECLARE @BigProducts TABLE (...[declaration omitted]...)

INSERT INTO @BigProducts
SELECT *
FROM Products
WHERE Size='Big'


SELECT Name FROM @BigProducts
SELECT Count(*) FROM @BigProducts

حمیدرضاصادقیان
پنج شنبه 13 آبان 1389, 09:47 صبح
سلام. شما Set rowcount on رو نذارید فقط بعد از اجرای دستور با استفاده از متغیر Rowcount@@ تعداد رکوردها رو بدست بیارید. در اون لینکی که براتون قرار دادم مثال داره.

javad_mjt
پنج شنبه 13 آبان 1389, 23:11 عصر
سلام
حرف شما متین اما تا جایی که من متوجه شدم از خروجی که با استفاده از with تولید میشه تنها یک با میشه استفاده کرد و امکان اینکه دو بار بخواهیم با شرایط مختلف از اون خروجی، خروجی بگیریم وجود نداره.
که یکم به نظر من باعث کم تر شدن انعطافش می شه اما با روش دوم یک table رو declare می کنیم بعد هر چند بار که خواسته باشیم با پارامتر های مختلف از اون select می گیریم.
اگر من اشتباه می کنم لطفا تصحیح کنید