从同一个表变量更新表变量?

时间:2014-03-27 12:10:36

标签: sql-server join sql-server-2012

我有一个表变量(@t_var),如下所示:

[RSIN]    [Grp]
 S-000001   1
 S-000002   2
 S-000003   1
 C-000002  null
 C-000003  null

我需要根据 [Grp] 设置 [Grp] “C” -types “S”< / strong> - 具有相应权利部分的类型。最后我应该这样:

[RSIN]    [Grp]
 S-000001   1
 S-000002   2
 S-000003   1
 C-000002   2
 C-000003   1

我试图做的最明显的方式:

UPDATE    @t_var
SET       [Grp] = B.[Grp]
FROM      @t_var A
LEFT JOIN @t_var B
       ON 'C'+RIGHT(A.[RSIN], 7) = B.[RSIN]
WHERE     LEFT(A.[RSIN],1) = 'S' 

但是管理工作室告诉我一些关于它无法区分使用哪个@t_var。当我们谈论物理表时,这个结构工作正常,但是当涉及表变量时拒绝工作。

是否有任何优雅的解决方法,但要创建重复的表变量,如@t_var2并在连接中使用它?

3 个答案:

答案 0 :(得分:0)

表名和列名不能是动态的。他们需要保持静止

您需要在此处使用动态SQL

了解更多关于

的信息
  1. Building Dynamic SQL In a Stored Procedure
  2. The Curse and Blessings of Dynamic SQL
  3. sp_executesql
  4. 锄头有帮助

答案 1 :(得分:0)

UPDATE @t_var
SET [Grp] = CASE WHEN LEFT([RSIN], 1) = 'C'
                      AND RIGHT([RSIN], 1) = '2'
                 THEN 2
                 WHEN LEFT([RSIN], 1) = 'C'
                      AND ( RIGHT([RSIN], 1) = '1'
                         OR 
                         RIGHT([RSIN], 1) = '3' )
                 THEN 1
             END

答案 2 :(得分:0)

declare @t_var table (RSIN char(8), Grp int);

insert @t_var
values 
  ('S-000001', 1),
  ('S-000002', 2),
  ('S-000003', 1),
  ('C-000002', null),
  ('C-000003', null)

;with x as (
    select b.rsin, a.grp, b.grp as prev
    from @t_var a
    inner join @t_var b on 'c'+right(a.[rsin], 7) = b.[rsin]
    where left(a.[rsin],1) = 's' 
)
update x
set prev = grp

select * from @t_var