【问题标题】:SqlClient.SqlException (0x80131904) The identifier that starts withSqlClient.SqlException (0x80131904) 开头的标识符
【发布时间】: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 注入的攻击,因为您正在存储过程中进行字符串连接。

标签: vb.net sql-server-2005


【解决方案1】:
  • 您应该使用 NVARCHAR 作为对象名称(Unicode!)
  • 您应该使用 NVARCHAR 作为文件名(Unicode!)
  • 您应该允许非默认架构表,传入架构
  • 您应该将 NVARCHAR 用于查询文本(Unicode!)
  • 您应该使用[] 作为分隔符
  • 使用QUOTENAME

    CREATE PROCEDURE [dbo].[BulkInsertDelimeted] 
            @InputFileName NVarchar(256), 
            @TableName NVarchar(128),
            @TableShema NVARCHAR(128)
    AS 
    BEGIN  
    declare @query Nvarchar(max) 
      set @Query =N'BULK INSERT ' + QUOTENAME(@TableSchema) + N'.' + 
          QUOTENAME(@TableName) + N' FROM '+ QUTENAME(@InputFileName, '''')
          + N' WITH ( DATAFILETYPE =  ''char'', FIELDTERMINATOR = '','' , ROWTERMINATOR = ''\n'')'; 
    print @query 
    exec sp_executesql @query
    END
    

至于错误:显然您从 VB 中错误地调用了代码,并且您将文件名作为表名传递。

【讨论】:

  • 嗨 Remus,看看我的主要帖子,我添加了已编辑的 bul 查询,它现在正在工作。你能告诉我是否还需要 TableSchema 变量,如果是的话,我应该在 vb 参数中输入什么。 InputFileName 的第二个问题 256 是字符限制。第三个问题:我的表格中的列大小应该是多少?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 2014-03-06
  • 1970-01-01
  • 2023-03-04
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多