数据库:(分别为英文表名称、中文表名称、英文字段、中文字段)其中都没有重复值
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急!谢谢!

解决方案 »

  1.   

    简单啊,替换就行了示例
    下例用 xxx 替换 abcdefghi 中的字符串 cde。SELECT REPLACE('abcdefghicde','cde','xxx')
    GO下面是结果集:------------
    abxxxfghixxx
    (1 row(s) affected)
      

  2.   

    USE tempdb
    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