PDA

View Full Version : ایجاد یک جدول براساس جدول موجود



hr110
سه شنبه 14 فروردین 1386, 18:38 عصر
با چه روشی میتوان جدولی را براساس ساختار یک جدول موجود دیگر به همراه تمامی ایندکسها، تریگرها، permision و ... ایجاد نمود؟

sardar_ahmadi
چهارشنبه 15 فروردین 1386, 10:40 صبح
لطفا به این تایپیک پاسخ جامع دهید چون مورد احتیاج ما هم هست
با تشکر فراوان

reza_rad
چهارشنبه 15 فروردین 1386, 10:55 صبح
می تونید از جدول اولی اسکریپت بگیرید و براساس اون بسازید.(البته اینجوری دیتاها رو در برنمیگیره ولی ساختار رو چرا)

اگه sql server 2000 استفاده می کنید:

enterprise manager رو باز کنید
دیتابیس رو انتخاب کنید
روی جدول مربوطه راست کلیک کنید . all task رو انتخاب کنید و بعد generate sql script

حالا توی پنجره ای که نمایش داده شده برید توی تب Option
توی قسمت table scripting option

حالا گزینه هایی که می خواهید اسکریپت ازشون تهیه بشه تیک بزنید...

sardar_ahmadi
چهارشنبه 15 فروردین 1386, 11:19 صبح
جناب آقای رضا راد ما میخواهیم موقع اجرای برنامه- برنامه تشخیص دهد که جدول مورد نظر هست یا نه اگر نیست ساخته شود نه بخواهیم دستی آن را بسازیم.
در کل من میخواهم برای هر ماه یک جدول داشته باشم. به محض اینکه ماه عوض شد جدولی با همان ساختار قبلی ساخته شود در صورتی که سال هم عوض باز هم . . . . .. مثلا kar0186- kar0286 - kar0386 و الی آخر باز هم تشکر میکنم از همه کسانی که در رفع مشکل دیگران کوشا هستند.

reza_rad
چهارشنبه 15 فروردین 1386, 11:27 صبح
جناب آقای رضا راد ما میخواهیم موقع اجرای برنامه- برنامه تشخیص دهد که جدول مورد نظر هست یا نه اگر نیست ساخته شود نه بخواهیم دستی آن را بسازیم.
وقتی شما اسکریپت رو تولید می کنید یکی از گزینه هایی که داره اینه که drop table رو اضافه کنه یا نه؟ که اگه اینو انتخاب کنید خودش چک های if exists و drop و ... رو انجام میده. و اگه جدول وجود داشته باشه پاکش می کنه و دوباره ایجادش می کنه.

شما نباید تیک اینو بزنید. به جاش قبل از اجرا کردن اسکریپت تون چک کنید که آیا این جدول وجود داره یا نه؟
می تونید برای اینکه چک کنید آیا جدول هست یا نه از جدول SysObjects کوئری بزنید.

AminSobati
چهارشنبه 15 فروردین 1386, 12:19 عصر
http://www.databasejournal.com/features/mssql/article.php/2205291

hr110
چهارشنبه 15 فروردین 1386, 12:35 عصر
ظاهراً راهی بجز استفاده از اسکریپهای تولید شده که جناب راد توضیح دادند وجود نداره.
جناب احمدی منهم از این روش استفاده میکنم و برای تولید جداول ماهانه یک SP ایجاد کرده و با پاس کردن نام جدول ، جدول جدید را ایجاد میکنم.
بخشی از این SP به این شکل است:



CREATE PROCEDURE _CreateTable
@TName nvarchar(30)
AS
DECLARE
@St nvarchar(2000)
select @St=
'CREATE TABLE ['+@TName+'] ('+
' [RowId] [int] IDENTITY (1, 1) NOT NULL ,'+
.. .....
' [handle] [bit] NULL '+
') ON [PRIMARY]'
Execute sp_executesql @St


select @St=
'ALTER TABLE ['+@TName+'] WITH NOCHECK ADD '+
' CONSTRAINT [PK_'+@TName+'] PRIMARY KEY CLUSTERED '+
' ('+
' [RowId]'+
' ) ON [PRIMARY] '
Execute sp_executesql @St


select @St=
' CREATE INDEX [orderidx] ON ['+@TName+']([DateOrder]) ON [PRIMARY]'
Execute sp_executesql @St


select @St=
' CREATE INDEX [v900] ON ['+@TName+'] ([v900_Code]) ON [PRIMARY]'
Execute sp_executesql @St


select @St=
' CREATE INDEX [DateIdx] ON ['+@TName+'] ([DateIn]) ON [PRIMARY]'
Execute sp_executesql @St


select @St=
'CREATE TRIGGER [_itg'+@TName+'] ON ['+@TName+']'+Char(13)+Char(10)+
'FOR INSERT,UPDATE '+Char(13)+Char(10)+
'AS '+Char(13)+Char(10)+
'DECLARE '+Char(13)+Char(10)+
' @RowId int, @card_no int, @V900_Code int, '+Char(13)+Char(10)+
' @rIn int, @rOut int, @carIn int, '+Char(13)+Char(10)+
' @carOut int, @carGate bit, @lastCarCode int '+Char(13)+Char(10)+
' '+Char(13)+Char(10)+
' '+Char(13)+Char(10)+
' SELECT @RowId=RowId, @card_no = card_no, '+Char(13)+Char(10)+
' @rIn = reader_In, @rOut = reader_Out, '+Char(13)+Char(10)+
' @carIn = car_in, @carOut = car_Out, '+Char(13)+Char(10)+
' @V900_Code=V900_Code '+Char(13)+Char(10)+
' FROM Inserted '+Char(13)+Char(10)+
' '+Char(13)+Char(10)+
'/*fining last entered car */'+Char(13)+Char(10)+
.........