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