Tom*_*Tom 7 sql t-sql stored-procedures sql-server-2008
我正在编写一个存储过程,我需要在过程中动态构造一个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
Run Code Online (Sandbox Code Playgroud)
要么...
DECLARE @FiscalYear INT
DECLARE @DataSource NVARCHAR(25)
DECLARE @SQL NVARCHAR(250)
SELECT @DataSource = 'CustomerCosts20120328'
SELECT @SQL = 'SELECT DISTINCT @FiscalYear = FiscalYear FROM ' + @DataSource
EXEC(@SQL)
Run Code Online (Sandbox Code Playgroud)
无论如何不使用实际表格来做到这一点?
谢谢.
你尝试过这样的事情:
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;
Run Code Online (Sandbox Code Playgroud)
您需要确保在nvarchar字符串前加上N,例如SELECT @SQL = N'SELECT ....
此外,您知道如果查询返回多行,则分配给的@FiscalYear值完全是任意的,对吧?虽然您可能期望该表中的单个值,但使用MAX()或TOP 1 ... ORDER BY确保只分配一个可预测的值并不会有什么坏处.
首先,您需要知道使用动态SQL会冒SQL注入攻击的风险,在使用它之前,您应首先查看此链接.执行此操作后,您可以将第一个查询更改为:
DECLARE @FiscalYear INT
DECLARE @DataSource NVARCHAR(25)
DECLARE @SQL NVARCHAR(250)
SELECT @DataSource = 'CustomerCosts20120328'
DECLARE @tempFiscalYear TABLE ( FiscalYear INT )
SELECT @SQL = 'SELECT DISTINCT FiscalYear FROM ' + @DataSource
INSERT INTO @tempFiscalYear
EXEC(@SQL)
SELECT @FiscalYear = FiscalYear FROM @tempFiscalYear
Run Code Online (Sandbox Code Playgroud)
您还应该考虑@AaronBertrand对@FiscalYear参数赋值的评论.