SQL抽取數據腳本

/*----------------------------------------------------------*/
/*    [sp_OutputData]                                       */
/*----------------------------------------------------------*/
IF EXISTS ( SELECT 1 FROM sys.objects o WHERE object_id = object_id( N'[sp_OutputData]' ) AND OBJECTPROPERTY( object_id, N'IsProcedure') = 1 )
DROP PROCEDURE [sp_OutputData]
GO
CREATE PROC sp_OutputData 

@tablename sysname,
@Where VARCHAR(4000)='', --where條件語句
@OrderBy VARCHAR(4000)='', --order by 語句
@IfNotExistsColumn VARCHAR(4000)='' --生成 IF NOT EXISTS(SELECT 1 FROM @tablename WHERE @IfNotExistsColumn=@columndata)
 )
AS 
begin
   set nocount on
   declare @column varchar( 4000 ) 
   declare @columndata varchar( 4000 ) 
   declare @sql varchar( max ) 
   declare @xtype tinyint 
   declare @name sysname 
   declare @objectId int 
   declare @objectname sysname 
   declare @ident INT
   DECLARE @IfNotExistsColumnData VARCHAR(4000) 
   DECLARE @IsTempTable BIT --是否臨時表 1:是 0:否
   
   
   set nocount on 
   
   IF LEFT(@tablename, 1)='#' AND
      EXISTS(SELECT 1 FROM TEMPDB..SYSOBJECTS WHERE ID=OBJECT_ID('TEMPDB..'+@tablename) AND XTYPE='U')
     SET @IsTempTable=1
   ELSE   
     SET @IsTempTable=0
     
   IF @IsTempTable=0   
     set @objectId = object_id( @tablename ) 
   ELSE
     set @objectId = object_id( 'TEMPDB..'+@tablename ) 
       
   if( @objectId is null )-- 判斷對象是否存在 
   begin 
      print 'The object not exists' 
      return 
   end 
   
   IF @IsTempTable=0   
   BEGIN 
      set @objectname = rtrim( object_name( @objectId ) ) 
      if( @objectname is null or charindex( @objectname, @tablename ) = 0 )--此判斷不嚴密 
      begin 
         print 'object not in current database' 
         return 
      end 
      if( OBJECTPROPERTY( @objectId,'IsTable' ) < > 1 ) -- 判斷對象是否是table 
      begin 
         print 'The object is not table' 
         return 
      end 
      select @ident = status & 0x80 from syscolumns where id = @objectid and status & 0x80 = 0x80 
      
      if( @ident is not null ) 
      begin
         print 'SET IDENTITY_INSERT '+@TableName+' ON' 
      END
   END  
   
   IF @Where<>'' AND LEFT(@Where, LEN('WHERE'))<>'WHERE' 
      SET @Where='WHERE '+@Where
   IF @OrderBy<>'' AND LEFT(@OrderBy, LEN('ORDER BY'))<>'ORDER BY' 
      SET @OrderBy='ORDER BY '+@OrderBy      
   
   declare syscolumns_cursor cursor for 
   SELECT a.name,a.xtype
   FROM
   (
   select c.name,c.xtype, c.colid from syscolumns c where c.id = @objectid AND @IsTempTable=0
      UNION
   select c.name,c.xtype, c.colid from TEMPDB..syscolumns c where c.id = @objectid AND @IsTempTable=1
   ) a    
    order by a.colid 
   open syscolumns_cursor 
   set @column = '' 
   set @columndata = '' 
   fetch next from syscolumns_cursor into @name,@xtype 
   while( @@fetch_status <> -1 )
   begin 
      if( @@fetch_status <> -2 )
      begin 
         if @xtype not in( 189,34,35,99,98 ) --timestamp不需處理,image,text,ntext,sql_variant 暫時不處理 
         begin 
            set @column = @column+case when len( @column ) = 0 then '' else ',' end + '[' + @name + ']' 
            set @columndata = @columndata + case when len( @columndata ) = 0 then '' else ','','',' end 
                                     +case when @xtype in( 167, 175 ) then ''''''''' + ' + @name + ' + ''''''''' --varchar,char
                                     when @xtype in(241 ) then ''''''''' + convert(varchar(max), ' + @name + ') + ''''''''' --xml
                                     when @xtype in( 231,239 ) then '''N'''''' + ' + @name + ' + ''''''''' --nvarchar,nchar 
                                     when @xtype = 61 then ''''''''' + convert( char( 23 ),' + @name + ',121 ) + ''''''''' --datetime 
                                     when @xtype = 40 then ''''''''' + convert( char( 10 ),' + @name + ',121 ) + ''''''''' --datetime 
                                     when @xtype = 58 then ''''''''' + convert( char( 16 ),' + @name + ',120 ) + ''''''''' --smalldatetime 
                                     when @xtype = 36 then ''''''''' + convert( char( 36 ),' + @name + ' ) + ''''''''' --uniqueidentifier 
                                     else @name end 
            IF @IfNotExistsColumn<>'' AND @name=@IfNotExistsColumn
            BEGIN                         
               SET @IfNotExistsColumnData=case when @xtype in( 167, 175 ) then ''''''''' + ' + @name + ' + ''''''''' --varchar,char 
                                     when @xtype in(241 ) then ''''''''' + convert(varchar(max), ' + @name + ') + ''''''''' --xml
                                     when @xtype in( 231,239 ) then '''N'''''' + ' + @name + ' + ''''''''' --nvarchar,nchar 
                                     when @xtype = 61 then ''''''''' + convert( char( 23 ),' + @name + ',121 ) + ''''''''' --datetime 
                                     when @xtype = 40 then ''''''''' + convert( char( 10 ),' + @name + ',121 ) + ''''''''' --datetime 
                                     when @xtype = 58 then ''''''''' + convert( char( 16 ),' + @name + ',120 ) + ''''''''' --smalldatetime 
                                     when @xtype = 36 then ''''''''' + convert( char( 36 ),' + @name + ' ) + ''''''''' --uniqueidentifier 
                                     else 'CAST('+@name+' AS VARCHAR)'
                                     end                        
            END 
         end 
      end 
      fetch next from syscolumns_cursor into @name,@xtype 
   end 
   close syscolumns_cursor 
   deallocate syscolumns_cursor 
   
   IF @IfNotExistsColumn=''
   BEGIN
      set @sql = 'set nocount on select ''insert [' + @tablename + '] ( ' + @column + ' ) values( ''as ''--'',' + @columndata + ','' )'' from ' + @tablename 
   END ELSE
   BEGIN
      set @sql = 'set nocount on'+CHAR(13)+CHAR(10)+
                 'select'+CHAR(13)+CHAR(10)+ 
                 '''IF NOT EXISTS(SELECT 1 FROM [' + @tablename + '] WHERE '+@IfNotExistsColumn+'=''+'+@IfNotExistsColumnData+'+'') insert [' + @tablename + '] ( ' + @column + ' ) values( ''as ''--'',' + @columndata + ','' )'' from ' + @tablename 
   END
   
   IF @where<>''
     SET @sql=@sql+CHAR(13)+CHAR(10)+@where
   IF @orderby<>''
     SET @sql=@sql+CHAR(13)+CHAR(10)+@orderby     
     
   print '--'+@sql 
   exec( @sql )    
   
   if( @ident is not null )
   begin
      print 'SET IDENTITY_INSERT '+@TableName+' OFF' 
   end
   set nocount off
end
GO
執行:EXEC sp_OutputData 'A1SysParameter','SysParameterCode LIKE ''Tunnel%''','','SysParameterCode'

即可抽取插入數據的腳本。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章