应用程序的表格附有年份,即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'.
答案 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;