sqlserver存储过程中如何把字段用变量代替
我有一张变test1,里面有ID,class,status,3个字段,表test2,有ID,aa,bb,cc,3个字段,
test1
ID class status
1 aa F
1 bb S
1 cc D
现在我想在表test1插入数据的时候,通过存储过程给表test2插入数据,把表test1中class字段中的资料,当成表test2中的字段,把表test1中的status的数据放到表test2中对应的aa,bb,cc字段下如
test2
ID aa bb cc
1 F S D
现在我不知道怎么把表test1中class的数据当成表test2的字段啊,求大神指教啊!
[解决办法]
如果你一次插入三条,然后将这三条刚好对应test2的三个字段
如果你一次只插入一条呢?
所以我觉得test2 不应该是一个物理表
只是在你需要的时候讲test1的数据转换成test2的效果即可。
--> 测试数据:[tb]IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]GO CREATE TABLE [tb]([ID] INT,[class] VARCHAR(2),[status] VARCHAR(1))INSERT [tb]SELECT 1,'aa','F' UNION ALLSELECT 1,'bb','S' UNION ALLSELECT 1,'cc','D'--------------开始查询--------------------------SELECT * FROM [tb] PIVOT(MAX([status]) FOR [class] IN([aa],[bb],[cc])) as pit----------------结果----------------------------/* ID aa bb cc1 F S D*/
[解决办法]
DECLARE @t1 table
(
id int,
class varchar(50),
[status] varchar(50)
)
INSERT INTO @t1
SELECT 1,'aa','F'
UNION
SELECT 1,'bb','S'
UNION
SELECT 1,'cc','D'
SELECT
MAX(CASE WHEN class = 'aa' THEN [status] ELSE NULL END) 'aa',
MAX(CASE WHEN class = 'bb' THEN [status] ELSE NULL END) 'bb',
MAX(CASE WHEN class = 'cc' THEN [status] ELSE NULL END) 'cc'
FROM @t1
行列转换,动态拼接SQL,拼接SQL时应该使用临时表,拼接SQL中的表变量无法和外面交互
[解决办法]
--一次只插入一行,可以用下面的触发器,需要用动态sql
alter TRIGGER tinsert_test1 ON [dbo].[test1] FOR INSERTASbegin declare @sql varchar(200) declare @col_name varchar(20) declare @id int declare @status varchar(10) --存在相同id更新 if exists(select 1 from test2,inserted where test2.id = inserted.id ) begin select @col_name = class,@id = id,@status = status from inserted select @sql = 'update test2 set ' + @col_name+' = '''+@status+''' where id = '+cast(@id as varchar) + '' exec(@sql) end else begin select @col_name = class,@id = id,@status = status from inserted --没有相同id先插入id insert into test2(id) select id from inserted --再更新值 select @col_name = class,@id = id,@status = status from inserted select @sql = 'update test2 set ' + @col_name+' = '''+@status+''' where id = '+cast(@id as varchar) + '' exec(@sql) endend