首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求一动态获取列值的函数解决办法

2012-04-18 
求一动态获取列值的函数表数据网点名称期初余额本期发生北京10005000上海20006000求一个函数,输入的参数有

求一动态获取列值的函数
表数据

网点名称 期初余额 本期发生
北京 1000 5000
上海 2000 6000

求一个函数,输入的参数有 @网点名称,@字段名称
函数返回该@网点名称的@字段名称的值

如 udf_getvalue '北京','本期发生' 返回 5000

不用考虑输入列不存在的情况,返回类型为int,及从第二列开始的值




[解决办法]

SQL code
create table tggt(网点名称 varchar(20), 期初余额 int, 本期发生 int,g int)insert tggt select '北京', 1000, 5000,1union all select '上海', 2000, 6000,2goCREATE FUNCTION udf_getvalue(@v VARCHAR(20),@s VARCHAR(20))RETURNS VARCHAR(20)AS BEGIN    DECLARE @a TABLE(NAME VARCHAR(100),colid INT)    DECLARE @Str VARCHAR(1000)    DECLARE @Order INT ,@I INT         INSERT @a SELECT NAME,colid FROM syscolumns s WHERE id=OBJECT_ID('tggt')        SELECT @Order=[Order]     FROM (        SELECT NAME,[ORDER]=(SELECT COUNT(1) FROM @a WHERE colid<=a.colid) FROM @a a    ) aa    WHERE NAME=@s             SELECT @Str=ltrim(isnull(网点名称,0))+','+ltrim(isnull(期初余额,0))+','+ltrim(isnull(本期发生,0))+','+ltrim(isnull(g,0)) FROM tggt WHERE 网点名称=@v    SET @I=1    WHILE @I<@Order        SELECT @Str=STUFF(@Str,1,CHARINDEX(',',@Str),''),@I=@I+1        RETURN LEFT(@str,CHARINDEX(',',@Str+',')-1)ENDGO SELECT * FROM tggtSELECT dbo.udf_getvalue('北京','g')--result/*网点名称                 期初余额        本期发生        g           -------------------- ----------- ----------- ----------- 北京                   1000        5000        1上海                   2000        6000        2(所影响的行数为 2 行)                     -------------------- 1(所影响的行数为 1 行)*/
[解决办法]
SQL code
if object_id('udf_getvalue','FN') is not null    drop function udf_getvalue gocreate function udf_getvalue(@name varchar(20),@colname varchar(20))returns intasbegin    DECLARE @row varchar(1000)    SET @row = (SELECT * FROM tb where 网点名称 = @name FOR XML PATH)    return CAST(SUBSTRING(@row, CHARINDEX('<'+@colname+'>',@row)+LEN('<'+@colname+'>'), CHARINDEX('</'+@colname+'>',@row)-CHARINDEX('<'+@colname+'>',@row)-LEN('<'+@colname+'>') ) AS INT)endGOselect dbo.udf_getvalue('北京','本期发生'),dbo.udf_getvalue('上海','期初余额')            ----------- -----------5000        2000(1 行受影响) 

热点排行