PDA

View Full Version : پیدا کردن Tmp## در دیتابیس ؟



احمد رایان
دوشنبه 15 بهمن 1386, 22:27 عصر
سلام دوستان
با چه دستوری میشه فهمید Tmp## که ایجاد شده در دیتابیس هست ؟
از طریق sysobjects که امکان پذیر نیست .

حمیدرضاصادقیان
سه شنبه 16 بهمن 1386, 07:03 صبح
در خود جدول tempdb باید دنبالش بگردی.فکر میکنم به صورت زیر باید باشه.


select name from tempdb..sysobjects where name like '%temp%'

rmb_ali
دوشنبه 19 فروردین 1387, 07:59 صبح
فقط چرا اسم جدول رو اینطوری نشون میده
#test1____________________________________________ __________________________________________________ ________________0000000002FB

نمیشه کاریش کرد؟

AminSobati
دوشنبه 19 فروردین 1387, 08:03 صبح
سلام دوستان
با چه دستوری میشه فهمید Tmp## که ایجاد شده در دیتابیس هست ؟
از طریق sysobjects که امکان پذیر نیست .
احمد جان اساسا به چه علت نیاز به چک کردن این موضوع دارید؟

SabaSabouhi
دوشنبه 19 فروردین 1387, 16:07 عصر
احمد جان اساسا به چه علت نیاز به چک کردن این موضوع دارید؟

با سلام
این مساله براى من هم پیش آمده.
به این شکل که در یک Procedure یک جدول موقتى رو به صورت مشروط ایجاد مى‌کردم.
اگر جاى دیگه نیاز به ایجاد جدول باشه نمى‌تونم کنترل کنم که با این نام جدولى قبلاً ساخته شده یا نه. ( در صورتى که قبلاً ساخته شده باشه باید قبل از دوباره ساختن Drop Table کنم )

من هم تو TempDB دنبالش گشتم اما همونطور که دوستمون گفتن اسمش یه طورى بود که نمى‌شد حکم قطعى داد که همونیه که ما دنبالش هستیم ( چون ممکنه تو یه Session دیگه ساخته شده باشه )

اگه راه حلى بهترى داشته باشه من هم خوش‌حال مى‌شم یاد بگیرم.

صبا صبوحى

AminSobati
سه شنبه 20 فروردین 1387, 12:47 عصر
آیا این جدول باید بین Connectionهای دیگه به اشتراک گذاشته بشه؟ یعنی فرضا جدول موقتی با یک علامت # که منحصر به هر Connection هست نمیتونه کمک کنه؟

SabaSabouhi
سه شنبه 20 فروردین 1387, 13:54 عصر
آیا این جدول باید بین Connectionهای دیگه به اشتراک گذاشته بشه؟ یعنی فرضا جدول موقتی با یک علامت # که منحصر به هر Connection هست نمیتونه کمک کنه؟

با سلام
ببخشید من یادم رفت بگم که من از یه # استفاده مى‌کنم و قصد به اشتراک گذاشتن جدول رو هم ندارم، اما تو پرسش تفاوتى ایجاد نمى‌کنه.
شاید بد نبایه بگم که موردى که من باهاش برخورد داشتم چند تا SP به صورت تو در تو صدا مى‌شد و وقتى SP صدا زننده یه جدول موقتى رو مى‌سازه این جدول در SP صدا زده شده هم شناخته مى‌شه.
پرسش کلى اینه که بدون مراجعه به tempDB چطورى مى‌تونیم بفهمیم که جدول موقتى با نام خاصى ساخته شده یا نه. این رو براى جدول‌هاى معمولى خیلى راحت مى‌تونیم با استفاده از sysobjects پیدا کنیم.

با سپاس از توجه شما
صبا صبوحى

AminSobati
سه شنبه 20 فروردین 1387, 23:29 عصر
الزاما نباید از نام جدول پی به وجودش ببریم. میشه ObjectID اون رو ذخیره و به کمکش جستجو کرد. چیزی شبیه این:


declare @x int
select @x=OBJECT_ID('tempdb..#t1')
select @x

if exists (select * from tempdb.sys.objects where object_id=@x)
select 'Exists'
else
select 'Doesn''t Exist'

SabaSabouhi
شنبه 24 فروردین 1387, 12:21 عصر
الزاما نباید از نام جدول پی به وجودش ببریم. میشه ObjectID اون رو ذخیره و به کمکش جستجو کرد. چیزی شبیه این:


declare @x int
select @x=OBJECT_ID('tempdb..#t1')
select @x

if exists (select * from tempdb.sys.objects where object_id=@x)
select 'Exists'
else
select 'Doesn''t Exist'


با سلام
از توجه شما سپاس‌گزارم، اما طبق همون مثالى که گفتم تو یه SP دیگه ID رو ندارم، فقط اسم رو دارم، یعنى راه حل نداره؟

صبا صبوحى

AminSobati
شنبه 24 فروردین 1387, 23:39 عصر
حق با شماست! پس اجازه بدین از سر خط شروع کنیم. یک سناریو که منجر به چک کردن وجود جدول موقتی میشه توضیح بدین. امیدوارم بتونیم راه حلی براش پیدا کنیم

SabaSabouhi
دوشنبه 26 فروردین 1387, 14:15 عصر
با سلام
استاد ثباتى عزیز، مى‌دانم که مى‌شه براى هر مساله‌اى راه حل‌هاى متفاوتى پیدا کرد. خود من هم زمانى که به این مشکل خوردم از راه دیگرى مشکل خودم رو حل کردم.
در یک سیستم من از MetaData استفاده مى‌کنم، براى کاهش حجم Database که سال به سال زیاد مى‌شه دنبال راه حل بودم. تعداد زیادى رکورد وجود داشت که لازم بود بتونه تا 100 کاراکتر رو تو خودش جا بده اما طبق آمارى که من گرفتم بیش از 95 درصد سطرها زیر 20 کاراکتر بودن، به همین دلیل اومدم یه تغییرى دادم که هر فیلد رو بتونم در صورت بزرگ بودن Split کنم. ( همون کارى که خود SQL Server تو نگهدارى SPهاى بزرگ‌تر از 4000 کاراکتر انجام مى‌ده ) نتیجه تاثیر قابل توجهى تو حجم جدول داشت. حالا یه جاهایى لازم داشتم که اطلاعات رو به صورت سالم براى Join کردن در اختیار داشته باشم. تو یه Procedure جدولى موقتى ساختم که اطلاعات یک شى‌‌‌ء رو به صورت Merge شده داخلش بریزم.
این هم از صورت مساله‌ى اصلى.
اول این که ببخشید که کمى دیر به دیر جواب مى‌دم، دلیلش مشکل موقتى دسترسى به Internet هست.
دوم این که صرف‌نظر از صورت مساله‌اى که منجر به این احساس نیاز شد، خود مساله‌ى این که آیا مى‌شه از روى اسم وجود یا عدم وجود یک جدول موقتى رو با اسمش تشخیص داد یه مساله‌ى جالب هست که من خیلى علاقه دارم در صورت وجود راه حل اون رو یاد بگیرم.

با سپاس مجدد
صبا صبوحى

AminSobati
دوشنبه 26 فروردین 1387, 15:21 عصر
سلام صبا جان،
خیلی ممنونم از توضیحی که دادین. فکر میکنم همون راه حل رو با کمی تغییر بشه استفاده کرد:


if object_id('tempdb..#t1') is null ...

SabaSabouhi
سه شنبه 27 فروردین 1387, 11:39 صبح
با سلام
سپاس‌گزارم، دقیقاً چیزى بود که لازم داشتم.

صبا صبوحى