【问题标题】:Error 'WITH Statement' in Bulk SQL批量 SQL 中的错误“WITH 语句”
【发布时间】:2017-05-18 23:57:51
【问题描述】:

您好,我创建的存储过程有问题。我遇到了一个语法错误,'@path'附近的语法不正确

如果我输入绝对路径 'J:\TestCSV\ImportData.csv' 我没有收到任何错误。但是如果我声明参数,我会收到上面提到的这个错误。这是我的存储过程。希望得到您的帮助。

Create PROCEDURE [dbo].[FileUpload]

 As
BEGIN


DECLARE @path VARCHAR(256); -- path   
DECLARE @fileName VARCHAR(256); -- filename   
DECLARE @fileDate VARCHAR(20); -- used for file date
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) ;
SET @fileName = 'ImportData' + '_' + @fileDate + '.csv';
SET @path = 'J:\TestCSV\' + @fileName;

BULK

INSERT [dbo].[temp_Cemetery]
--FROM 'E:\CSVTest\ImportDataYYYYMMDD.csv'
FROM @path  -- Error Here Incorrect syntax near '@path'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)


END

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

问题是您需要转义引号附近的反斜杠:

SET @path = 'J:\\TestCSV\\' + @fileName;

这是因为反斜杠是一个特殊字符,并且由于您转义了单引号,因此它将语句的其余部分视为字符串的一部分。我在下面为你修好了。

Create PROCEDURE [dbo].[FileUpload]

 As
BEGIN


DECLARE @path VARCHAR(256); -- path   
DECLARE @fileName VARCHAR(256); -- filename   
DECLARE @fileDate VARCHAR(20); -- used for file date
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) ;
SET @fileName = 'ImportData' + '_' + @fileDate + '.csv';
SET @path = 'J:\\TestCSV\\' + @fileName;

BULK

INSERT [dbo].[temp_Cemetery]
--FROM 'E:\CSVTest\ImportDataYYYYMMDD.csv'
FROM @path  -- Error Here Incorrect syntax near '@path'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)


END

【讨论】:

  • 仍然有同样的错误。'@path' 附近的语法不正确。消息 .319,级别 15,状态 1,过程 MPGUpload,第 25 行关键字“with”附近的语法不正确。如果该语句是一个公用表表达式、一个 xmlnamespaces 子句或一个更改跟踪上下文子句,则前面的语句必须以分号结束
【解决方案2】:

出于某种原因,您必须使用字符串文字。您可能必须使用动态 sql,例如

CREATE PROCEDURE [dbo].[FileUpload]
AS
BEGIN


DECLARE @path VARCHAR(256); -- path   
DECLARE @fileName VARCHAR(256); -- filename   
DECLARE @fileDate VARCHAR(20); -- used for file date
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) ;
SET @fileName = 'ImportData' + '_' + @fileDate + '.csv';
SET @path = 'J:\\TestCSV\\' + @fileName;
DECLARE @sql varchar(8000)

SET @sql = 'BULK INSERT [dbo].[temp_Cemetery]
FROM ''' + @path + '''
WITH
(
    FIELDTERMINATOR = '','',
    ROWTERMINATOR = ''\n''
)'

EXEC (@sql)

END

【讨论】:

    【解决方案3】:

    您需要在路径中添加引号,以便您的 FROM 子句将其读取为 'J:\TestCSV\ImportData_20170104.csv' 而不是 J:\TestCSV\ImportData_20170104.csv

    Create PROCEDURE [dbo].[FileUpload]
    
     As
    BEGIN
    
    
    DECLARE @path VARCHAR(256); -- path   
    DECLARE @fileName VARCHAR(256); -- filename   
    DECLARE @fileDate VARCHAR(20); -- used for file date
    SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) ;
    SET @fileName = 'ImportData' + '_' + @fileDate + '.csv';
    SET @path = '''J:\TestCSV\' + @fileName +'''';
    
    
    
    BULK
    INSERT [dbo].[temp_Cemetery]
    --FROM 'E:\CSVTest\ImportDataYYYYMMDD.csv'
    FROM @path  -- Error Here Incorrect syntax near '@path'
    WITH
    (
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
    )
    
    
    END
    

    【讨论】:

    • 感谢您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2014-05-08
    相关资源
    最近更新 更多