Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server SP';语法错误';使用变量时出错_Sql Server_Stored Procedures - Fatal编程技术网

Sql server SQL Server SP';语法错误';使用变量时出错

Sql server SQL Server SP';语法错误';使用变量时出错,sql-server,stored-procedures,Sql Server,Stored Procedures,我有一堆CSV文件要导入,所以我用XML创建了BCP格式文件。这些都运行良好,我可以正确导入数据 我现在尝试创建一个存储过程(我以前从未这样做过),它接受三个参数: 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),

我有一堆CSV文件要导入,所以我用XML创建了BCP格式文件。这些都运行良好,我可以正确导入数据

我现在尝试创建一个存储过程(我以前从未这样做过),它接受三个参数:
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'
我在“@table\u 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

不能将表名放入变量中。如果您想这样做,您唯一的方法就是动态sql:在字符串变量中构建查询。好消息是,您至少仍然可以对其他参数使用sp_executesql


出于安全目的,我还希望对信息模式运行查询,以确保提供的表名有效。

是否对其他两个变量应用相同的限制?从@csv_路径(FIRSTROW=1,FORMATFILE=@bcp_format_路径),您的更新不起作用。应该是
'BULK INSERT'+quotename(@table_name)+“FROM@csv_path…”
更可能需要正确的参数声明。无论如何,是的,@Filip是对的,附加在问题后面的“答案”肯定不会像现在这样起作用。