我正在编写一个存储过程,我需要在过程中动态构造一个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 ….
另外,您知道如果查询返回多行,则分配给@FiscalYear的值完全是任意的,对吧?虽然您可能期望该表中的单个值,但使用MAX()或TOP 1 … ORDER BY来确保只分配一个可预测的值是不会有害的.