2012-03-20 88 views
0

我有一堆CSV文件要導入,所以我已經用XML創建了BCPFORMAT文件。這些都運行良好,我可以正確導入數據。使用變量SQL Server SP'語法錯誤'錯誤

現在我試圖創建一個接受三個參數的存儲過程(這是我從來沒有做過):
1.表名
2到CSV文件的路徑
3.路徑BCPFORMAT文件

CREATE PROC dbo.usp_import_csv 
    @table_name nvarchar(100),  /* name of table to import into */ 
    @csv_path nvarchar(1000),  /* path to csv file */ 
    @bcp_format_path nvarchar(1000) /* path to BCPFORMAT file */ 
AS 
BEGIN 
    DELETE FROM @table_name 
    BULK INSERT @table_name 
     FROM @csv_path 
     WITH (FIRSTROW = 1 , FORMATFILE = @bcp_format_path) 

END 

EXEC dbo.usp_import_cttp 'dbo.new_table', 'C:\temp\new_table.csv', 'C:\Temp\new_table.xml' 

我得到的消息Incorrect syntax near '@table_name'.所以我顯然不能這樣做很正確的東西。但我無法弄清楚,是什麼...

應答所得出從下面

CREATE PROC dbo.usp_import_cttp 
    @table_name nvarchar(100),  /* table to import into */ 
    @csv_path nvarchar(1000),  /* folder containing latest NZULM data files */ 
    @bcp_format_path nvarchar(1000) /* folder containing BCPFORMAT files used to explain csv files */ 
AS 
BEGIN 
    EXEC sp_executesql 'DELETE FROM @table_name', @table_name; 

    EXEC sp_executesql 'BULK INSERT @table_name 
         FROM @csv_path 
         WITH (FIRSTROW = 1 , FORMATFILE = @bcp_format_path)', 
         @table_name, 
         @csv_path, 
         @bcp_format_path; 

END 
+1

您的更新不起作用。應該是''BULK INSERT'+ quotename(@table_name)+'FROM @csv_path ...'' – 2012-03-21 00:08:44

+0

更可能需要正確的參數聲明。無論如何,@菲利普是對的,問題附加的「答案」肯定不會工作。 – 2012-03-21 00:33:43

回答

1

你不能把表名到變量。如果你想這樣做,你唯一的手段就是動態sql:在字符串變量中構建查詢。好消息是,至少仍然可以使用sp_executesql作爲其他參數。

爲了安全起見,我還想對information_schema運行查詢以確保提供的表名是有效的。

+0

同樣的限制是否適用於其他兩個變量? FROM @csv_path WITH(FIRSTROW = 1,FORMATFILE = @bcp_format_path) – 2012-03-20 23:53:16