用什么语句可以直接得到指定的在数据库中已经有的表名的创建语句?这句话有些绕。我的意思是:就像在管理器查看某一个表,对它点击右键——“任务”——“创建新表语句”一样,用语句的方式得到数据库一个指定表的创建语句。
也就是说我要用语句得到一个字符串,这个字符串里是指定表的创建语句。
谢谢!

解决方案 »

  1.   

    --转自CSDN一位高手,名字忘了
    --允许配置高级选项
    EXEC sp_configure 'show advanced options', 1
    GO
    -- 重新配置
    RECONFIGURE WITH OVERRIDE
    GO
    -- 启用xp_cmdshell
    EXEC sp_configure 'Ole Automation Procedures', 1
    GO
    --重新配置
    RECONFIGURE WITH OVERRIDE
    GO
    if exists(select 1 from sysobjects where id=object_id('fgetscript') and objectproperty(id,'IsInlineFunction')=0) 
    drop function fgetscript 
    go create function fgetscript( 
    @servername varchar(50)    --服务器名 
    ,@userid varchar(50)='sa'    --用户名,如果为nt验证方式,则为空 
    ,@password varchar(50)=''    --密码 
    ,@databasename varchar(50)    --数据库名称 
    ,@objectname varchar(250)    --对象名 ) returns varchar(8000) 
    as 
    begin 
    declare @re varchar(8000)        --返回脚本 
    declare @srvid int,@dbsid int      --定义服务器、数据库集id 
    declare @dbid int,@tbid int        --数据库、表id 
    declare @err int,@src varchar(255), @desc varchar(255) --错误处理变量 --创建sqldmo对象 
    exec @err=sp_oacreate 'sqldmo.sqlserver',@srvid output 
    if @err <>0 goto lberr --连接服务器 
    if isnull(@userid,'')='' --如果是 Nt验证方式 
    begin 
      exec @err=sp_oasetproperty @srvid,'loginsecure',1 
      if @err <>0 goto lberr   exec @err=sp_oamethod @srvid,'connect',null,@servername 
    end 
    else 
      exec @err=sp_oamethod @srvid,'connect',null,@servername,@userid,@password if @err <>0 goto lberr --获取数据库集 
    exec @err=sp_oagetproperty @srvid,'databases',@dbsid output 
    if @err <>0 goto lberr --获取要取得脚本的数据库id 
    exec @err=sp_oamethod @dbsid,'item',@dbid output,@databasename 
    if @err <>0 goto lberr --获取要取得脚本的对象id 
    exec @err=sp_oamethod @dbid,'getobjectbyname',@tbid output,@objectname 
    if @err <>0 goto lberr --取得脚本 
    exec @err=sp_oamethod @tbid,'script',@re output 
    if @err <>0 goto lberr --print @re 
    return(@re) 
    lberr: 
    exec sp_oageterrorinfo NULL, @src out, @desc out 
    declare @errb varbinary(4) 
    set @errb=cast(@err as varbinary(4)) 
    --exec master..xp_varbintohexstr  @errb,@re out 
    set @re=--'错误号: '+@re 
       char(13)+'错误源: '+@src 
      +char(13)+'错误描述: '+@desc 
    return(@re) 
    end 
    go -------------------------------declare @name varchar(250) 
    declare #aa cursor for 
    select name from sys.tables  
    open #aa 
    fetch next from #aa into @name 
    while @@fetch_status=0 
    begin 
    print dbo.fgetscript(''/*servername*/,''/*userid*/,''/*password*/,''/*databasename*/,@name) 
    fetch next from #aa into @name 
    end 
    close #aa 
    deallocate #aa 
      

  2.   

    》》:就像在管理器查看某一个表,对它点击右键——“任务”——“创建新表语句”一样那我明确的告诉你,管理器不是通过sql语句的到这个“创建新表语句”的,sql2000可以用sqldmo,sql2005可以用sqlsmo。 
      

  3.   

    2楼的只不过是用sql语句调用了sqldmo的com组件罢了,而且这个在sql2005就不能用了,因为smo不是com是托管类库
      

  4.   

    jinjazz,给具体说说。你们都是富农,我还Poor.
      

  5.   

    参考
    http://blog.csdn.net/jinjazz/archive/2008/06/16/2552609.aspx
      

  6.   

    选中该表
    ctrl+c
    到任意文本编辑器中
    ctrl+v
      

  7.   

    在C#里测试了,就差一点儿。
    SET ANSI_NULLS ONSET QUOTED_IDENTIFIER ONCREATE
    他们之间没有Go和换行,加上就好。基本解决我的问题,谢谢高手!结贴。