2012-02-16 63 views
0

我想我的第一个动态SQL存储过程。我需要将相同的记录追加到具有相同列名的多个表中。我编译了什么,但是当它运行时,我得到'无效列名'TradeDate。驱动程序sproc首先在下面,然后是包含动态语句的sproc。如果有人可以帮助,那简直太好了..动态SQL插入返回'无效列名'

ALTER PROCEDURE dbo.StoredProcedure2 

AS 

DECLARE @tableName varchar(120) 
SET @tableName = 'tblDailyATR' 
EXEC sprocAddDatesAndSymbolsToAggregatedStudy @tableName 

RETURN 

ALTER PROCEDURE dbo.sprocAddDatesAndSymbolsToAggregatedStudy 
    @table varchar(120) 

AS 

DECLARE @tableName varchar(120) 
SET @tableName = @table 

EXEC(
'INSERT INTO ' + @tableName + '(Symbol, TradeDate) 
SELECT Symbol, TradingDate 
FROM (SELECT tblSymbolsMain.Symbol, tblTradingDays.TradingDate 
     FROM tblSymbolsMain CROSS JOIN tblTradingDays 
     WHERE (tblTradingDays.TradingDate <= dbo.NextAvailableDataDownloadDate())) AS T1 
     WHERE (NOT EXISTS (SELECT TradeDate, Symbol 
     FROM' + @tableName + 
     ' WHERE (TradeDate = T1.TradingDate) AND (Symbol = T1.Symbol)))') 

RETURN 
+1

关于插入,我不知道你的表是什么样子,但它有可能是'TradingDate'而不是'TradeDate'? – peroija 2012-02-16 21:15:31

+1

和动态sql一样,输出到一个变量,粘贴到SSMS中,并在那里调试。 – JNK 2012-02-16 21:16:24

+1

使用'DECLARE @sql NVARCHAR(MAX)= N''''然后将SQL分配给它。当它通过'PRINT'看起来很开心,然后将它传递给'EXEC sp_executesql',而不是'EXEC();' - 这是为什么:http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/17/bad-习惯使用exec执行代替sp执行sql.aspx – 2012-02-16 21:21:52

回答

2

你之后该行的 “FROM” 缺少空间:

FROM' + @tableName + 

应该

FROM ' + @tableName + 

否则,它会尝试运行SELECT FROMTABLE。

+0

谢谢。那样做......我发誓我检查了这样的事情。 :) – StatsViaCsh 2012-02-16 21:22:16

+0

没有问题。接受,如果它的工作,请。 :) – 2012-02-16 21:22:49

+0

@ EXEC()之前的@StatsViaCsh''你应该做'PRINT();'这样你就可以验证你的动态查询了.. – 2012-04-07 06:42:00