数据库:(分别为英文表名称、中文表名称、英文字段、中文字段)其中都没有重复值
ENBMC CNBMC ENZD CNZD
A001 人员表 C0001 年龄
A001 人员表 C0002 出生日期
A002 学历表 C0003 学历
A003 工资表 C0004 技能等级
A003 工资表 C0005 技能工资
A004 奖金表 C0006 奖金指数
A004 奖金表 C0007 综合奖
A004 奖金表 C0008 节日奖
....
请问用存储过程怎么实现将:
~人员表.年龄~ := year(Getdate()) - year(~人员表.出生日期~)
if ~工资表.技能等级~ = '15' ~工资表.技能工资~ := 258 endif
if ~工资表.技能等级~ = '16' ~工资表.技能工资~ := 280 endif
if ~工资表.技能等级~ = '17' ~工资表.技能工资~ := 298 endif
if ~工资表.技能等级~ = '18' ~工资表.技能工资~ := 310 endif
if ~工资表.技能等级~ = '19' ~工资表.技能工资~ := 325 endif
...(还有好多1-42级)
~奖金表.综合奖~ := ~奖金表.奖金指数~ * 1000
转变为:
A001.C0001 := year(Getdate) - year(A001.C0002)
if A003.C0004 = '15' A003.C0005 := 258 endif
if A003.C0004 = '16' A003.C0005 := 280 endif
if A003.C0004 = '17' A003.C0005 := 298 endif
if A003.C0004 = '18' A003.C0005 := 310 endif
if A003.C0004 = '19' A003.C0005 := 325 endif
....(还有好多1-42级)
A004.C0007 := A004.C0006 * 1000
又怎么用存储过程转变为:
update A001 set A001.C0001 = year(Getdate()) - year(A001.C0002)
update A003 set A003.C0005 = 258 where A003.C0004 = '15'
update A003 set A003.C0005 = 280 where A003.C0004 = '16'
update A003 set A003.C0005 = 298 where A003.C0004 = '17'
update A003 set A003.C0005 = 310 where A003.C0004 = '18'
update A003 set A003.C0005 = 325 where A003.C0004 = '19'
....(还有好多1-42级)
update A004 set A004.C0007 = A004.C0006 * 1000急!谢谢!
ENBMC CNBMC ENZD CNZD
A001 人员表 C0001 年龄
A001 人员表 C0002 出生日期
A002 学历表 C0003 学历
A003 工资表 C0004 技能等级
A003 工资表 C0005 技能工资
A004 奖金表 C0006 奖金指数
A004 奖金表 C0007 综合奖
A004 奖金表 C0008 节日奖
....
请问用存储过程怎么实现将:
~人员表.年龄~ := year(Getdate()) - year(~人员表.出生日期~)
if ~工资表.技能等级~ = '15' ~工资表.技能工资~ := 258 endif
if ~工资表.技能等级~ = '16' ~工资表.技能工资~ := 280 endif
if ~工资表.技能等级~ = '17' ~工资表.技能工资~ := 298 endif
if ~工资表.技能等级~ = '18' ~工资表.技能工资~ := 310 endif
if ~工资表.技能等级~ = '19' ~工资表.技能工资~ := 325 endif
...(还有好多1-42级)
~奖金表.综合奖~ := ~奖金表.奖金指数~ * 1000
转变为:
A001.C0001 := year(Getdate) - year(A001.C0002)
if A003.C0004 = '15' A003.C0005 := 258 endif
if A003.C0004 = '16' A003.C0005 := 280 endif
if A003.C0004 = '17' A003.C0005 := 298 endif
if A003.C0004 = '18' A003.C0005 := 310 endif
if A003.C0004 = '19' A003.C0005 := 325 endif
....(还有好多1-42级)
A004.C0007 := A004.C0006 * 1000
又怎么用存储过程转变为:
update A001 set A001.C0001 = year(Getdate()) - year(A001.C0002)
update A003 set A003.C0005 = 258 where A003.C0004 = '15'
update A003 set A003.C0005 = 280 where A003.C0004 = '16'
update A003 set A003.C0005 = 298 where A003.C0004 = '17'
update A003 set A003.C0005 = 310 where A003.C0004 = '18'
update A003 set A003.C0005 = 325 where A003.C0004 = '19'
....(还有好多1-42级)
update A004 set A004.C0007 = A004.C0006 * 1000急!谢谢!
下例用 xxx 替换 abcdefghi 中的字符串 cde。SELECT REPLACE('abcdefghicde','cde','xxx')
GO下面是结果集:------------
abxxxfghixxx
(1 row(s) affected)
GO-- 示例数据
CREATE TABLE t1(ENBMC sysname, CNBMC sysname, ENZD sysname, CNZD sysname)
INSERT t1 SELECT 'A001','人员表','C0001','年龄'
INSERT t1 SELECT 'A001','人员表','C0002','出生日期'
INSERT t1 SELECT 'A002','学历表','C0003','学历'
INSERT t1 SELECT 'A003','工资表','C0004','技能等级'
INSERT t1 SELECT 'A003','工资表','C0005','技能工资'
INSERT t1 SELECT 'A004','奖金表','C0006','奖金指数'
INSERT t1 SELECT 'A004','奖金表','C0007','综合奖'
INSERT t1 SELECT 'A004','奖金表','C0008','节日奖'CREATE TABLE t2(col nvarchar(500))
INSERT t2 SELECT N'~人员表.年龄~ := year(Getdate()) - year(~人员表.出生日期~)' UNION ALL
SELECT N'if ~工资表.技能等级~ = ''15'' ~工资表.技能工资~ := 258 endif' UNION ALL
SELECT N'if ~工资表.技能等级~ = ''16'' ~工资表.技能工资~ := 280 endif' UNION ALL
SELECT N'if ~工资表.技能等级~ = ''17'' ~工资表.技能工资~ := 298 endif' UNION ALL
SELECT N'if ~工资表.技能等级~ = ''18'' ~工资表.技能工资~ := 310 endif' UNION ALL
SELECT N'if ~工资表.技能等级~ = ''19'' ~工资表.技能工资~ := 325 endif'
GO-- 替换函数
CREATE FUNCTION dbo.f_replace(
@col nvarchar(500)
)RETURNS nvarchar(500)
AS
BEGIN
SELECT @col = REPLACE(@col, CN, EN)
FROM(
SELECT
CN = N'~' + CNBMC + N'.' + CNZD + N'~',
EN = QUOTENAME(ENBMC) + N'.' + QUOTENAME(ENZD)
FROM t1
) t1
RETURN(@col)
END
GO-- 处理语句函数
CREATE FUNCTION dbo.f_sql(
@col nvarchar(500)
)RETURNS nvarchar(4000)
AS
BEGIN
DECLARE @tbname sysname, @sql nvarchar(4000)
SET @sql = N'UPDATE '
IF @col LIKE 'if % endif'
BEGIN
DECLARE @fd nvarchar(1000)
SELECT
@col = SUBSTRING(@col, 4, LEN(@col) - 9),
@fd = STUFF(@col, 1, PATINDEX(N'% [[]%].[[]%]%%', @col), N''),
@col = LEFT(@col, LEN(@col) - LEN(@fd)),
@tbname = LEFT(@col, CHARINDEX(N'].[', @col)),
@col = STUFF(@col, 1, LEN(@tbname) + 1, N''),
@sql = @sql + @tbname + N' SET ' + @fd + N' WHERE ' + @col
END
ELSE
BEGIN
SELECT
@tbname = LEFT(@col, CHARINDEX(N'].[', @col) ),
@col = STUFF(@col, 1, LEN(@tbname) + 1, N''),
@sql = @sql + @tbname + N' SET ' + @col
END
RETURN(REPLACE(@sql, N':=', N'='))
END
GO-- 处理的存储过程
CREATE PROC dbo.p_cal
AS
-- 显示名称替换后的结果
SELECT *, newcol = dbo.f_replace(col)
FROM t2-- 计算
DECLARE @sql nvarchar(4000)
DECLARE tb CURSOR LOCAL
FOR
SELECT
dbo.f_sql(dbo.f_replace(col))
FROM t2
OPEN tb
FETCH tb INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT(@sql)
-- EXEC(@sql)
FETCH tb INTO @sql
END
CLOSE tb
DEALLOCATE tb
GO-- 调用
EXEC dbo.p_cal
GODROP TABLE t1, t2
DROP FUNCTION dbo.f_replace, dbo.f_sql
DROP PROC dbo.p_cal