要求我给出一个查询语句
存储过程能通过我给的SQL语句找出所有的字段并根据字段的类型尽心格式化 输出数据比如select * from MemberList其中有一个列名是birthday
然后存储过程能够通过这个字段判断出是日期格式
然后不格式化的时候输出1911-01-01 00:00:00
格式化后输出1911-01-01
在比如还有一个字段 成绩
原本输出是6.75分 格式化后为7分
!!我要的事存储过程不是在查询的时候拍平
!!查询的时候拍平谁都会在我大体这个意思。要格式化的数据很多。只要谁给我这一个简单的处理 其他我自己搞定。
存储过程能通过我给的SQL语句找出所有的字段并根据字段的类型尽心格式化 输出数据比如select * from MemberList其中有一个列名是birthday
然后存储过程能够通过这个字段判断出是日期格式
然后不格式化的时候输出1911-01-01 00:00:00
格式化后输出1911-01-01
在比如还有一个字段 成绩
原本输出是6.75分 格式化后为7分
!!我要的事存储过程不是在查询的时候拍平
!!查询的时候拍平谁都会在我大体这个意思。要格式化的数据很多。只要谁给我这一个简单的处理 其他我自己搞定。
--测试数据表
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
*/我没有使用游标,你懂的...
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 行受影响)
有两个要求
1:传SQL语句不是表名
2:输出顺序乱套了
然后根据查自动输出GRIDVIEW。并格式化。我总不能在GRIDVIEW里格式化吧。本来就是自动输出。那里面没生成一列就要格式化。因为我们格式化对这1000多个SQL的要求是一样的。肯定要统一。然后根据查询自动生成表单。根据插入指定。自动AJAX提交数据根据更新指定。自动AJAX提交数据。
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'
--这样有点画蛇添足
如果你的语句中有各种什么group by 什么order by 什么 left join 等等,情况太多,无法都灵活处理。
SQL SERVER的表是用来存数据的,SQL脚本可以写到存储过程里,或是程序中。
把SQL的增删改查写到表中,我还是第二次看到,曾经见过某人这样弄过一次,他也是只存储sql语句,然后得到后动态exec而已。这种设计严重制约了它的灵活性!
when 'numeric' then 'ceiling('+b.name+') as '+b.name
--我这个位置说了,可以自行添加,sql server中的类型你自定对应的添加一下就可以了。
当然要结果也只有当前日期。叶子的返回很乱啊。
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
你都想让那些类型的字段进行怎么样的处理,在这个位置写。
例如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只是执行这个语句,但是把这个作为参数,就需要判读其中的表名,得到其中的字段名,判断字段的类型,然后重新查询。
然后where是在程序里控制的。
所以你这个搞定我们就可以用。多别查询列名已经列出来了一般。我们就在查询里处理了还有我们这1000条都是针对单表的。只有单表才能自动生成增删改查全部搞定。多表我们值存查询。其他当然是手动搞定
你只是传进去一个字符串,里面可以有表别名,列别名之类的,可能有嵌套,可能有联查,可能有分组。
根据无法准确的定位表名和列名,然后在判断该字段的类型。
例如嵌套,需要找到该字段的真实附属表。这个是弄不了的。
把脚本分成多种方式存储,后期不利于维护。
因为我们还有一个列是自定义表头。也是存在SQL字段中。如果顺序不一样我们的自定义表头就挂了
然后自动拼接出我们想要的字符串。自动更新现有的存储在SQL表里的对应查询语句
是不是发错板块了啊?楼主
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
*/你会遇到源源不断的新问题....
先帮你弄到这