PDA

View Full Version : اشكال در استفاده از جدول موقت در داینامیک کوئری



s-soleimani
پنج شنبه 06 آذر 1393, 16:37 عصر
سلام
من در استفاده از جدول موقت در داینامیک کوئری مشکل دارم

کوئری من به صورت زیر است



IF OBJECT_ID('tempdb..#tmpq6') IS NOT NULL
;drop table #tmpq6


(DECLARE @query NVARCHAR(max




;'SET @query ='select * into #tmpq6 from Project
EXEC sp_executesql @query


;'SET @query='select * from #tmpq6
EXEC sp_executesql @query


كوئری اول درسته ولی کوئری دوم مشکل داره


(19 row(s) affected
Msg 208, Level 16, State 0, Line 1
'Invalid object name '#tmpq6

حمیدرضاصادقیان
پنج شنبه 06 آذر 1393, 18:13 عصر
سلام.
کدی که دارید از جدول موقت Select میکنید ایا در یک Session نوشته شده است؟ این جداول Temp فقط در یک Session معتبر هستند.به طور مثال اگر دوتا new Query مختلف باز کنید به کدهای همدیگه دسترسی ندارید و این خطا رو دریافت می کنید.

s-soleimani
جمعه 07 آذر 1393, 21:41 عصر
سلام
نه من از session استفاده نکردم

میشه یه راهنمایی برای استفاده از Session برای حل این مساله بفرمایید

حمیدرضاصادقیان
شنبه 08 آذر 1393, 07:10 صبح
منظور من از Session دوتا Connection مختلف هست.
به طور مثال شما Management Studio رو باز کنید و در یک New Query کل کدهایی که نوشتید رو قرار بدین. به این شکل درست کار میکنه.

pezhvakco
شنبه 08 آذر 1393, 10:01 صبح
شاید با حذف خط اول


IF OBJECT_ID('tempdb..#tmpq6') IS NOT NULL
;drop table #tmpq6


اون خطا نمایش داده نشود .

ولی با این دستور شما

SET @query ='select * into #tmpq6 from Project
EXEC sp_executesql @query
شما نمی تونین با جدول موقت (#tmpq6) در این sp کار انجام دهید .

حمیدرضاصادقیان
شنبه 08 آذر 1393, 10:53 صبح
این موردی که در پست آخر اشاره شد صحیح است. زیرا در Sp_executeSQL شما دارید به صورت داینامیک جدول رو ایجاد می کنید و طبق صحبتهای من در پستهای قبل که عرض کردم جداول موقت فقط در Session جاری قابل دسترسی هستن به همین خاطر چون دوبار این دستور اجرا شده به شما اجازه کار نمیده.زیرا در دو Session مختلف داره اتفاق میافته.
میتونید با تغییر به شکل زیر اوونو درست کنید.

SET @query ='select * into #tmpq6 from Project; SElect * from #Tmpq6';
EXEC sp_executesql @query;




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