【问题标题】:How to Convert a CSV to a SQL Table WITHOUT 'Bulk Insert'如何在没有“批量插入”的情况下将 CSV 转换为 SQL 表
【发布时间】:2013-10-17 00:28:47
【问题描述】:

我需要将 CSV 文件插入 SQL,但不允许使用批量插入功能...

CSV 文件包含数千行,每行包含 3 个字段 I.e

约翰·史密斯,23 岁

我想将其传递到 SQL 表 (MSSQL2008) 中,而不调用“批量插入”函数。该表的结构与 CSV 相同,即 CSV 中的每一行包含 3 列和一行。

有人知道这是否可能吗?

【问题讨论】:

  • 出于好奇,为什么BULK INSERT被禁止?
  • 另外,请查看 SSMS 中的 Import Data 工具。它可以从 CSV 文件中读取。
  • 你的堆栈限制是什么?

标签: sql sql-server tsql csv insert


【解决方案1】:
CREATE FUNCTION [dbo].[Split3] (
@String nvarchar(MAX),
@SepColumn nvarchar(1),
@SepRow nvarchar(1)
)
RETURNS @T TABLE (
col1 nvarchar(50)
,col2 nvarchar(50)
,col3 nvarchar(50)
)

AS
BEGIN
DECLARE @ParseXML xml

SET @String = LTRIM(RTRIM(@String))

--Remove last row separator from string
IF RIGHT(@String, 1) = @SepRow
    SET @String = LEFT(@String, LEN(@String)-1);

    SELECT @ParseXML = CONVERT(XML,'<r><c>' + REPLACE(REPLACE(@String,@SepColumn,'</c><c>'),@SepRow,'</c></r><r><c>') + '</c></r>')

    INSERT @T
    SELECT
        NULLIF(LTRIM(RTRIM(T.c.value('./c[1]','nvarchar(50)'))),'')
        ,NULLIF(LTRIM(RTRIM(T.c.value('./c[2]','nvarchar(50)'))),'')
        ,NULLIF(LTRIM(RTRIM(T.c.value('./c[3]','nvarchar(50)'))),'')
    FROM @ParseXML.nodes('//r') T(c);

 RETURN

 END
 GO

示例 SELECT * FROM [dbo].[Split3] (N'John,Smith,23;Tom,Peter,6;', ',', ';')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多