2012-02-16 61 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