1

我正在尝试在 SQL Server 2008 中执行以下 SQL-

DECLARE @sql nvarchar, @fullname nvarchar;

SET @fullname='1patents_corrected.csv';
SET @sql = 'BULK INSERT GooglePatentsIndividualDec2012.dbo.patent from ' + @fullname+ '     WITH  ( DATAFILETYPE = "char", FIELDTERMINATOR = "^", ROWTERMINATOR =  "\n" );'

EXEC(@sql)

但是我收到了这个错误——

消息 2812,级别 16,状态 62,第 1 行
找不到存储过程“B”。

我在这里做错了什么?

更新——我改变了查询,即。为每个 varchar 变量指定一个大小。现在代码是这样的——

 DECLARE @MyCounter int;
 DECLARE @Fileprefix nvarchar(1000), @Filesuffix nvarchar(1000), @fullname nvarchar(1000), @Counter_string nvarchar(1000), @sql nvarchar(1000);

 SET @MyCounter = 1;
 SET @Fileprefix= 'C:\Arvind_gpd\patents\';
 SET @Filesuffix='data_corrected.csv';

 WHILE (@MyCounter < 10)

 BEGIN;
 Set @Counter_string= Cast(@MyCounter AS varchar(1) );
 Set @fullname = (@Fileprefix+ @Counter_string + @Filesuffix );
 SET @sql = 'BULK INSERT GooglePatentsIndividualDec2012.dbo.patent from ' + @fullname+ 
 '  WITH  ( DATAFILETYPE = "char", FIELDTERMINATOR = "^", ROWTERMINATOR = "\n" );'
 EXEC(@sql);
 SET @MyCounter = @MyCounter + 1;
 END;  
 GO

但是我现在遇到了一个不同的错误-

 Msg 102, Level 15, State 1, Line 1

'C:' 附近的语法不正确。消息 319,级别 15,状态 1,第 1 行关键字“with”附近的语法不正确。如果此语句是公用表表达式、xmlnamespaces 子句或更改跟踪上下文子句,则前面的语句必须以分号结束。

现在我做错了什么:(?

4

2 回答 2

7

改变

DECLARE @sql nvarchar

DECLARE @sql nvarchar(2000)

默认大小为 1

这同样适用于@fullname nvarchar;给它一个大小

于 2013-01-20T16:29:27.043 回答
1

使用 BULK INSERT 时需要引用文件名。

改变

SET @sql = 'BULK INSERT GooglePatentsIndividualDec2012.dbo.patent 
from ' + @fullname+ 
WITH  ( DATAFILETYPE = "char", FIELDTERMINATOR = "^", ROWTERMINATOR ="\n" );'

SET @sql = 'BULK INSERT GooglePatentsIndividualDec2012.dbo.patent 
FROM ''' + @fullname + '''
WITH  ( DATAFILETYPE = ''char'', FIELDTERMINATOR = ''^'', ROWTERMINATOR =''\n'' )'

您会注意到我有多个单引号捆绑在一起的实例。双单引号代表 SQL Server 中的转义(即我在另一个引号中引用一个引号)。

另外,我看到您在代码中使用了很多分号。使用 T-SQL 编写时无需放入它们

于 2013-01-20T18:42:16.697 回答