正在尝试将随机数为0的csv导入SQL Server

正在尝试将随机数为0的csv导入SQL Server,sql,sql-server,import,flat-file,Sql,Sql Server,Import,Flat File,基本上,我想跳过随机数的零。我认为,解决方案是在格式文件中创建一个以第一个非零值结尾的伪列。然而,在搜网之后,我不知道该怎么做 编辑:澄清每行前面都有0的随机数 e、 g 首先,我将它按原样导入临时创建的列中的行 然后我会创建一个用户定义的函数,或者基于 循环并删除了第一个字符,而该字符为“0” 我不得不在MLS进口上做类似的事情。这基本上就是我所做的 BULK INSERT TmpTable FROM [CSVPATH] WITH (FIELDTERMINATOR = ',' , ROWTE

基本上,我想跳过随机数的零。我认为,解决方案是在格式文件中创建一个以第一个非零值结尾的伪列。然而,在搜网之后,我不知道该怎么做

编辑:澄清每行前面都有0的随机数

e、 g


首先,我将它按原样导入临时创建的列中的行 然后我会创建一个用户定义的函数,或者基于

循环并删除了第一个字符,而该字符为“0”


我不得不在MLS进口上做类似的事情。这基本上就是我所做的

BULK INSERT TmpTable FROM [CSVPATH] 
WITH (FIELDTERMINATOR = ',' , ROWTERMINATOR = '\n')
然后修复需要修复的数据(前导零)

有几种方法可以做到这一点,但我将列出两种

  • UPDATE TmpTable Set TmpCol=左侧时的情况(TmpCol,1)=“0”,然后是LTRIM(TmpCol,LEN(TmpCol)-1),否则TmpCol结束

    updatetmptable Set TmpCol=SUBSTRING(TmpCol,PATINDEX('%[^0]',TmpCol+')、LEN(TmpCol))


  • 我假设.csv文件导入过程的第一步是将文件导入数据库。然后第二步是清理数据

    要在导入后删除零,可以创建一个函数:

     create function [dbo].[RemoveLeadingZero](@strSrc as varchar(8000))
     returns varchar(8000)
     as
     begin
          declare  @strResult varchar(8000)
          set @strResult = ''
          begin
              set @strResult = Replace(Ltrim(Replace(@strSrc, '0', ' ')), ' ', '0')
          end
          return @strResult
     end
    select dbo.RemoveLeadingZero('000004412900000009982101201021042010')
    
    update myTable
    set columnA = dbo.RemoveLeadingZero(columnA)
    
    试试这个

    DECLARE @str varchar(100)='000004412900000009982101201021042010'
    DECLARE @str1 varchar(100)='000000935000000009902005199322071993'
    
        SELECT @str,RIGHT(@str,LEN(@str)-(PATINDEX('%'+'[1-9]'+'%',@str)-1)),@str1,RIGHT(@str1,LEN(@str1)-(PATINDEX('%'+'[1-9]'+'%',@str1)-1))
    
    ALTER函数[dbo]。[fn_CSVToTable](@CSVList Varchar(5000))
    返回@Table Table(ColumnData Varchar(50))
    作为
    开始
    如果正确(@CSVList,1)'
    选择@CSVList=@CSVList+','
    声明@Pos Smallint,
    @奥尔德波斯斯莫林酒店
    选择@Pos=1,
    @OldPos=1
    而@Pos
    您能解释一下吗?您的意思是文件的标题有一堆零,或者每个数字字段都以零开头,或者每行都以随机数的零开头?你能编辑你的问题以包含一些样本数据吗?对不起,你能再澄清一些吗?这两个示例行应该如何解释?你的标题是CSV,但我看不到任何逗号。我想从技术上讲,它只是一个平面文件,这是我的错。基本上,假设我有一个要插入的列,但是该列的每一行都由随机数的零引导。当然,第三种选择是使用@dmitry优雅地建议的函数进行更新。但是,删除内联的前导零会更好。欢迎使用SO,如果您能在回答中添加一些详细信息来解释您的方法/代码,这将非常有用。
     create function [dbo].[RemoveLeadingZero](@strSrc as varchar(8000))
     returns varchar(8000)
     as
     begin
          declare  @strResult varchar(8000)
          set @strResult = ''
          begin
              set @strResult = Replace(Ltrim(Replace(@strSrc, '0', ' ')), ' ', '0')
          end
          return @strResult
     end
    select dbo.RemoveLeadingZero('000004412900000009982101201021042010')
    
    update myTable
    set columnA = dbo.RemoveLeadingZero(columnA)
    
    DECLARE @str varchar(100)='000004412900000009982101201021042010'
    DECLARE @str1 varchar(100)='000000935000000009902005199322071993'
    
        SELECT @str,RIGHT(@str,LEN(@str)-(PATINDEX('%'+'[1-9]'+'%',@str)-1)),@str1,RIGHT(@str1,LEN(@str1)-(PATINDEX('%'+'[1-9]'+'%',@str1)-1))
    
    ALTER Function [dbo].[fn_CSVToTable] (@CSVList Varchar(5000))
    Returns @Table Table (ColumnData Varchar(50))
    As
    Begin
    If right(@CSVList, 1) <> ','
    Select @CSVList = @CSVList + ','
    
    Declare @Pos    Smallint,
    @OldPos Smallint
    Select  @Pos    = 1,
    @OldPos = 1
    
    While   @Pos < Len(@CSVList)
    Begin
    Select  @Pos = CharIndex(',', @CSVList, @OldPos)
    Insert into @Table
    Select  LTrim(RTrim(SubString(@CSVList, @OldPos, @Pos - @OldPos))) Col001
    Select  @OldPos = @Pos + 1
    End
    Return
    End