我想建立一个存储过程,比较通用的那种.
可以更新不定个列,比如:tb1表有3个列 ID,Name,Age
用户可以只更新ID,Name,Age其中任何一列,或者其中任何2列,或者是3列一起更新
(这样的话是不是必须写多个存储过程来实现,我想用一个存储过程来实现).
希望大虾不吝赐教!谢谢

解决方案 »

  1.   

    先声明几个长点的字符串变量然后把变量副值为SQL语句然后依次执行这些SQL语句,例子给你个,看下把
    CREATE PROCEDURE JCGL_GetCheckExamineInfoWithPage
    (
    @n_op_code INT,
    @station_id INT,
    @date_on int,
    @date_off int,--numeric(8),
    @PageSize INT,
    @PageIndex INT,
    @RowCount INT
    )
    AS
    DECLARE @SQL VARCHAR(3000)
    DECLARE @SubWhere VARCHAR(2000)SET @SQL=''
    SET @SubWhere=''IF @date_on<>0 AND @date_on IS NOT NULL
    SET @SubWhere=@SubWhere+' AND A.n_examine_date>='+CONVERT(VARCHAR(10),@date_on)IF @date_off<>0 AND @date_off IS NOT NULL
    SET @SubWhere=@SubWhere+' AND A.n_examine_date<='+CONVERT(VARCHAR(10),@date_off)IF @n_op_code<>0 AND @n_op_code IS NOT NULL
    SET @SubWhere=@SubWhere+' AND n_emplooey_id='+ CONVERT(VARCHAR(15),@n_op_code)IF @station_id<>0 AND @station_id IS NOT NULL
    SET @SubWhere=@SubWhere+' AND B.n_station_id='+ CONVERT(VARCHAR(15),@station_id) SET @SubWhere=@SubWhere +' AND n_examine_check=1 '
    DECLARE @PageCount  INT--计算总页数
    SET @PageCount=CASE WHEN @RowCount%@PageSize=0 THEN @RowCount/@PageSize ELSE @RowCount/@PageSize+1 END
    --第一页
    IF @PageIndex=1 
    BEGIN
    SET @SQL='
    SELECT TOP '+CONVERT(VARCHAR(15),@PageSize)+' 
    A.n_id,
    A.n_department,
    A.n_emplooey_id,
    D.c_op_name as v_name,
    A.v_deduct_cause,
    A.f_deduct_value,
    A.n_deduct_price,
    A.v_add_cause,
    A.f_add_value,
    A.n_add_price,
    A.n_station_id,
    A.n_examine_date,
    B.vc_station_name 
    FROM JCGL_CheckExamine AS A
    INNER JOIN station AS B ON A.n_station_id=B.n_station_id
    INNER JOIN operator AS D ON D.n_op_code=n_emplooey_id
    WHERE 1=1 
    '+ @SubWhere+' ORDER BY A.N_ID DESC  
     ' END
    ELSE 
    BEGIN
    --最后一页
    IF @PageIndex>=@PageCount OR @PageIndex=-1 BEGIN
    SET @SQL='
    SELECT TOP '+CONVERT(VARCHAR(15),@PageSize)+'
    A.n_id,
    A.n_department,
    A.n_emplooey_id,
    A.v_name,
    A.v_deduct_cause,
    A.f_deduct_value,
    A.n_deduct_price,
    A.v_add_cause,
    A.f_add_value,
    A.n_add_price,
    A.n_station_id,
    A.n_examine_date,
    A.vc_station_name
    FROM (
    SELECT TOP '+CONVERT(VARCHAR(15),CASE WHEN @RowCount%@PageSize=0 THEN @PageSize ELSE @RowCount%@PageSize END )+' 
    A.n_id,
    A.n_department,
    A.n_emplooey_id,
    D.c_op_name as v_name,
    A.v_deduct_cause,
    A.f_deduct_value,
    A.n_deduct_price,
    A.v_add_cause,
    A.f_add_value,
    A.n_add_price,
    A.n_station_id,
    A.n_examine_date,
    B.vc_station_name 
    FROM JCGL_CheckExamine AS A
    INNER JOIN station AS B ON A.n_station_id=B.n_station_id
    INNER JOIN operator AS D ON D.n_op_code=n_emplooey_id
    WHERE 1=1 '+ @SubWhere+' ORDER BY A.N_ID ASC
    )AS A
    ORDER BY A.N_ID DESC ' 

    END
    ELSE
    BEGIN
    --中间页(上)
    IF @PageIndex>1 AND @PageIndex<=@PageCount/2+1
    BEGIN
    SET @SQL='
    SELECT TOP '+CONVERT(VARCHAR(15),@PageSize)+' 
    A.n_id,
    A.n_department,
    A.n_emplooey_id,
    A.v_name,
    A.v_deduct_cause,
    A.f_deduct_value,
    A.n_deduct_price,
    A.v_add_cause,
    A.f_add_value,
    A.n_add_price,
    A.n_station_id,
    A.n_examine_date,
    A.vc_station_name
    FROM (
    SELECT TOP '+CONVERT(VARCHAR(15),@PageSize)+' 
    A.n_id,
    A.n_department,
    A.n_emplooey_id,
    A.v_name,
    A.v_deduct_cause,
    A.f_deduct_value,
    A.n_deduct_price,
    A.v_add_cause,
    A.f_add_value,
    A.n_add_price,
    A.n_station_id,
    A.n_examine_date,
    A.vc_station_name 
    FROM (
    SELECT TOP '+CONVERT(VARCHAR(15),@PageSize*@PageIndex)+' 
    A.n_id,
    A.n_department,
    A.n_emplooey_id,
    D.c_op_name as v_name,
    A.v_deduct_cause,
    A.f_deduct_value,
    A.n_deduct_price,
    A.v_add_cause,
    A.f_add_value, A.n_add_price,
    A.n_station_id,
    A.n_examine_date ,
    B.vc_station_name 
    FROM JCGL_CheckExamine AS A
    INNER JOIN station AS B ON A.n_station_id=B.n_station_id
    INNER JOIN operator AS D ON D.n_op_code=n_emplooey_id
    WHERE 1=1 '+ @SubWhere+' ORDER BY A.N_ID DESC
         )  AS A ORDER BY A.N_ID ASC
    ) AS A
    ORDER BY A.N_ID DESC'

     
    END
    ELSE
    --中间页(下)
    BEGIN
    SET @SQL='
    SELECT TOP '+CONVERT(VARCHAR(15),@PageSize)+' 
    A.n_id,
    A.n_department,
    A.n_emplooey_id,
    A.v_name,
    A.v_deduct_cause,
    A.f_deduct_value,
    A.n_deduct_price,
    A.v_add_cause,
    A.f_add_value,
    A.n_add_price,
    A.n_station_id,
    A.n_examine_date,
    A.vc_station_name
    FROM (
    SELECT TOP '+CONVERT(VARCHAR(15),@PageSize)+' 
    A.n_id,
    A.n_department,
    A.n_emplooey_id,
    A.v_name,
    A.v_deduct_cause,
    A.f_deduct_value,
    A.n_deduct_price,
    A.v_add_cause,
    A.f_add_value,
    A.n_add_price,
    A.n_station_id,
    A.n_examine_date,
    A.vc_station_name
    FROM (
    SELECT TOP '+CONVERT(VARCHAR(15),@rowCount - @pageSize * @pageIndex+@pageSize)+' 
    A.n_id,
    A.n_department,
    A.n_emplooey_id,
    D.c_op_name as v_name,
    A.v_deduct_cause,
    A.f_deduct_value,
    A.n_deduct_price,
    A.v_add_cause,
    A.f_add_value,
    A.n_add_price,
    A.n_station_id,
    A.n_examine_date ,
    B.vc_station_name 
    FROM JCGL_CheckExamine AS A
    INNER JOIN station AS B ON A.n_station_id=B.n_station_id
    INNER JOIN operator AS D ON D.n_op_code=n_emplooey_id
    WHERE 1=1 '+ @SubWhere+' ORDER BY A.N_ID ASC  
         )  AS A ORDER BY A.N_ID DESC
    ) AS A
    ORDER BY A.N_ID DESC '


    END
    END
    END
    EXEC (@SQL)GO
      

  2.   

    最后的结尾有个EXEC(@SQL)就是执行SQL的,多个SQL也是一样
      

  3.   

    --建立通用存储过程
    create proc my_proc(
    @tbName sysname,--表名
    @columns varchar(500),--字段名,用","隔开.如'a,b'
    @values varchar(5000),--字段的更新值,必须要上面的字段列表一一对应,用","隔开.注意,不管值是什么类型都不必单独加单引号,直接写在一个单引号下面如:'12,sab'
    @where varchar(1000)=null--where条件.如:"a=3".只支持单表更新.不支持多表关联后更新.
    )
    as
    declare @sql varchar(8000),@tempColumn varchar(50),@tempValue varchar(500)
    select @sql='',@tempColumn='',@tempValue=''
    while(charindex(',',@columns)>0)
    begin
    set @tempColumn=substring(@columns,1,charindex(',',@columns)-1)
    set @tempValue=substring(@values,1,charindex(',',@values)-1)
    set @sql=@sql+','+@tempColumn+'='''+@tempValue+''''
    set @columns=stuff(@columns,1,charindex(',',@columns),'')
    set @values=stuff(@values,1,charindex(',',@values),'')
    end
    set @tempColumn=@columns
    set @tempValue=@values
    set @sql=@sql+','+@tempColumn+'='''+@tempValue+''''
    set @sql='update '+@tbName+stuff(@sql,1,1,' set ')+' where '+isnull(@where,'1=1')
    exec(@sql)
    ----------------测试
    --建立测试表
    create table test(a int,b varchar(10),c int)
    insert into test select 1,'woaini',3
    --测试
    select * from test
    exec my_proc 'test','a,b','12,xiashuo','1=1'
    select * from test
    --结果
    a           b          c           
    ----------- ---------- ----------- 
    1           woaini     3(所影响的行数为 1 行)
    (所影响的行数为 1 行)a           b          c           
    ----------- ---------- ----------- 
    12          xiashuo    3(所影响的行数为 1 行)
    --删除测试
    drop table test
    drop proc my_proc