我有一个表变量(@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
并在连接中使用它?
答案 0 :(得分:0)
表名和列名不能是动态的。他们需要保持静止
您需要在此处使用动态SQL
了解更多关于
的信息答案 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