从视图中的动态表名称中选择

时间:2019-02-07 12:51:26

标签: sql sql-server tsql

我的客户每年创建一个新表,其中包含要在我的SQL Server数据库新视图中使用的名称中的年份。 我已经通过一个查询解决了这个问题:

DECLARE @SQLString nvarchar(500)
SET @SQLString = 'SELECT * FROM [MYDATABASE].[dbo].[MYTABLE_'+cast(YEAR(GETDATE()) as varchar(4))+']'
EXECUTE sp_executesql @SQLString

但是我不能在视图中使用execute语句。我也尝试将其移至函数,但问题是相同的。 ¿我该怎么办?

谢谢。

2 个答案:

答案 0 :(得分:0)

我不知道这是否适合您,但是您可以动态创建视图本身。像这样:

declare @sql varchar(1000)
,@sql2 varchar(1000)

set @sql = ('create view x as select * from MyTable_' + convert(varchar(10),year(getdate())) + ' go')

set @sql2 = 'select * from x'

exec (@sql)
exec (@sql2)

答案 1 :(得分:0)

由于视图仅引用“最新”表,因此可以使用同义词引用该表:

create synonym dbo.CurrentYearVendorTable for dbo.VendorStuffFor2019;

create view dbo.MyView as
  select *
    from dbo.CurrentYearVendorTable; -- Note: Reference to synonym, not table.

创建新表后,替换同义词并更新视图:

drop synonym dbo.CurrentYearVendorTable;
create synonym dbo.CurrentYearVendorTable for dbo.VendorStuffFor2020;
execute sp_refreshview @viewname = 'dbo.MyView';

对于其他用途,可能只需要在查询中使用同义词即可。

相关问题