生成表记录的SQL语句

/*-------------------------------------------------------------------------------
功能:
     生成表记录的SQL语句(注TEXT与NTEXT字段导出为NULL)

参数说明:
     @Table_Name   表名
     @IsPrint         是否打印输入[1:是,0:否].
                     是:Print字符串在查询分析器中使用.
                     否:则为Select出表(默认为0:否)
   
--当表中有自增列[identity]时,将生成的SQL语句放入下方 Insert Sql语句 处 ,执行
set identity_insert [thetablename] on
go
..Insert Sql语句
go
set identity_insert [thetablename] off
go
-------------------------------------------------------------------------------------*/
declare @Table_Name varchar(500),@IsPrint bit
set @Table_Name = ‘erp_sys_menus‘
set @IsPrint = 1

SET NOCOUNT ON
 DECLARE @obj_name           AS SYSNAME
 DECLARE @column_name        AS SYSNAME
 DECLARE @usr_defined_dtype  AS SYSNAME
 DECLARE @sys_dtype          AS SYSNAME

DECLARE @str_insert AS VARCHAR(MAX)
 DECLARE @str_value  AS VARCHAR(MAX)

DECLARE @cu_obj CURSOR
 SET @cu_obj = CURSOR LOCAL SCROLL FOR
  SELECT sobj.name   AS obj_name,
   scol.name   AS column_name,
   styp.name   AS usr_defined_dtype,
   styp1.name  AS sys_dtype
  FROM    sysobjects sobj
  INNER JOIN syscolumns scol ON scol.id = sobj.id
  INNER JOIN systypes styp ON styp.xtype = scol.xtype AND styp.xusertype   = scol.xusertype
  INNER JOIN systypes styp1 ON styp1.xtype = styp.xtype AND   styp1.xusertype = styp.xtype
  WHERE sobj.xtype = ‘U‘
  AND   sobj.name   = @Table_Name
  ORDER BY scol.colid
 
   SET @str_insert = ‘‘‘insert into [‘ + @table_name + ‘] (‘
   SET @str_value   = ‘‘‘values (‘‘ + ‘
 
   OPEN @cu_obj
   FETCH NEXT FROM @cu_obj INTO @obj_name, @column_name, @usr_defined_dtype, @sys_dtype
 
   WHILE @@FETCH_STATUS = 0
   BEGIN
     IF @sys_dtype <> ‘image‘
     BEGIN
       SET @str_insert = @str_insert +‘[‘+ @column_name + ‘],‘   
       BEGIN   
         SET @str_value = @str_value + ‘case when ‘ + @column_name + ‘ is null then ‘‘null‘‘ else ‘
         IF @sys_dtype IN (‘char‘, ‘varchar‘, ‘nchar‘, ‘nvarchar‘)
         BEGIN
           SET @str_value = @str_value + ‘‘‘‘‘‘‘‘‘ + ‘ +   ‘replace(‘ + @column_name + ‘, ‘‘‘‘‘‘‘‘, ‘‘‘‘‘‘‘‘‘‘‘‘)‘ + ‘ + ‘‘‘‘‘‘‘‘‘
         END
         ELSE IF @sys_dtype IN (‘text‘,‘ntext‘)
         BEGIN
           SET @str_value = @str_value + ‘‘‘null‘‘‘
         END
         ELSE IF @sys_dtype IN (‘datetime‘,‘datetime2‘, ‘smalldatetime‘,‘date‘)
         BEGIN
           SET @str_value = @str_value + ‘‘‘‘‘‘‘‘‘ + ‘ +   ‘convert(varchar, ‘ + @column_name + ‘,120)‘ + ‘ + ‘‘‘‘‘‘‘‘‘
         END
         ELSE IF @sys_dtype IN (‘bigint‘, ‘int‘, ‘smallint‘, ‘tinyint‘, ‘bit‘, ‘decimal‘, ‘numeric‘, ‘money‘, ‘smallmoney‘, ‘float‘, ‘real‘)
         BEGIN
           SET @str_value = @str_value +   ‘convert(varchar, ‘ + @column_name + ‘)‘+ ‘ ‘
         END
         ELSE
         BEGIN
   SET @str_value = @str_value + ‘‘‘‘‘‘‘‘‘ + ‘ +   @column_name  + ‘ + ‘‘‘‘‘‘‘‘‘
         END          
         SET @str_value = @str_value + ‘ end ‘
       END   
       SET @str_value = @str_value + ‘+ ‘‘, ‘‘ + ‘   
     END   
     FETCH NEXT FROM @cu_obj INTO @obj_name, @column_name, @usr_defined_dtype, @sys_dtype
   END
   CLOSE @cu_obj
 
   SELECT @str_insert = LEFT(@str_insert, LEN(@str_insert)-1) + ‘) ‘‘ ‘
   SELECT @str_value   = LEFT(@str_value, LEN(@str_value)-8) + ‘ + ‘‘) ‘‘   ‘
 
   CREATE TABLE #returnTable (sqlString VARCHAR(MAX))
   DECLARE @sql VARCHAR(MAX)  
   INSERT INTO #returnTable
   EXEC (‘select ‘ + @str_insert + ‘ + char(10)+‘ +  @str_value + ‘ + char(10)  from ‘ + @table_name + ‘  ‘)
   IF @IsPrint = 0
       SELECT * FROM #returnTable
   ELSE
   BEGIN
     DECLARE @PrintString AS VARCHAR(MAX)
     DECLARE print_cursor CURSOR FOR
     SELECT sqlString
     FROM #returnTable

OPEN print_cursor

FETCH NEXT FROM print_cursor INTO @PrintString
     WHILE @@FETCH_STATUS = 0
     BEGIN     
       PRINT @PrintString
       FETCH NEXT FROM print_cursor INTO @PrintString  
     END

CLOSE print_cursor
     DEALLOCATE print_cursor
   END
   DROP TABLE #returnTable
   SET NOCOUNT OFF

时间: 2024-08-08 14:11:59

生成表记录的SQL语句的相关文章

“取出数据表中第10条到第20条记录”的sql语句+select top 使用方法

1.首先.select top使用方法: 參考问题  select top n * from和select * from的差别 select * from table --  取全部数据.返回无序集合 select top n * from table  -- 依据表内数据存储顺序取前n条,返回无序集合 select * from table order by id desc -- 取全部数据.按id逆序返回有序列表 select top n * from table order by id d

“取出数据表中第10条到第20条记录”的sql语句+select top 用法

1.首先,select top用法: 参考问题  select top n * from和select * from的区别 select * from table --  取所有数据,返回无序集合 select top n * from table  -- 根据表内数据存储顺序取前n条,返回无序集合 select * from table order by id desc -- 取所有数据,按id逆序返回有序列表 select top n * from table order by id des

Oracle 查询并删除重复记录的SQL语句

查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select   peopleId from   people group by   peopleId having count(peopleId) > 1) 2.删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录delete from people where

创建数据库和表相关的SQL语句

SQL server注释语句有两种: 一种是单行注释,一种是多行注释. ******************** 单行注释用:--注释一行内容 多行注释用:/* *注释 *多行内容 */ 创建数据库: 语句如下: /*创建数据库主文件 create database student:新建数据库逻辑名称为student filename='d:\stduent_data.mdf':数据库文件保存路径和名字. on primary:primary—默认文件组,表示表是建立在主文件组上,可以省略. s

SQL语句:关于复制表结构和内容到另一张表中的SQL语句

1.复制新表结构及数据到新表create table 新表 select * from 旧表 2.只复制表结构到新表 create table 新表 select * from 旧表 where 1=2 3.复制旧表的数据到新表(假设两个表结构一样) insert into 新表 select * from 旧表 4.复制旧表的数据到新表(假设两个表结构不一样) insert into 新表(字段1,字段2,......) select 字段1, 字段2,... from 旧表 SQL语句:关于

用Hibernate框架把hql生成可执行的sql语句-Oracle方言

引言:为什么这样的需求,源自公司项目需要,公司的项目使用java的struts2+spring2.5+oracle中间件tuxedo,数据库用的是Oracle,但由于不直接连接数据库,用中间件处理的方式,又不希望有太多服务,所以就开始网络找资料整理编码了.大概花了一个多星期完成了这个任务,现在整理出来与大家分享,也是自己知识的梳理. 1.需要导入相关的jar包: [按字母顺序排列] antlr-2.7.5H3.jar 语言转换工,Hibernate利用它实现 HQL 到 SQL的转换 asm.j

Hibernate原生SQL查询多表关联,SQL语句要注意的问题

Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Question 和 Answer分别对应数据表 question 和answer. 并且表 question 和answer 的字段大部分都一样,字段数目也一样. 执行如下的操作: 1> 使用hibernate 使用原生SQL查询, Query q = session.createSQLQuery(sql).

mysql 查询随机条记录的sql语句和php计算概率

最近在网上找了下mysql查询随机的几个sql,我把最终的记录下来. SELECT * FROM uchome_mtag AS a JOIN (SELECT MAX(tagid) AS id FROM uchome_mtag) AS b ON (a.tagid>=FLOOR(b.id*RAND())) LIMIT 50 我试验后发现一个问题,当你的表里的总数和想要得到的条数很接近时,可能会不理想,有可能你有10条,你想查出随机的8条时,却只给出了5条的结果. 应该是那个大于等于造成的吧. 还有p

随机抽取记录的sql语句

随机获得Mysql数据表的一条或多条记录有很多方法,下面我就以users(userId,userName,password......)表(有一百多万条记录)为例,对比讲解下几个方法效率问题: select * from users order by rand() LIMIT 1执行该sql语句,老半天没有反应,最后被迫手动停止执行,怎个伤人了得啊!后来我查了一下MYSQL手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次