我正在编写一个存储过程,需要在该过程中动态构造一个SQL语句以引用传入的表名。
我需要让该SQL语句返回结果,然后可以在整个过程的其余部分中使用它。
我已经尝试过使用临时表和其他所有东西,但是我不断收到一条消息,我需要声明变量等。
例如:
DECLARE @FiscalYear INT DECLARE @DataSource NVARCHAR(25) DECLARE @SQL NVARCHAR(250) SELECT @DataSource = 'CustomerCosts20120328' DECLARE @tempFiscalYear TABLE ( FiscalYear INT ) SELECT @SQL = 'INSERT INTO @tempFiscalYear SELECT DISTINCT FiscalYear FROM ' + @DataSource EXEC(@SQL) SELECT @FiscalYear = FiscalYear FROM @tempFiscalYear
或者…
DECLARE @FiscalYear INT DECLARE @DataSource NVARCHAR(25) DECLARE @SQL NVARCHAR(250) SELECT @DataSource = 'CustomerCosts20120328' SELECT @SQL = 'SELECT DISTINCT @FiscalYear = FiscalYear FROM ' + @DataSource EXEC(@SQL)
无论如何,有没有这样做而不使用实际表?
谢谢。
您是否尝试过类似的方法:
DECLARE @FiscalYear INT, @DataSource NVARCHAR(25), @SQL NVARCHAR(250); SET @DataSource = N'CustomerCosts20120328'; SET @SQL = N'SELECT DISTINCT @FiscalYear = FiscalYear FROM ' + @DataSource; EXEC sp_executesql @SQL, N'@FiscalYear INT OUTPUT', @FiscalYear OUTPUT; PRINT @FiscalYear;
您需要确保将nvarchar字符串加N作为前缀,例如SELECT @SQL = N'SELECT ...。
SELECT @SQL = N'SELECT ...
另外,您知道如果查询返回多行,则分配给@FiscalYear它的值是完全任意的,对吗?虽然您可能期望该表中有一个单一值,但使用MAX()或TOP 1 ... ORDER BY确保仅分配一个可预测的值不会有什么坏处。
@FiscalYear
MAX()
TOP 1 ... ORDER BY