PDA

View Full Version : ساخت جدول مجازی با نام داینامیک



Alfa_Debager
شنبه 21 شهریور 1388, 11:01 صبح
لطفا در مورد مشکل زیر من را راهنمایی کنید

من یک sp ساختم که همزمان از بین دو جدول اطلاعاتی به فاکتوری را دریافت می کنه سپس آنها را به ترتیب
در جدول موقت ذخیره می کنه

به ازاء هر رکورد که در جدول موقت ذخیره می کنه یک رکورد از جدول دوم نیز رکورد می کنه

مشکل اینجاست که وقتی یک کاربر این sp را فراخوانی می کنه بدون ایراد است ولی وقتی دو کاربر همزمان در
یک لحظه آن را فراخوانی می کنند اطلاعات روی هم می افته

حال اگر تیبل موقت ساخته شده به نام هر فاکتور باشه (temp table dynamic)
دیگه اطلاعات روی هم نمی افتد


حالا روش ساخت تیبل موقت با نام داینامیک را نمی دانم
لطفا کمکم کنید

با تشکر

محمد سلیم آبادی
شنبه 21 شهریور 1388, 12:52 عصر
مشکلتان در ساخت یک جدول موقت است؟


CREATE TABLE #TEMPORARY_TABLE
(
Col1 int,
Col2 char
)

Alfa_Debager
شنبه 21 شهریور 1388, 13:25 عصر
از اینکه جواب دادی متشکرم
اما جواب من این نیست
من می خوام نام تیبل موقت داینامیک باشد یعنی #TEMPORARY_TABLE
در هر بار اجرا بر اساس شماره فاکتور نام گذاری بشه

Alfa_Debager
شنبه 21 شهریور 1388, 13:27 عصر
مشابه این دستور که البته این دستورا اشتباه است

declear @fn as int

CREATE TABLE #TEMPORARY_TABLE_@fn
(
Col1 int,
Col2 char
)

محمد سلیم آبادی
شنبه 21 شهریور 1388, 13:56 عصر
از دستور execute() استفاده کرده اید؟
با کمک این دستور جدول ایجاد کردم ولی جدول موقت یا متغیری را ایجاد نکرد (از نظر syntax مشکلی ندارد ولی نمی دانم چرا روی این جداول کار نمی کند)





declare @fn int,
@command nvarchar(2000)
set @fn=10
set @command=
'CREATE TABLE #TEMPORARY_TABLE_'+cast(@fn as varchar(5))+
'('+
'Col1 int,'+
'Col2 char'+
')'

exec (@command)

Alfa_Debager
شنبه 21 شهریور 1388, 17:25 عصر
از ارسال مجددت متشکرم

متن فوق را وارد کردن کاملا صحیح بود ولی
برای حذف کردن و نمایش تیبل ایجاد شده عملی نبود نمونه کد را گذاشتم
تا روش حذف تیبل موقت و اجرای آن را هم برایم لطف کنی



CREATE PROCEDURE Sp_Make_List_Temprore
(
@fn AS int
)

AS


declare @command archangel(2000)

if exists (SELECT name AS Expr1 FROM tempdb.dbo.sysobjects WHERE (name = '##TEMPORARY_TABLE_12') )
این خط و خط بالا ایراد دارد drop table [dbo].[##TEMPORARY_TABLE_'+cast(@fn)]


set @command=
'CREATE TABLE ##TEMPORARY_TABLE_'+cast(@fn as varchar(5))+
'('+
'Code int,'+
'Name nchar(25),'+
'Number numeric(18,2),'+
')'


exec (@command)

Alfa_Debager
دوشنبه 23 شهریور 1388, 08:30 صبح
لطفا یکی بگه چطور می شه جدول داینامیک ساخته شده را مقدار داد و نمایش داد

محمد سلیم آبادی
دوشنبه 23 شهریور 1388, 13:33 عصر
اگر منظورت از مقدار دهی درج کردن باشد خوب با insert انیکار را انجام بدهید و برای نمایش هم از select استفاده کنید، ولی همانطوری که گفتم نمی دانم چرا وقتی جدول وقت را ایجاد می کنم مشکل syntax ندارد ولی در قسمت جداول موقت بانک tempdb ساخته نمی شود،
برای جداول متغیری هم همین طور، جدول متغیری یک longlife دارند یعنی بعد از یک مدتی (خروج از scope) از حافظه گرفته می شوند.
اطلاعات بیشتری ندارم.

Alfa_Debager
دوشنبه 23 شهریور 1388, 17:26 عصر
مشکل نحوه insert و select است که موقع insert کردن نام تیبل متغیر را چگونه فراخوانی کنیم

select * from
(TEMPORARY_TABLE_'+cast(@fn
(

اما فراخوانی کردن بروش کد بالا صحیح نیست مشکل از چگونه نامگذار متغیر در حالت select or inset می باشد
با تشکر

محمد سلیم آبادی
دوشنبه 23 شهریور 1388, 17:36 عصر
مشکل نحوه insert و select است که موقع insert کردن نام تیبل متغیر را چگونه فراخوانی کنیم

select * from
(TEMPORARY_TABLE_'+cast(@fn
(

اما فراخوانی کردن بروش کد بالا صحیح نیست مشکل از چگونه نامگذار متغیر در حالت select or inset می باشد
با تشکر

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


exec('select * from '+@nameTable)

A.Farzin
دوشنبه 23 شهریور 1388, 18:18 عصر
خوب چرا در همان جدول موقت اولي يك ستون مجزا نميگذاري و با گذاشتن كدهاي مختلف اطلاعات كاربران مختلف را از هم جدا كني؟

sara.f
دوشنبه 05 بهمن 1388, 21:05 عصر
از دستور execute() استفاده کرده اید؟
با کمک این دستور جدول ایجاد کردم ولی جدول موقت یا متغیری را ایجاد نکرد (از نظر syntax مشکلی ندارد ولی نمی دانم چرا روی این جداول کار نمی کند)





declare @fn int,
@command nvarchar(2000)
set @fn=10
set @command=
'CREATE TABLE #TEMPORARY_TABLE_'+cast(@fn as varchar(5))+
'('+
'Col1 int,'+
'Col2 char'+
')'

exec (@command)



سلام
ببخشید من متوجه نمی شم چه کار کردید!

این پارامتر command@ چیه؟

منم میخوام یه table ایجاد کنم، که البته نام اون را کاربر وارد میکنه، ولی نمی دونم شما چه کار کردید؟!

میشه توضیح بدید چه طوریه؟

محمد سلیم آبادی
سه شنبه 06 بهمن 1388, 00:35 صبح
سلام،
بدلیل اینکه نام جدول متغیر است یعنی پارامتریک است ما نمی توانیم از شیوه ی معمول، یک جدول را ایجاد کنیم و ناچاریم از مبحثی به نام Dynamic SQL استفاده کنیم. دستور EXEC یا بطور کامل EXECUTE می تواند یک رشته یا متغیر رشته ای را به عنوان پارامتر دریافت و آن رشته را به عنوان یک دستور یا query اجرا کند.

بطور مثال در نسخه ی 2000 ما نمی توانستیم در ماده ی TOP از متغیر استفاده کنیم و حتما باید بطور صریح یک مقدار یا یک عبارت (که حاصل آن یک عدد صحیح باشد) را قرار می دادیم. برای رفع این مشکل می توانیم از دستور exec استفاده کنیم. بطور مثال دستور زیر تنها سطر اول از سه سطر 1و 2 و 3 را انتخاب خواهد کرد:


declare @i int;
set @i = 1
exec('select top ('+@i+') *
from (select 1 union all
select 2 union all
select 3) as d(i);');


برای اینکه بتوانیم جدولی ایجاد کنیم که نام آن توسط کاربر انتخاب شود و بسته به نوع و تعداد ستون و... می توانید از دستور زیر استفاده کنید و البته برای اینکه این جدول بطور موفق در بانک ذخیره شود از global temporary table بهره می بریم (که نام جدول با ## آغاز می شود)




declare @fn int,
@command nvarchar(2000);
select @fn=1,
@command='CREATE TABLE ##TEMPORARY_TABLE_' + cast(@fn as varchar(5))+
'(Col1 int,
Col2 char);';
exec (@command);


برای توضیحات کامل و مفصل می توانید به book online- BOL رجوع کنید

sara.f
سه شنبه 20 بهمن 1388, 16:24 عصر
دوباره سلام!
من واسه ایجاد جدولم با نام دینامیک یه SP به صورت زیر نوشتم

create proc createnewtable
@tablename nvarchar(50)
as
declare @sql nvarchar(4000)
select @sql=('create table ##@tablename col1 int,col2 varchar')
exec(@sql)
go

بعد از execute کردن هم پیغام موفقیت میده، ولی وقتی توی برنامم ازش استفاده می کنم، اصلا جدولی ایجاد نمیکنه، خطا هم نمیده.

میخوام بدونم الان توی این SP که نوشتم، جاییش اشتباه کردم یا کدم درسته؟
یه مسئله دیگه هم اینکه من نمیخوام جدولم موقت باشه . :افسرده:
(البته دقیقا نمی دونم منظور از جدول موقت چیه؟!!! :لبخند: ولی خب میخوام جدولم عین جدولای معمولی توی SQL باشه)
با تشکر

محمد سلیم آبادی
سه شنبه 20 بهمن 1388, 16:45 عصر
سلام،
جداول موقت در بانک TempDB ذخیره میشن در پوشه ی Temporary Tables.

برای اطمینان از اینکه بعد از ساخت جدول، جدول از بین میره یا نه کافیه دوباره کد ایجاد را اجرا کنید اگر پیغام خطا داد یعنی جدول ساخته شده و قابل دسترسی است.

کدی که نوشتین در هر بار اجرا جدولی با نام tablename@## ایجاد می کنه. برای رفع این مشکل کد را به این شکل اصلاح کنید:

select @sql=('create table ##'+@tablename+' col1 int,col2 varchar)')

اگر می خواهین جدول معمولی باشه دیگه از پیشوند ## برای نام جدول استفاده نکنید به این شکل:
select @sql=('create table '+@tablename+' (col1 int, col2 varchar)') -- c

و قبل از استفاده از متغیر باید مقدار دهی کنید در غیر اینصورت مقدار متغیر برابر با null خواهد بود. null که با هر مقدار دیگری که جمع بشه بازم null می شه.

در ضمن راهنمایی دیگری نمی تونم بکنم چون فکر می کنم این کدی که ارسال کردین کد واقعی نیست!

sara.f
سه شنبه 20 بهمن 1388, 17:34 عصر
سلام،
جداول موقت در بانک TempDB ذخیره میشن در پوشه ی Temporary Tables.

برای اطمینان از اینکه بعد از ساخت جدول، جدول از بین میره یا نه کافیه دوباره کد ایجاد را اجرا کنید اگر پیغام خطا داد یعنی جدول ساخته شده و قابل دسترسی است.

کدی که نوشتین در هر بار اجرا جدولی با نام tablename@## ایجاد می کنه. برای رفع این مشکل کد را به این شکل اصلاح کنید:

select @sql=('create table ##'+@tablename+' col1 int,col2 varchar)')

اگر می خواهین جدول معمولی باشه دیگه از پیشوند ## برای نام جدول استفاده نکنید به این شکل:
select @sql=('create table '+@tablename+' (col1 int, col2 varchar)') -- c

و قبل از استفاده از متغیر باید مقدار دهی کنید در غیر اینصورت مقدار متغیر برابر با null خواهد بود. null که با هر مقدار دیگری که جمع بشه بازم null می شه.

در ضمن راهنمایی دیگری نمی تونم بکنم چون فکر می کنم این کدی که ارسال کردین کد واقعی نیست!

ببخشید منظورتون از اینکه می گید کد واقعی نیست چیه؟!!!!!
مگه کد هم دروغکی میشه؟!!
این کدیه که من استفاده کردم، ولی خب نمی دونستم اشکالش کجاست!
حالا هم از راهنماییتون ممنونم.

بعد یه چیزه دیگه اینکه، این c-- چیه که آخر کدتون نوشتید؟!

select @sql=('create table '+@tablename+' (col1 int, col2 varchar)') -- c

محمد سلیم آبادی
سه شنبه 20 بهمن 1388, 17:37 عصر
دوباره سلام!
من واسه ایجاد جدولم با نام دینامیک یه SP به صورت زیر نوشتم

create proc createnewtable
@tablename nvarchar(50)
as
declare @sql nvarchar(4000)
select @sql=('create table ##@tablename col1 int,col2 varchar')
exec(@sql)
go

با تشکر

به کدخطی که به رنگ آبی درآمده دقت کنید.

syntax تعریف یه جدول به شکل زیر است:
create table table_name (...) --d

باید نام ستون و تمام مشخصات ستونها درون یک جفت پرانتز باشه در صورتی که در تعریف جدول شما پرانتزی دیده نمیشه! منظورم اینه.