RT

解决方案 »

  1.   

    /****************************************************************************
     软件名称: May Flower Erp
     版权所有: (C) 2005-2006 May Flower ERP 开发组
     功能描述: 获取指定表的创建脚本,包括表和字段的属性、外键(注释掉的)
    ----------------------------------------------------------------------------
     参数列表: 
            1: @TableName 需要创建脚本的表的名称
    ****************************************************************************/
    if object_id('dbo.sp_HelpTable') is not null
    drop proc [dbo].[sp_HelpTable]
    go
    CREATE PROCEDURE [dbo].[sp_HelpTable](@TableName sysname)
    AS
      SET NOCOUNT ON
      DECLARE @ObjectID int
      DECLARE @TableScript table(Iden int IDENTITY(1, 1), ScriptLine nvarchar(4000))
      SET @ObjectID = object_id(@TableName)
      IF @ObjectID IS NULL OR OBJECTPROPERTY(@ObjectID, 'IsTable') = 0
      BEGIN
        RAISERROR('指定的对象不是表对象', 16, 1)
        RETURN
      END 
      --获取表的创建脚本
      --插入表头
      INSERT INTO @TableScript(ScriptLine)
        SELECT N'CREATE TABLE [' + USER_NAME(OBJECTPROPERTY(@ObjectID, N'OwnerId')) + N'].[' + object_name(@ObjectID) + N']('  --插入字段
      INSERT INTO @TableScript(ScriptLine)
        SELECT N'  [' + a.Name + N'] [' + b.name + N']' + 
               CASE WHEN c.Object_id IS NOT NULL THEN N' IDENTITY(' + CONVERT(nvarchar, c.seed_value) + N', ' + CONVERT(nvarchar, c.increment_value) + N')' 
                    ELSE '' END +
               CASE WHEN b.xusertype IN (167, 175, 231, 239) THEN N'('+CONVERT(nvarchar, a.prec)  + N')'
                    WHEN b.xusertype in (106, 108)           THEN N'('+CONVERT(nvarchar, a.xprec) + N', ' + CONVERT(nvarchar, a.xscale) + N')'
                    ELSE '' END +
               CASE a.isnullable WHEN 1 THEN N'' ELSE N' NOT' END + N' NULL' +
               CASE WHEN d.Name IS NOT NULL THEN N' DEFAULT ' + d.Definition ELSE N'' END +
               N',' 
          FROM sys.syscolumns a
            LEFT JOIN sys.systypes b ON a.xusertype = b.xusertype
            LEFT JOIN sys.identity_columns c ON c.Object_id = a.ID AND c.Column_ID = a.ColID
            LEFT JOIN sys.default_constraints d ON d.Parent_Object_ID = a.ID AND d.Parent_column_ID = a.ColID
        WHERE a.[ID] = @ObjectID
        ORDER BY a.ColOrder  --插入主键和索引
      DECLARE @IndexID int, @IndexScript nvarchar(4000)
      DECLARE IndexCursor CURSOR FOR 
        SELECT b.Index_ID, N'  CONSTRAINT [' + a.Name + N'] ' + 
               CASE a.Type WHEN 'PK' THEN N'PRIMARY KEY ' WHEN 'UQ' THEN N'UNIQUE ' END + 
               CASE b.Type WHEN 1    THEN N'CLUSTERED'   WHEN 2     THEN N'NONCLUSTERED ' END + N'('
          FROM sys.key_constraints a
            LEFT JOIN sys.indexes b ON b.Object_ID = a.Parent_Object_ID AND b.index_id = a.unique_index_id
        WHERE a.Parent_Object_ID = @ObjectID
      OPEN IndexCursor
      FETCH NEXT FROM IndexCursor INTO @IndexID, @IndexScript
      WHILE @@FETCH_STATUS = 0
      BEGIN
        SELECT @IndexScript = @IndexScript + N'[' + INDEX_COL(object_name(@ObjectID), 2 , 1) + N'],'
          FROM sys.index_columns 
        WHERE Object_ID = @ObjectID
          AND Index_ID = 2
        
        SET @IndexScript = LEFT(@IndexScript, LEN(@IndexScript) -1) + N'),'
        INSERT INTO @TableScript(ScriptLine) VALUES(@IndexScript)
        FETCH NEXT FROM IndexCursor INTO @IndexID, @IndexScript
      END
      Close IndexCursor
      DEALLOCATE IndexCursor  insert into @TableScript(ScriptLine) VALUES(')')
      select * from @TableScript 
    GO
    --调用:
    exec [sp_HelpTable] 表名
    ----------------------------------------------------------------------------------------
    --将表数据生成SQL脚本的存储过程 
    if object_id('dbo.UspOutputData') is not null
    drop proc dbo.UspOutputData
    go
    CREATE PROCEDURE dbo.UspOutputData 
    @tablename sysname 
    AS 
    declare @column varchar(1000) 
    declare @columndata varchar(1000) 
    declare @sql varchar(4000) 
    declare @xtype tinyint 
    declare @name sysname 
    declare @objectId int 
    declare @objectname sysname 
    declare @ident int set nocount on 
    set @objectId=object_id(@tablename) if @objectId is null -- 判断对象是否存在 
    begin 
    print 'The object not exists' 
    return 
    end 
    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 
    print 'SET IDENTITY_INSERT '+@TableName+' ON' declare syscolumns_cursor cursor for select c.name,c.xtype from syscolumns c where c.id=@objectid order by c.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(231,239) then '''N''''''+'+@name+'+''''''''' --nvarchar,nchar 
    when @xtype=61 then '''''''''+convert(char(23),'+@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 end end fetch next from syscolumns_cursor into @name,@xtype end close syscolumns_cursor 
    deallocate syscolumns_cursor set @sql='set nocount on select ''insert '+@tablename+'('+@column+') values(''as ''--'','+@columndata+','')'' from '+@tablename print '--'+@sql 
    exec(@sql) if @ident is not null 
    print 'SET IDENTITY_INSERT '+@TableName+' OFF' GO exec UspOutputData 你的表名
      

  2.   

    数据生成SQL?还是结构?生成脚本,
      

  3.   

    任务->生成脚本->脚本选项(编写数据脚本=TRUE)
      

  4.   

    表里数据 生成SQL 比如说???
      

  5.   

    比如说表A:      id ,name 
                     1   小明 
                     2   小方生成的数据脚本是  INSERT INTO A(id,name)VALUES(1,'小明')
                    INSERT INTO A(id,name)VALUES(2,'小方')
      

  6.   

    Tony哥,那要是想要通过条件过滤咋办呢?有一个条件的或两个条件的
      

  7.   

    用法:
    取所有记录
    EXEC InsertGenerator '表A'
    取前10条记录
    InsertGenerator '表A', 10
    根据条件取前10条记录
    InsertGenerator '表A', 10, 'Id = 1'
    CREATE PROC InsertGenerator
    (
            @tableName      VARCHAR(100)
           ,@top            INT             = NULL -- INT, top (n) of record
           ,@where          VARCHAR(400)    = NULL -- VARCHAR, whera clause. like 'ID = 1'
    )
    AS
    DECLARE @is_identity    BIT
    DECLARE @schema_name    VARCHAR(100)
    SET @is_identity = 0SET @schema_name = PARSENAME(@tableName,2)
    SET @tableName = PARSENAME(@tableName,1)IF @schema_name IS NULL
    SET @schema_name = 'dbo'IF EXISTS(  SELECT * FROM sys.columns A
                INNER JOIN sys.tables B ON A.object_id = B.object_id AND SCHEMA_NAME(B.schema_id) = @schema_name
                WHERE OBJECT_NAME(A.object_id) = @tableName
                AND A.is_identity = 1)
    BEGIN
     SET @is_identity = 1
    END--Declare a cursor to retrieve column specific information for the specified table
    DECLARE cursCol CURSOR FAST_FORWARD FOR
        SELECT column_name
              ,data_type
        FROM information_schema.columns
        WHERE table_name = @tableName
        AND table_schema = @schema_name
    OPEN cursCol
    DECLARE @string     NVARCHAR(MAX) --for storing the first half of INSERT statement
    DECLARE @stringData NVARCHAR(MAX) --for storing the data (VALUES) related statement
    DECLARE @dataType   NVARCHAR(MAX) --data types returned for respective columns
    SET @string='INSERT INTO ' + @schema_name + '.' + @tableName + '('
    SET @stringData=''SET NOCOUNT ON
    DECLARE @colName NVARCHAR(50)FETCH NEXT FROM cursCol INTO @colName,@dataTypeIF @@FETCH_STATUS<>0
     BEGIN
     PRINT 'Table '+@tableName+' not found, processing skipped.'
     CLOSE curscol
     DEALLOCATE curscol
     RETURN
    ENDWHILE @@FETCH_STATUS=0
    BEGIN
        IF @dataType IN ('varchar','char','nchar','nvarchar')
        BEGIN
         --SET @stringData=@stringData+'''''''''+isnull('+@colName+','''')+'''''',''+'
         SET @stringData=@stringData+''''+'''+isnull('''''+'''''+'+@colName+'+'''''+''''',''NULL'')+'',''+'
        END
        ELSE
        IF @dataType in ('text','ntext') --if the datatype is text or something else
        BEGIN
         SET @stringData=@stringData+'''''''''+isnull(cast('+@colName+' as varchar(2000)),'''')+'''''',''+'
        END
        ELSE
        IF @dataType = 'money' --because money doesn't get converted from varchar implicitly
        BEGIN
         SET @stringData=@stringData+'''convert(money,''''''+isnull(cast('+@colName+' as varchar(200)),''0.0000'')+''''''),''+'
        END
        ELSE
        IF @dataType='datetime'
        BEGIN
         SET @stringData=@stringData+'''convert(datetime,'+'''+isnull('''''+'''''+convert(varchar(200),'+@colName+',121)+'''''+''''',''NULL'')+'',121),''+'
        END
        ELSE
        IF @dataType='image'
        BEGIN
         SET @stringData=@stringData+'''''''''+isnull(cast(convert(varbinary,'+@colName+') as varchar(6)),''0'')+'''''',''+'
        END
        ELSE --presuming the data type is int,bit,numeric,decimal
        BEGIN
         SET @stringData=@stringData+''''+'''+isnull('''''+'''''+convert(varchar(200),'+@colName+')+'''''+''''',''NULL'')+'',''+'
        END    SET @string=@string+@colName+','    FETCH NEXT FROM cursCol INTO @colName,@dataType
    ENDCLOSE cursCol
    DEALLOCATE cursColDECLARE @query NVARCHAR(MAX)SET @query = 'SELECT 'IF @top IS NOT NULL
    BEGIN
        SET @query = @query + 'TOP (' + CAST(@top AS VARCHAR(20)) + ')'
    ENDSET @query =@query + 'sqltext=''' + SUBSTRING(@string,0,LEN(@string)) + ')' + CHAR(13) + 'VALUES(''+ ' + SUBSTRING(@stringData,0,LEN(@stringData)-2)+'''+'')'' FROM '+ @schema_name + '.' + @tableNameIF @where IS NOT NULL OR RTRIM(@where) = ''
    BEGIN
     SET @query = @query + ' WHERE 1 = 1 AND ' + @where
    ENDIF @is_identity = 1
    BEGIN
     SET @query = 'SELECT sqltext=''SET IDENTITY_INSERT '+@tableName+' ON'' UNION ALL ' + CHAR(13)
                 +'SELECT sqltext = ''GO'' UNION ALL' + CHAR(13) + @query + ' UNION ALL' + CHAR(13)
                 +'SELECT sqltext=''SET IDENTITY_INSERT '+@tableName+' OFF'' UNION ALL' + CHAR(13)
                 +'SELECT sqltext = ''GO'''END
    --PRINT @query
    EXEC sp_executesql @querySET NOCOUNT OFF
    GO
      

  8.   

    有数据库工具可以,你搜一下,名字就叫数据库工具,可以把数据库中的数据生成sql语句
      

  9.   


    CREATE PROC InsertGenerator
    (
        @tableName          VARCHAR(100)
       ,@where              VARCHAR(400) = NULL
    )AS
    BEGIN
        SET NOCOUNT ON    DECLARE @string         NVARCHAR(3000)
        DECLARE @stringData     NVARCHAR(3000)
        DECLARE @dataType       NVARCHAR(1000)
        SET @string='INSERT INTO '+@tableName+'('
        SET @stringData=''    DECLARE @colName        NVARCHAR(50)    DECLARE cursCol CURSOR FAST_FORWARD
        FOR
            SELECT column_name,data_type
            FROM information_schema.columns
            WHERE table_name = @tableName
        OPEN cursCol
        FETCH NEXT FROM cursCol INTO @colName,@dataType    IF @@FETCH_STATUS<>0
        BEGIN
            PRINT 'Table '+@tableName+' not found, processing skipped.'
            CLOSE curscol
            DEALLOCATE curscol
            RETURN
        END    WHILE @@FETCH_STATUS=0
        BEGIN
            IF @dataType IN ('varchar','char','nchar','nvarchar')
            BEGIN
                SET @stringData=@stringData+''''+'''+isnull('''''+'''''+'+@colName+'+'''''+''''',''NULL'')+'',''+'
            END
            ELSE IF @dataType IN ('text','ntext')
            BEGIN
                SET @stringData=@stringData+'''''''''+isnull(cast('+@colName+' as varchar(2000)),'''')+'''''',''+'
            END
            ELSE IF @dataType = 'money'
            BEGIN
                SET @stringData=@stringData+'''convert(money,''''''+isnull(cast('+@colName+' as varchar(200)),''0.0000'')+''''''),''+'
            END
            ELSE IF @dataType='datetime'
            BEGIN
                SET @stringData=@stringData+'''convert(datetime,'+'''+isnull('''''+'''''+convert(varchar(200),'+@colName+',121)+'''''+''''',''NULL'')+'',121),''+'
            END
            ELSE IF @dataType='image'
            BEGIN
                SET @stringData=@stringData+'''''''''+isnull(cast(convert(varbinary,'+@colName+') as varchar(6)),''0'')+'''''',''+'
            END
            ELSE
            BEGIN
                SET @stringData=@stringData+''''+'''+isnull('''''+'''''+convert(varchar(200),'+@colName+')+'''''+''''',''NULL'')+'',''+'
            END        SET @string=@string+@colName+','        FETCH NEXT FROM cursCol INTO @colName,@dataType
        END
        CLOSE cursCol
        DEALLOCATE cursCol    DECLARE @Query nvarchar(4000)
        PRINT 'SET IDENTITY_INSERT '+@tableName+' ON'
        PRINT 'GO'
        SET @query ='SELECT '''+substring(@string,0,len(@string)) + ') VALUES(''+ ' + substring(@stringData,0,len(@stringData)-2)+'''+'')'' FROM '+@tableName    IF @where IS NOT NULL OR RTRIM(@where) = ''
        BEGIN
        SET @query = @query + ' WHERE 1 = 1 AND ' + @where
        END    EXEC sp_executesql @query
        PRINT 'GO'
        PRINT 'SET IDENTITY_INSERT '+@tableName+' OFF'    SET NOCOUNT OFF
    END
    GO