Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新表中的现有列,如上文所述。事实上,令人沮丧的是,我不知道如何获取它,因为我也不需要更改现有列,并且在年度发生变化时必须自动更改。编辑后,添加了一个脚本以更改表的列名 INS2017, INS2018, INS2019, INS2020 INS201_Sql_Sql Server_Stored Procedures - Fatal编程技术网

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