Sql 更新表中的现有列,如上文所述。事实上,令人沮丧的是,我不知道如何获取它,因为我也不需要更改现有列,并且在年度发生变化时必须自动更改。编辑后,添加了一个脚本以更改表的列名 INS2017, INS2018, INS2019, INS2020 INS201
Sql 更新表中的现有列,如上文所述。事实上,令人沮丧的是,我不知道如何获取它,因为我也不需要更改现有列,并且在年度发生变化时必须自动更改。编辑后,添加了一个脚本以更改表的列名 INS2017, INS2018, INS2019, INS2020 INS201,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,更新表中的现有列,如上文所述。事实上,令人沮丧的是,我不知道如何获取它,因为我也不需要更改现有列,并且在年度发生变化时必须自动更改。编辑后,添加了一个脚本以更改表的列名 INS2017, INS2018, INS2019, INS2020 INS2017 to INS CY-3, INS2018 to INS CY-2, INS2019 to INS CY-1, INS2020 to INS CY, YEAR INSVALUE 2017 ? 2018 ? sele
更新表中的现有列,如上文所述。事实上,令人沮丧的是,我不知道如何获取它,因为我也不需要更改现有列,并且在年度发生变化时必须自动更改。编辑后,添加了一个脚本以更改表的列名
INS2017, INS2018, INS2019, INS2020
INS2017 to INS CY-3,
INS2018 to INS CY-2,
INS2019 to INS CY-1,
INS2020 to INS CY,
YEAR INSVALUE
2017 ?
2018 ?
select sum(case when t.year = v.yyyy then t.insvalue end) as ins_cy,
sum(case when t.year = v.yyyy - 1 then t.insvalue end) as ins_cy_1,
sum(case when t.year = v.yyyy then t.insvalue end) as ins_cy_2
from t cross join
(values (year(getdate())) v(yyyy);
create table dbo.INS_Sink_test
(
id int identity(1,1) constraint pk_id_ins_sink_test primary key clustered,
col1 int,
col2 int,
INS2010 int,
INS2011 int,
INS2012 int,
INS2013 int,
INS2014 int,
INS2015 int,
INS2016 int,
INS2017 int,
INS2018 int,
INS2019 int,
INS2020 int
)
go
insert into dbo.INS_Sink_test
(
col1, col2, INS2010, INS2011, INS2012, INS2013, INS2014, INS2015, INS2016, INS2017, INS2018, INS2019, INS2020
)
values
(1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4)
go
--create/adjust a view
declare @year smallint = year(getdate());
newyear:
declare @colssql nvarchar(max) = N'';
select @colssql = @colssql + N',' + quotename(name) + ' as ' + quotename(newcolname)
from
(
select column_id,
name,
case when name like 'INS[0-9][0-9][0-9][0-9]' then 'CY' + isnull(cast(nullif(cast(replace(name, 'INS', '') as smallint)-@year, 0) as sysname), '')
else name
end as newcolname
from sys.columns
where object_id = object_id('dbo.INS_Sink_test')
) as a
order by column_id;
declare @viewsql nvarchar(max) = N'view dbo.v_INS_Sink_test
as
select
' + stuff(@colssql, 1, 1, N'') + N'
from dbo.INS_Sink_test
';
select @viewsql = case when object_id('dbo.v_INS_Sink_test') is null then N'create' else N'alter' end + N' ' + @viewsql ;
--print @viewsql
exec(@viewsql);
--dont forget to refresh other views that depend on v_ins_sink_test
--exec sp_refreshview 'dbo.view_xyz';
exec sp_refreshview 'dbo.v_INS_Sink_test';
select @year as theyear;
select *
from dbo.INS_Sink_test;
select *
from dbo.v_INS_Sink_test;
if @year = 2021
begin
--cleanup
if object_id('dbo.INS_Sink_test') is not null
begin
drop table dbo.INS_Sink_test;
end
if object_id('dbo.v_INS_Sink_test') is not null
begin
drop view dbo.v_INS_Sink_test;
end
return;
end
--i know what you did in 2021..
select @year = 2021;
goto newyear
--cleanup
/*
if object_id('dbo.INS_Sink_test') is not null
begin
drop table dbo.INS_Sink_test;
end
if object_id('dbo.v_INS_Sink_test') is not null
begin
drop view dbo.v_INS_Sink_test;
end
*/
create table dbo.INS_Sink_test
(
id int identity(1,1) constraint pk_id_ins_sink_test primary key clustered,
col1 int,
col2 int,
INS2010 int,
INS2011 int,
INS2012 int,
INS2013 int,
INS2014 int,
INS2015 int,
INS2016 int,
INS2017 int,
INS2018 int,
INS2019 int,
INS2020 int
)
go
insert into dbo.INS_Sink_test
(
col1, col2, INS2010, INS2011, INS2012, INS2013, INS2014, INS2015, INS2016, INS2017, INS2018, INS2019, INS2020
)
values
(1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4)
go
select *
from dbo.INS_Sink_test
go
--rename columns
declare @year smallint = year(getdate());
declare @renamecolssql nvarchar(max) = N'';
select @renamecolssql = @renamecolssql + N'exec sp_rename ''' + quotename(object_schema_name(object_id)) + N'.' + quotename(object_name(object_id)) + N'.' + quotename(name) + ''', '+ quotename(newcolname) + '; '
from
(
select
object_id,
column_id,
name,
'INS CY' + isnull(cast(nullif(cast(replace(name, 'INS', '') as smallint)-@year, 0) as sysname), '') as newcolname
from sys.columns
where object_id = object_id('dbo.INS_Sink_test') --<-- change the name of the table
and name like 'INS[0-9][0-9][0-9][0-9]'
) as a
order by column_id;
exec(@renamecolssql);
go
select *
from dbo.INS_Sink_test
go
--cleanup
drop table dbo.INS_Sink_test
go