一种通用存储过程,可以将任何源表名作为参数并合并到目标表

时间:2016-06-17 21:07:02

标签: sql-server

这是我的代码。

Create Procedure Merge_tables 
     @tablename varchar(20)
As
    create table temp1 ( column_name varchar(20) )

    insert into temp1 (column_name)
        select Column_Name 
        from INFORMATION_SCHEMA.COLUMNS 
        where TABLE_NAME = 'result'

        intersect

        select Column_Name 
        from INFORMATION_SCHEMA.COLUMNS 
        where TABLE_NAME = '@tablename'

    Declare @name varchar(max)
    Declare @concat varchar(max)

    set @concat = ''

    while (select COUNT(*) from temp1)>0
    Begin 
        set @name = (select top 1 * from temp1)
        set @concat = @concat + @name + ','

        select @concat as combined

        delete temp1 where temp1.column_name = @name
    End

    Merge result as T 
    using @tablename as S on T.TXN_KEY = S.TXN_KEY 

    when not matched then 
       insert ('+@concat+') values ('+@concat+') 
    when matched then 
       update set T.TXN_KEY = S.TXN_KEY(?) 

表temp1存储公共列名。只有特定的东西才能匹配TXN_KEY。休息一切都是通用的。在while循环结束时,@ concat的组合列名用逗号分隔。

我在merge语句中得到的错误是:

  

Msg 207,Level 16,State 1,Line 17
  列名称无效' + @ concat +'

此外,要使更新语句工作@concat,需要将字符串拆分为各个列的设置值。我一直试图破解这一段时间。

提前致谢。

2 个答案:

答案 0 :(得分:2)

好的,你必须传递目标表和源表,以定义主键。这有效,我已经测试了很多。

while ((ch = getopt(argc, argv, "s:E:")) != -1)

答案 1 :(得分:0)

1)首先为什么需要INTERSECT?

2)其次没有任何东西会插入temp1,因为你说WHERE
   TABLE_NAME ='@ tablename'。永远不会有表名@tablename。    将其更改为WHERE TABLE_NAME =''+ @tablename +''

3)'+ @ concat +'也需要''+ @concat +''

4)我真的认为merge语句需要在Dynamic SQL中,你可以拆分@concat列。