日期:2014-05-17  浏览次数:20721 次

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的效果即可。


SQL code

--> 测试数据:[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 ALL
SELECT 1,'bb','S' UNION ALL
SELECT 1,'cc','D'
--------------开始查询--------------------------

SELECT * FROM [tb] PIVOT(MAX([status]) FOR [class] IN([aa],[bb],[cc])) as pit
----------------结果----------------------------
/* 
ID    aa    bb    cc
1    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
SQL code

alter TRIGGER tinsert_test1 ON [dbo].[test1] 
FOR INSERT
AS
begin
    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)
    end
end