SQL存储过程基于字段名传入的字符串拼接.

--定义存储过程.
Create PROCEDURE Usp_Static
    @tableName nvarchar(50),
    @groupCol nvarchar(50),    --分组字段.
    @staticCol nvarchar(50),    --统计字段.
    @showCol nvarchar(50),    --表头字段.
    @opera nvarchar(50)    --聚会函数.
AS
declare @SQL nvarchar(max), @proColumn nvarchar(50)    --存储游标执行的列.
execute ('Declare curCol Cursor for select distinct '+@showCol+' from '+@tableName+' for read only') --游标.
一,对于含有 "表名","字段"等的拼接,则需要通过字符串直接拼接(SQL中只支持单引号,表示字符串常量):
表字段有:FOrderNum(订单号),FGoodName(商品名),FOrderQuantity(数量),FCustomerName(用户名).
 
需求表达式:
selectFOrderNum, sum(FOrderQuantity)as[汇总].
写入表达式:
@SQL='select '+@groupCol+','+@opera+'('+@staticCol+') as [汇总]'
 
二,对于含有指定字符串常量(该常量是动态传递过来的).则需要"分割后再连接":
需求表达式:(电风扇是游标curCol获得的商品名)
1)列出需求,when'电风扇'then fileName elsenullEndas[电风扇]
2)字符转义,'when ''电风扇'' then fileName else null End as [电风扇]'
因为"商品名是动态传递过来的,所以进行分割:
'when ''|电风扇|'' then |fieldName| else null end) as [|电风扇|]'
第一个分割位置的前面是半截字符串,你当然得补上一个单引号了,后面是一个字符串变量,就直接+了
2)合并:
' when '''+@proColumn+''' then '+@staticCol+' else null End) as '+@proColumn
--其中,when后面的第一个单引号转义第二个单引号,第三个单引号为补充半截字符串.
 
案例二,根据字段名和对应的值查询.
(正确代码):目前发现,需要"分组,排序"等才能解决,如"order by","group by"等.
ALTER PROCEDURE USP_QueryT_AddressBookByField
    @FieldName nvarchar(20),    --字段名.
    @FieldVal nvarchar(50)    --字段对应的值.
AS
     SET NOCOUNT ON 
     declare @query nvarchar(max)
    set @query = 'select  [FId] as [编号],[FName] as [姓名],[FSex] as [性别],[FPhone] as [电话号码],[Fqq] as [QQ],
    [FWordPhone] as [国际电话号码],[FEMail] as [EMail],[FHandSet] as [手机号] from 
    [T_AddressBook] where '+@FieldName+'='''+@FieldVal+''' order by [FId]'
     exec(@query)

 

posted @ 2013-07-29 09:36  wonkju  阅读(1117)  评论(0编辑  收藏  举报