【发布时间】:2015-04-06 11:59:38
【问题描述】:
无论如何,对于一些我正在检索以下错误的文件,我正在使用如下存储过程。可能是什么原因?:
System.Data.SqlClient.SqlException (0x80131904): The identifier that starts with 'D:\DISKSEC\TETRAIBMSolution\TETRA\Data\IDJSKDOSD\Parsed\IOPDCVv3995ReportErgfdgfgdfIOPShun_e6c5b926-fb91-484e-bfe0-9c13a96f' is too long. Maximum length is 128.
我正在使用的存储过程:
ALTER PROCEDURE [dbo].[BulkInsertDelimeted]
@InputFileName Varchar(700),
@TableName Varchar(200)
AS
BEGIN
declare @query varchar(6000)
set @Query ='BULK INSERT "' + @TableName + '" FROM "'+ @InputFileName+'"
WITH ( DATAFILETYPE = ''char'', FIELDTERMINATOR = '','' , ROWTERMINATOR = ''\n'')';
print @query
exec (@query)
END
已编辑以供进一步讨论:
@InputFileName NVarchar(256),
@TableName NVarchar(128)
AS
BEGIN
declare @query NVarchar(max)
set @Query =N'BULK INSERT ' + N'.' +
QUOTENAME(@TableName) + N' FROM '+ QUOTENAME(@InputFileName, '''')
+ N' WITH ( DATAFILETYPE = ''char'', FIELDTERMINATOR = '','' , ROWTERMINATOR = ''\n'')';
print @query
exec (@query)
END
来自vb:
db.AddInParameter(cmd, "InputFileName", SqlDbType.NVarChar, fileToBeParsedPath) 'fileName
db.AddInParameter(cmd, "TableName", SqlDbType.NVarChar, ReportDatabase.TableName)
【问题讨论】:
-
我会尝试将它们声明为 Nvarchar(具有适当的大小甚至
Nvarchar(MAX))。我要做的另一件事(测试它)是将您设置为@Query var的字符串连接为Nvarchars,在打开实际字符串之前放置一个n,就像这样:set @Query = n'BULK INSERT "' + CAST(@TableName AS NVARCHAR(MAX) + n'" FROM "'+ CAST(@InputFileName AS NVARCHAR(MAX) + n'" WITH ( DATAFILETYPE = ''char'', FIELDTERMINATOR = '','' , ROWTERMINATOR = ''\n'')'; -
确保列数据类型为 varchar(max)
-
我将 varchar(MAX) 放入表中的每一列和 BULK 每个字段中作为 varchar(MAX) 相同的错误
-
请注意,即使您使用参数,此代码仍然容易受到 sql 注入的攻击,因为您正在存储过程中进行字符串连接。