spAutoProc_ZField

CREATE PROCEDURE spAutoProc_ZField @SourceTableName varchar(50), @TargetTableName varchar(50), @FieldMapTable varchar(50)
AS
 DECLARE @altQuery  nvarchar(1000),
   @sql   nvarchar(1000),
   @updQuery  nvarchar(1000),
   @colName  nvarchar(100),
   @idx1   int,
   @idx2   int
  
 SELECT @sql =
  ' DECLARE cs_AltQuery CURSOR FOR ' +
  ' SELECT ' +
  '''ALTER TABLE ''+''' + @SourceTableName + '''+'' ADD z''+' + 'COLUMN_NAME' + '+'' ''' +
  ' +DATA_TYPE+ ' + 'CASE ' +
       ' WHEN character_maximum_length IS NULL AND numeric_scale IS NULL  THEN ''(''+ cast(NUMERIC_PRECISION AS varchar(10)) + '')''' +
       ' WHEN character_maximum_length IS NULL AND NOT numeric_scale = 0   THEN ''(''+ cast(NUMERIC_PRECISION AS varchar(10))+' + ''', ''' + '+cast(NUMERIC_SCALE AS varchar(10)) + '')''' +
       ' WHEN character_maximum_length IS NULL AND numeric_scale = 0   THEN '' ''' +
       ' ELSE ''(''+ cast(character_maximum_length AS varchar(10)) + '')'' END +' +
       ' '' NULL''' +
  ' FROM  information_schema.columns ' +
  ' WHERE TABLE_NAME = ''' + @TargetTableName + ''' AND ' +
  '   COLUMN_NAME IN (SELECT ColumnName FROM ' + @FieldMapTable +
  '       WHERE SourceTableName = ''' + @SourceTableName + ''' AND ' +
  '       Flag = 0 )'

 EXEC sp_executesql @sql

 OPEN cs_AltQuery
 FETCH NEXT FROM cs_AltQuery INTO @altQuery

 WHILE @@FETCH_STATUS = 0
 BEGIN
  PRINT 'Processing query ''' + @altQuery + ''' ...'
  SELECT @idx1 = CHARINDEX(' ', @altQuery, 16+LEN(@SourceTableName))
  SELECT @idx2 = CHARINDEX(' ', @altQuery, 1+@idx1)
  SELECT @colName = SUBSTRING(@altQuery, 2+@idx1, @idx2-@idx1-1)

  EXEC (@altQuery)
  SELECT @updQuery = ' UPDATE ' + @FieldMapTable +
      ' SET Flag = 1 ' +
      ' WHERE ColumnName = ''' + @colName + ''''
  EXEC (@updQuery)
  PRINT 'The query ''' + @altQuery + ''' has been successfully processed.'
  FETCH NEXT FROM cs_AltQuery INTO @altQuery
 END
 CLOSE cs_AltQuery
 DEALLOCATE cs_AltQuery

转载于:https://www.cnblogs.com/zhangchenliang/archive/2010/02/01/1660844.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值