Dynamic Create Table in Stored Procedure(كمك)

شروع موضوع توسط DonAmir ‏7 نوامبر 2005 در انجمن asp , ASP.NET

  1. DonAmir

    DonAmir Registered User

    تاریخ عضویت:
    ‏12 آگوست 2003
    نوشته ها:
    154
    تشکر شده:
    0
    محل سکونت:
    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
  2. Parham

    Parham Registered User

    تاریخ عضویت:
    ‏24 سپتامبر 2003
    نوشته ها:
    1,039
    تشکر شده:
    1
    این حلقه‌ای که فرمودید اولیش کدومه که دومیش کدوم باشه؟
     
  3. DonAmir

    DonAmir Registered User

    تاریخ عضویت:
    ‏12 آگوست 2003
    نوشته ها:
    154
    تشکر شده:
    0
    محل سکونت:
    Tehran
    حق با شماست ، من الان code رو هم attach كردم.
     
  4. Parham

    Parham Registered User

    تاریخ عضویت:
    ‏24 سپتامبر 2003
    نوشته ها:
    1,039
    تشکر شده:
    1
    خوب، این هم کد صحیح:
    کد:
    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 + '[' [email protected]+ ']' + @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 بسیار جالبی برای ساخت جدول نوشتید.
     
  5. DonAmir

    DonAmir Registered User

    تاریخ عضویت:
    ‏12 آگوست 2003
    نوشته ها:
    154
    تشکر شده:
    0
    محل سکونت:
    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 + '[' [email protected]+ ']' + @TempStr2 +' NOT NULL ,'
      set @i = @i +1
      set @j = @j +1
    end
    
    
    EXEC('CREATE TABLE [dbo].[' + @TableName + '] ( '+
              @TempStr +	
             ') ')
    GO
    اگر كاملتر شد همينجا پستش مي كنم.​
     
  6. Parham

    Parham Registered User

    تاریخ عضویت:
    ‏24 سپتامبر 2003
    نوشته ها:
    1,039
    تشکر شده:
    1
    من زیاد روی خروجی دقت نکرده بودم و فقط مشکل لوپ رو بررسی کردم. شما باید مقدار ابتدایی i و j رو ۱ قرار بدی چون اولین کاراکتر در تابع substring با عدد یک مشخص میشه و مقدار ۱- و یا ۰ باعث مشکل میشه. همچنین شرط دو حلقه داخلی نیز به شکل زیر تغییر پیدا میکنه تا برای آخرین فیلد نیز درست عمل کنه. نیازی هم به جابجایی set @[email protected]+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 + '[' [email protected]+ ']' + @TempStr2 +' NOT NULL ,'
      set @i = @i +1
      set @j = @j +1
    end
    
    
    EXEC('CREATE TABLE [dbo].[' + @TableName + '] ( '+
              @TempStr +	
             ') ')
    GO
    
    البته یک مورد دیگه هم میمونه که خودتون زحمتش رو بکشید و اینکه متغیر TempStr در نهایت یک کاراکتر کاما (,) اضافه داره و باید حذف بهشه.
     
  7. footbal
  8. DonAmir

    DonAmir Registered User

    تاریخ عضویت:
    ‏12 آگوست 2003
    نوشته ها:
    154
    تشکر شده:
    0
    محل سکونت:
    Tehran
    كدي آخري كه نوشتي درسته , خروجيش هم بدون مورد كار ميكنه.
    ممنونم لطف كردي
     
zarpopخرید بک لینک