TSQL:如何使查询的一部分动态化,例如表的名称?

时间:2016-08-19 14:33:47

标签: sql-server tsql

应用程序的表格附有年份,即HiredEmpl2013, HiredEmpl2014, HiredEmpl2015。问题是每年都有人需要进行这些更改,即使是简单的查询,例如

SELECT EmpID, FName, LName, ...
FROM HiredEmpl2013

我尝试过像

这样的东西
DECLARE @year INT,
        @table_source VARCHAR(50)
SET @year = 2013
SET @table_source = 'HiredEmpl' + CAST(@year AS CHAR(4))

SELECT EmpID, FName, LName, ...
FROM @table_source

我收到此错误:Must declare the table variable "@table_source".

有没有办法让查询动态化?

感谢您的帮助

更新

我已经使用EXEC动态计算表中的计数。

EXEC(sql) ---> 297

我试图保存该值,但是我收到了一个错误:

SET @total = EXEC(@sql) --> Incorrect syntax near the keyword 'EXEC'.

3 个答案:

答案 0 :(得分:1)

你快到了..

使用动态sql ..

DECLARE @year INT,
        @table_source VARCHAR(50)
SET @year = 2013
SET @table_source = 'HiredEmpl' + CAST(@year AS CHAR(4))

declare @sql nvarchar(max)='SELECT EmpID, FName, LName FROM '+@table_source

print @sql

--exec(@SQl)

答案 1 :(得分:1)

您不希望使用想要在应用程序中使用静态查询的动态查询。您希望尽可能少地更改内容,并且非动态查询很容易让服务器进行优化。

解决此问题的最佳方法是更改​​模型并创建一个以年份为列的表格。通常人们会抵制这种变化 - 但我不得不说这是最好的选择。

作为强势的第二个观看今年的观点:

CREATE VIEW HiredEmplCurrent as 
  SELECT EmpID, FName, LName, ...
  FROM HiredEmpl2016_YEAR 

然后更改所有访问以使用HiredEmplCurrent,每年一次,您只需更改视图。

答案 2 :(得分:1)

使用sp_executesql以便您可以传递输出参数。 以下将给出该表的计数。

DECLARE @year INT,
        @table_source VARCHAR(50),
       @CNT INT 

DECLARE @ParmDefinition nvarchar(500);

SET @year = 2013
SET @table_source = 'HiredEmpl' + CAST(@year AS CHAR(4))


declare @SQLString nvarchar(max)='SELECT @CNT1 = count(*) FROM ' + @table_source ;

SET @ParmDefinition = N'  @CNT1 INT OUTPUT'; 

--print @SQLString

EXECUTE sp_executesql @SQLString, @ParmDefinition, @CNT1 = @CNT OUTPUT;  

SELECT @CNT;