PDA

View Full Version : خطا: استفاده از یک نام برای TempTable در یک SP



اوبالیت به بو
شنبه 29 تیر 1392, 17:47 عصر
درود بر شما

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





If @Date1 <> @Date2
BEGIN
SELECT [Field1], [Field2], [Field3], [Field4]
INTO #tmpTable
FROM Products
WHERE
[Field1] = @Param1 AND
[Field2] <> @Param2 AND
[Field3] = 'Text'
END
Else
BEGIN

SELECT [Field1], [Field2], [Field3], [Field4]
INTO #tmpTable
FROM Products
WHERE
[Field1] = @Param1 AND
[Field2] <> @Param2 AND
[Field3] = 'Text' AND
[Field4] = @Param3
END


اگر دقت کنید در Select دوم فقط در قسمت WHERE یک شرط بیشتر قرار داده شده یعنی Field4 برابر با @Para3. یعنی تنها تفاوت این دو SELECT در همین یک قسمت است.

خطا چیست؟

مساله اینجاست که بنده بدلیل اینکه دو بار از نام #tmpTable در یک Procedure استفاده کردم SQL Server به من خطا می دهد:

Error Msg 2714 There is already an object name '#tmpTable' in the database.
شرح خطا کاملا گویاست.

راه پیشنهاد شده: قبل از Select یک دستور Exec قرار داده شود و کل دستورات در ' ' قرار داده شوند تا به صورت String در نظر گرفته شوند که زیاد جالب نیست.

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

محمد سلیم آبادی
شنبه 29 تیر 1392, 18:00 عصر
مساله اینجاست که بنده بدلیل اینکه دو بار از نام #tmpTable در یک Procedure استفاده کردم SQL Server به من خطا می دهد:
خیر دوست من. پیغام میگه در بانک شما قبلا جدولی به این نام ایجاد شده. باید با دستور drop table جدول را حذف کنید.

اوبالیت به بو
یک شنبه 30 تیر 1392, 07:57 صبح
خیر دوست من. پیغام میگه در بانک شما قبلا جدولی به این نام ایجاد شده. باید با دستور drop table جدول را حذف کنید.

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

از شما متشکرم

اوبالیت به بو
یک شنبه 30 تیر 1392, 09:11 صبح
حالا لزوما WHERE هم نه.

ممکن هست در قسمت SELECT من بخوام فیلدهای متفاوتی رو نشون بدم. مثلا اگر یک فلگ 1 بود 3 فیلد نشون بدم و اگر صفر بود یک تابع Count استفاده کنم. و بعد عمل INTO #Tmp رو انجام بدم.

اوبالیت به بو
دوشنبه 31 تیر 1392, 10:01 صبح
مشکل حل شد.

مجبور به استفاده از دستور Create Table برای جدول مورد نظر شدم.


تالار ضعیفی هست.