برگزیده های پرشین تولز

Dynamic Create Table in Stored Procedure(كمك)

DonAmir

Registered User
تاریخ عضویت
12 آگوست 2003
نوشته‌ها
153
لایک‌ها
0
سن
40
محل سکونت
Tehran
من به اين كد كه شامل يك SQL script براي server 2000 است نياز داريم.
موضوع اينه كه پارامترها به اين stored procedure ها (به ترتيب نام ستون و data تايپ و اسم جدول ) پاس مي شود و با ان مشخصات جدولي ساخته مي شود.

مثلا :
EXEC CreateMyTable 'column1,column1,column1', 'int,varchar(100),char', 'Table1'​
مشكل اينجاست كه دومين حلقه وارد يك لوپ بي نهايت مي شود. اگر ميتونيد من رو كمك كنيد:wacko:
 

فایل های ضمیمه

  • sql.txt
    1.2 KB · نمایش ها: 1

Parham

Registered User
تاریخ عضویت
24 سپتامبر 2003
نوشته‌ها
1,042
لایک‌ها
2
به نقل از 7sib :
مشكل اينجاست كه دومين حلقه وارد يك لوپ بي نهايت مي شود. اگر ميتونيد من رو كمك كنيد:wacko:
این حلقه‌ای که فرمودید اولیش کدومه که دومیش کدوم باشه؟
 

DonAmir

Registered User
تاریخ عضویت
12 آگوست 2003
نوشته‌ها
153
لایک‌ها
0
سن
40
محل سکونت
Tehran
به نقل از Parham.G :
این حلقه‌ای که فرمودید اولیش کدومه که دومیش کدوم باشه؟

حق با شماست ، من الان code رو هم attach كردم.
 

Parham

Registered User
تاریخ عضویت
24 سپتامبر 2003
نوشته‌ها
1,042
لایک‌ها
2
خوب، این هم کد صحیح:
کد:
CREATE PROCEDURE [dbo].[CreateMyTable] ( @FieldsNameStr varchar(2000),
                                                                             @FieldsTypeStr varchar(2000),
                                                                             @TableName varchar(2000) )


AS
declare  @i int
declare  @j int
declare  @TempStr varchar(200)
declare  @TempStr1 varchar(200)
declare  @TempStr2 varchar(200)


set @i = 0
set @j = 0
set @TempStr = ''

WHILE (@i < Len(@FieldsNameStr)) or (@j < Len(@FieldsTypeStr))
begin

  set @TempStr1 = ''
  while  not(substring(@FieldsNameStr, @i, 1) = ',') [COLOR="Red"]and[/COLOR] (@i < Len(@FieldsNameStr))
  begin
    set @TempStr1 = @TempStr1 + substring(@FieldsNameStr, @i, 1)
    set @i = @i +1
  end


  set @TempStr2 = ''
  while  not(substring(@FieldsTypeStr, @j, 1) = ',') [COLOR="Red"]and[/COLOR] ([COLOR="Red"]@j[/COLOR] < Len(@FieldsTypeStr))
  begin
    set @TempStr2 = @TempStr2 + substring(@FieldsTypeStr, @j, 1)
    set @j = @j +1
  end

  set @TempStr = @TempStr + '[' +@TempStr1+ ']' + @TempStr2 +' NOT NULL ,'
  set @i = @i +1
  set @j = @j +1
end


EXEC('CREATE TABLE [dbo].[' + @TableName + '] ( '+
          @TempStr +	
         ') ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]')
GO

و اما مشکل چی بود: اولا که دو تا شرط OR باید AND میشد و سوم اینکه در شرط حلقه دوم (منظور حلقه دوم داخل حلقه اصلی است) به جای متغیر j از متغیر i استفاده شده بود. ولی در مجموع SP بسیار جالبی برای ساخت جدول نوشتید.
 

DonAmir

Registered User
تاریخ عضویت
12 آگوست 2003
نوشته‌ها
153
لایک‌ها
0
سن
40
محل سکونت
Tehran
پرهام جان ممنون از لطفت.
من ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] رو حذف كردم تا بهتر جواب بده.
set @i = @i +1 و set @j = @j +1 را هم يك خط بالاتر آوردم چون يك كاراكتر از type و name ها رو نمي ديد.
الان براي يك ستون درست عمل ميكنه اما حلقه ها هنوز براي 2 يا بيشتر از 2 ستون عمل نمي كنند.​
Server: Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'NOT'​
.
کد:
CREATE PROCEDURE [dbo].[CreateMyTable] ( @FieldsNameStr varchar(2000),
                                                                             @FieldsTypeStr varchar(2000),
                                                                             @TableName varchar(2000) )


AS
declare  @i int
declare  @j int
declare  @TempStr varchar(200)
declare  @TempStr1 varchar(200)
declare  @TempStr2 varchar(200)


set @i = -1
set @j = -1
set @TempStr = ''

WHILE (@i < Len(@FieldsNameStr)) or (@j < Len(@FieldsTypeStr))
begin

  set @TempStr1 = ''
  while  not(substring(@FieldsNameStr, @i, 1) = ',') and (@i < Len(@FieldsNameStr))
  begin
   [COLOR="Red"] set @i = @i +1[/COLOR]
    set @TempStr1 = @TempStr1 + substring(@FieldsNameStr, @i, 1)
  end


  set @TempStr2 = ''
  while  not(substring(@FieldsTypeStr, @j, 1) = ',') and (@j < Len(@FieldsTypeStr))
  begin
  [COLOR="Red"] set @j = @j +1[/COLOR]  
   set @TempStr2 = @TempStr2 + substring(@FieldsTypeStr, @j, 1)
  end

  set @TempStr = @TempStr + '[' +@TempStr1+ ']' + @TempStr2 +' NOT NULL ,'
  set @i = @i +1
  set @j = @j +1
end


EXEC('CREATE TABLE [dbo].[' + @TableName + '] ( '+
          @TempStr +	
         ') ')
GO
اگر كاملتر شد همينجا پستش مي كنم.​
 

Parham

Registered User
تاریخ عضویت
24 سپتامبر 2003
نوشته‌ها
1,042
لایک‌ها
2
من زیاد روی خروجی دقت نکرده بودم و فقط مشکل لوپ رو بررسی کردم. شما باید مقدار ابتدایی i و j رو ۱ قرار بدی چون اولین کاراکتر در تابع substring با عدد یک مشخص میشه و مقدار ۱- و یا ۰ باعث مشکل میشه. همچنین شرط دو حلقه داخلی نیز به شکل زیر تغییر پیدا میکنه تا برای آخرین فیلد نیز درست عمل کنه. نیازی هم به جابجایی set @i=@i+1 و همچنین برای j‌ نیست.
کد:
CREATE PROCEDURE [dbo].[CreateMyTable] ( @FieldsNameStr varchar(2000),
                                                                             @FieldsTypeStr varchar(2000),
                                                                             @TableName varchar(2000) )


AS
declare  @i int
declare  @j int
declare  @TempStr varchar(200)
declare  @TempStr1 varchar(200)
declare  @TempStr2 varchar(200)


[COLOR="Red"]set @i = 1
set @j = 1[/COLOR]
set @TempStr = ''

WHILE (@i < Len(@FieldsNameStr)) or (@j < Len(@FieldsTypeStr))
begin

  set @TempStr1 = ''
  while  not(substring(@FieldsNameStr, @i, 1) = ',') and [COLOR="Red"]not(@i >[/COLOR] Len(@FieldsNameStr))
  begin
    set @TempStr1 = @TempStr1 + substring(@FieldsNameStr, @i, 1)
    [COLOR="Red"]set @i = @i +1[/COLOR]
  end


  set @TempStr2 = ''
  while  not(substring(@FieldsTypeStr, @j, 1) = ',') and [COLOR="Red"]not(@j >[/COLOR] Len(@FieldsTypeStr))
  begin
   set @TempStr2 = @TempStr2 + substring(@FieldsTypeStr, @j, 1)
   [COLOR="Red"]set @j = @j +1 [/COLOR]
  end

  set @TempStr = @TempStr + '[' +@TempStr1+ ']' + @TempStr2 +' NOT NULL ,'
  set @i = @i +1
  set @j = @j +1
end


EXEC('CREATE TABLE [dbo].[' + @TableName + '] ( '+
          @TempStr +	
         ') ')
GO
البته یک مورد دیگه هم میمونه که خودتون زحمتش رو بکشید و اینکه متغیر TempStr در نهایت یک کاراکتر کاما (,) اضافه داره و باید حذف بهشه.
 

DonAmir

Registered User
تاریخ عضویت
12 آگوست 2003
نوشته‌ها
153
لایک‌ها
0
سن
40
محل سکونت
Tehran
كدي آخري كه نوشتي درسته , خروجيش هم بدون مورد كار ميكنه.
ممنونم لطف كردي
 
بالا