要求我给出一个查询语句
存储过程能通过我给的SQL语句找出所有的字段并根据字段的类型尽心格式化 输出数据比如select * from MemberList其中有一个列名是birthday
然后存储过程能够通过这个字段判断出是日期格式
然后不格式化的时候输出1911-01-01 00:00:00
格式化后输出1911-01-01
在比如还有一个字段 成绩
原本输出是6.75分 格式化后为7分
!!我要的事存储过程不是在查询的时候拍平
!!查询的时候拍平谁都会在我大体这个意思。要格式化的数据很多。只要谁给我这一个简单的处理 其他我自己搞定。

解决方案 »

  1.   

    动态拼sql,把查询结果生成一个临时表,接下来可能要通过读系统表来决定这个临时表每列的类型,再动态生成sql,很复杂,没有人会这样做的。
      

  2.   


    --测试数据表
    create table MemberList
    (birthday datetime,score numeric(38,20))insert into MemberList
    select '2011-09-23',23257.23422444 union all
    select '2011-08-11',123.11111443go
    --创建一个存储过程
    create proc getdataFormat
    (
        @tablename varchar(50)--表名
    )
    as
    begin
        declare @sql varchar(8000)
        select @sql=isnull(@sql+',','')+newcolumn_name from 
        (
            select b.name as column_name,
            newcolumn_name =case c.name 
            when 'datetime' then 'convert(varchar(10),'+b.name+',120) as '+b.name
            when 'numeric' then 'ceiling('+b.name+') as '+b.name
            --可自行添加规则
            else b.name end
            from sysobjects a,syscolumns b,systypes c 
            where a.xtype ='U ' and a.id=b.id and b.xtype=c.xtype 
            and a.name = @tablename
        )a
        exec('select '+@sql+' from '+ @tablename)
    end--原始数据
    select * from MemberList
    /*
    birthday                score                                   col1
    ----------------------- --------------------------------------- -----------------
    2011-09-23 00:00:00.000 23257.23422444000000000000              1.220
    2011-08-11 00:00:00.000 123.11111443000000000000                1.220
    */--格式化后数据
    exec getdataFormat 'MemberList'
    /*
    birthday   score                                   col1
    ---------- --------------------------------------- -------------------------------
    2011-09-23 23258                                   2
    2011-08-11 124                                     2
    */我没有使用游标,你懂的...
      

  3.   


    CREATE TABLE Tb(id int,date datetime,score decimal(18,2))
    INSERT INTO Tb
    SELECT 1,'2011-03-01 12:20',12.25 UNION ALL
    SELECT 2,'2011-09-22 18:20',14.30
    GOCREATE PROC InsertGenerator  
        (  
          @tableName VARCHAR(100) 
        )  
    AS --定义一个游标获取数据表列的相关信息 
    DECLARE @STRING VARCHAR(8000) 
    SET @STRING = ' SELECT ' 
    ;WITH ACH AS
    (
    SELECT  COLUMN_NAME,DATA_TYPE  
    FROM    INFORMATION_SCHEMA.COLUMNS
    WHERE   TABLE_NAME = @TABLENAME  
    )
    SELECT @STRING = @STRING+(CASE WHEN DATA_TYPE='datetime' 
           THEN 'convert(varchar(10),' + COLUMN_NAME + ',120) as ['+COLUMN_NAME+']'
       WHEN DATA_TYPE IN ('numeric','decimal')
       THEN 'ceiling('+COLUMN_NAME+') as ['+COLUMN_NAME+']'
      ELSE COLUMN_NAME END)+','
    FROM ACH
    set @string = stuff(@string,len(@string),1,'') + ' from ' + @tableName
    exec(@string)
    GO exec InsertGenerator 'Tb'DROP PROC InsertGenerator
    DROP TABLE Tb/*******************id          date       score
    ----------- ---------- ---------------------------------------
    1           2011-03-01 13
    2           2011-09-22 15(2 行受影响)
      

  4.   


    有两个要求
    1:传SQL语句不是表名
    2:输出顺序乱套了
      

  5.   

    因为我现在有一个表 表里存储了1000多条SQL的增删改查语句
    然后根据查自动输出GRIDVIEW。并格式化。我总不能在GRIDVIEW里格式化吧。本来就是自动输出。那里面没生成一列就要格式化。因为我们格式化对这1000多个SQL的要求是一样的。肯定要统一。然后根据查询自动生成表单。根据插入指定。自动AJAX提交数据根据更新指定。自动AJAX提交数据。
      

  6.   


    create proc getdataFormat1
    (
        @param varchar(50)--参数例如:select * from tablename
    )
    as
    begin
        declare @sql varchar(8000)
        select @sql=isnull(@sql+',','')+newcolumn_name from 
        (
            select b.name as column_name,
            newcolumn_name =case c.name 
            when 'datetime' then 'convert(varchar(10),'+b.name+',120) as '+b.name
            when 'numeric' then 'ceiling('+b.name+') as '+b.name
            --可自行添加规则
            else b.name end
            from sysobjects a,syscolumns b,systypes c 
            where a.xtype ='U ' and a.id=b.id and b.xtype=c.xtype 
            and a.name = right(@param,charindex(' ',reverse(@param))-1)
        )a
        set @sql='select '+@sql+' from '+ right(@param,charindex(' ',reverse(@param))-1)
        exec(@sql)
    endexec getdataFormat1 'select * from MemberList'
    --这样有点画蛇添足
      

  7.   

    1000多个SQL语句,什么样的都有,不是都可以处理。现在是处理select。
    如果你的语句中有各种什么group by 什么order by 什么 left join 等等,情况太多,无法都灵活处理。
      

  8.   

    表里存储了1000多条SQL 的增删改查!???
    SQL SERVER的表是用来存数据的,SQL脚本可以写到存储过程里,或是程序中。
    把SQL的增删改查写到表中,我还是第二次看到,曾经见过某人这样弄过一次,他也是只存储sql语句,然后得到后动态exec而已。这种设计严重制约了它的灵活性!
      

  9.   

       when 'datetime' then 'convert(varchar(10),'+b.name+',120) as '+b.name
       when 'numeric' then 'ceiling('+b.name+') as '+b.name
       --我这个位置说了,可以自行添加,sql server中的类型你自定对应的添加一下就可以了。
      

  10.   

    都没达到要求。传入的事SQL返回的当然也是对应的SQL结果select 当前日期 from memeberlist
    当然要结果也只有当前日期。叶子的返回很乱啊。
      

  11.   

    when 'datetime' then 'convert(varchar(10),'+b.name+',120) as '+b.name
    when 'numeric' then 'ceiling('+b.name+') as '+b.name
    when 'decimal' then 'ceiling('+b.name+') as '+b.name
    when 'float' then 'ceiling('+b.name+') as '+b.name
    你都想让那些类型的字段进行怎么样的处理,在这个位置写。
      

  12.   

    因为你的sql语句作为参数,这个字符型的参数可以是多种形态的。
    例如select col1+col3 as col2 from tablename
    select * from tablename
    select col1 from tablename
    select a.col1,a.col2 from tablename a
    select a.col1,a.col2,a.col1+a.col2 from tablename a正常的exec只是执行这个语句,但是把这个作为参数,就需要判读其中的表名,得到其中的字段名,判断字段的类型,然后重新查询。
      

  13.   

    不是这样的叶子 因为单表查询我们都是select * from 表名 
    然后where是在程序里控制的。
    所以你这个搞定我们就可以用。多别查询列名已经列出来了一般。我们就在查询里处理了还有我们这1000条都是针对单表的。只有单表才能自动生成增删改查全部搞定。多表我们值存查询。其他当然是手动搞定
      

  14.   

    如果你存储的是各种sql语句,就是没有固定规则的,是无法处理的。
    你只是传进去一个字符串,里面可以有表别名,列别名之类的,可能有嵌套,可能有联查,可能有分组。
    根据无法准确的定位表名和列名,然后在判断该字段的类型。
    例如嵌套,需要找到该字段的真实附属表。这个是弄不了的。
      

  15.   

    单表。。我要的只是单表。最高档次到select * from tbname where fieldname='ahaha' and fieldname2='haha2'
      

  16.   

    单表查询都是select * from 表名 ,那直接存表名不就ok了吗?
    把脚本分成多种方式存储,后期不利于维护。
      

  17.   

    但是查询出来的顺序一定要没问题。
    因为我们还有一个列是自定义表头。也是存在SQL字段中。如果顺序不一样我们的自定义表头就挂了
      

  18.   

    算了。我想出了另一种解决方法我们可以写一个SQL语句生成器。直接选择表明自动查出日期型 跟decimal型的数据。
    然后自动拼接出我们想要的字符串。自动更新现有的存储在SQL表里的对应查询语句
      

  19.   

    名字就叫SQL格式化语句生成器呵呵。叶子有空搞定没?有空搞定发我。没空搞定我自己搞嘿嘿
      

  20.   

    如果你存的是select * from tablename 顺序应该不会有问题的,默认排序即可。
      

  21.   

    一般对数据做格式化,都是在bl层或者,ui层处理的,很少是在存储过程处理。你这种做法本身就是不可取的,因为格式化过的数据,数据值可能就不正确了,这样要再对数据做二次处理的话,差别就会更大,这样不但以后维护起来麻烦,性能也低。
      

  22.   

    这个不是SQL版的问题吗??
    是不是发错板块了啊?楼主
      

  23.   


    create table table1(id int,cdate datetime)
    create table table2(id int,col1 varchar(20))
    create table table3(id int,col2 decimal(6,2))create table sqltable(id int identity(1,1),sqlcontect varchar(40))
    insert into sqltable(sqlcontect)
    select 'select * from table1' union all
    select 'select * from table2' union all
    select 'select * from table3'
    select * from sqltable
    /*
    id          sqlcontect
    ----------- ----------------------------------------
    1           select * from table1
    2           select * from table2
    3           select * from table3
    */
    select b.name as column_name,
    newcolumn_name =case c.name 
    when 'datetime' then 'convert(varchar(10),'+b.name+',120) as '+b.name
    when 'numeric' then 'ceiling('+b.name+') as '+b.name
    when 'decimal' then 'ceiling('+b.name+') as '+b.name
    else b.name end
    from sysobjects a,syscolumns b,systypes c 
    where a.xtype ='U ' and a.id=b.id and b.xtype=c.xtype 
    /*
    column_name   newcolumn_name
    -------------  --------------
    id id
    sqlcontect sqlcontect
    id id
    cdate convert(varchar(10),cdate,120) as cdate
    id id
    col1 col1
    id id
    col2 ceiling(col2) as col2
    */你会遇到源源不断的新问题....
    先帮你弄到这