புள்ளிவலை

மூளைக்குத் தீனியில்லாத போழ்து
சிறிது மனதுக்கும் ஈயப்படும்.
posts - 23, comments - 60, trackbacks - 0

Wednesday, December 09, 2009

ஸ்டோர்ட் ப்ரோசிஜர் டெம்ப்ளேட்

ஒரு டேபிளிலுள்ள தகவலை இற்றைப்படுத்தவும், புதுத்தகவலை உள்ளிடவும் எஸ்க்யூஎல் சர்வரில் ஸ்டோர்ட் ப்ரோசீஜர் எழுதும்போது டேபிளில் உள்ள காலம்களுக்குத் தகுந்தவாறு நிறைய காரணிகளை வரையறுக்க வேண்டியிருக்கும்.

தூய தமிழில் சொல்வதென்றால், ஸ்டோர்ட் ப்ரோசீஜரில் இன்ஸர்ட்/அப்டேட் ஸ்டேட்மெண்ட்டில் பயன்படுத்த, நிறைய பாராமீட்டர்களை தட்டச்சடிக்க வேண்டியிருக்கும். டேபிள் மிகவும் பெரியதாக, அதிகமான காலம்கள் கொண்டதாக இருந்தால் இதற்கு நிறைய நேரமெடுக்கும். அதனால், ஒரு சிறு உதவிசெயல்நிரலை முயற்சித்தேன். இந்த நிரலிலுள்ள தகவல்தளத்தின் பெயரையும், டேபிளின் பெயரையும் தேவைக்கேற்ப மாற்றி F5 தட்டவும். CREATE PROCEDURE, INSERT, UPDATE statements எல்லாம் போட்டு ஓரளவிற்கு வேலையைக்குறைக்கும் ஸ்டோர்ட் ப்ரோசிஜர் டெம்ப்ளேட் கிடைக்கும்.

என்ன கொடுமை சரவணா இது. மேனேஜ்மெண்ட் ஸ்டூடியோவில் மெசேஜ் விண்டோ யூனிகோடுக்கு இசைவானதாக இல்லை!!! அதனால் எழுத்துக்கூட்டி, ஆங்கிலத்திலேயே வேலிடேஷன் பிழைச்செய்திகள்:

   1: USE  தகவல்தளம் ;
   2:  
   3: declare @tablename varchar(255)
   4: set @tablename = 'test'
   5:  
   6: declare @proceed varchar(20)
   7:  
   8:  
   9: select @proceed = object_id(@tablename)
  10:  
  11: select @proceed = [type] from sys.objects where name = @tablename
  12:  
  13: if @proceed is null
  14: BEGIN
  15:     print 'Table "' + @tablename + '" does not exist in this database. '
  16:     + char(13) + 'Please try changing the database name in the USE statement or
  17:     try correcting the table name.'
  18:     return
  19: END
  20:  
  21: if not @proceed = 'U'
  22: BEGIN
  23:     print 'Object "' + @tablename + '" is not a table...'
  24:     return
  25: END
  26:  
  27: declare @structure table
  28: (
  29: colname varchar(1000),
  30: coltype varchar(50),
  31: colsize int
  32: )
  33:  
  34: insert into @structure
  35: select sys.columns.name, sys.types.name, sys.columns.max_length
  36: from sys.columns left join sys.types
  37: on sys.columns.system_type_id = sys.types.system_type_id
  38: where object_id = object_id(@tablename)
  39:  
  40:  
  41: declare @declaration varchar(8000)
  42: set @declaration = ''
  43: select @declaration = @declaration + char(13) + '@' + colname
  44: + ' ' + coltype + '(' +
  45: convert(varchar(20) , colsize) + '),'
  46: from @structure
  47:  
  48: --Build Insert statement
  49: declare @statement varchar(8000)
  50:  
  51: set @statement = ''
  52:  
  53: select @statement = @statement + char(13)
  54:  
  55: SELECT @STATEMENT = @statement + 'INSERT INTO ' + @tablename + ' ('
  56:  
  57: SELECT @STATEMENT = @statement + char(13) + colname + ',' from @structure
  58:  
  59: SELECT @STATEMENT = @STATEMENT + ')'
  60:  
  61: select @statement = replace(@statement, ',)', ')')
  62:  
  63: select @statement = @statement + ' values('
  64:  
  65:  
  66:  
  67: SELECT @STATEMENT = @STATEMENT + char(13) + '@' + colname + ',' from @structure
  68:  
  69: select @statement = @statement + ')'
  70:  
  71: select @statement = replace(@statement, ',)', ')')
  72:  
  73:  
  74: select @declaration = substring(@declaration, 1, len(@declaration)-1)
  75:  
  76: print 'CREATE PROCEDURE dbo.PROC1 ' + char(13) + '(' + char(13) +  @declaration
  77: + char(13) + ')' + char(13) + 'AS' + char(13)
  78:  
  79: print char(13)
  80: print @statement
  81:  
  82: --Update
  83: declare @updatestatement varchar(3000)
  84:  
  85: set @updatestatement = 'UPDATE ' + @tablename + ' SET '
  86:  
  87: select @updatestatement  = @updatestatement  + char(13) + ' ' + colname +
  88:     ' = @' + colname + ',' from @structure
  89:  
  90: select @updatestatement = @updatestatement + ')'
  91:  
  92: select @updatestatement = replace(@updatestatement, ',)', char(13) + ' WHERE 1=2')
  93:  
  94: print char(13)
  95:  
  96: print @updatestatement

posted @ Wednesday, December 09, 2009 6:45 PM | Feedback (3) | Filed Under [ தகவல் தளம் ]

Powered by: