如何将CSV转换为SQL表而不“批量插入”

时间:2013-10-17 00:28:47

标签: sql sql-server tsql csv insert

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

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

John,Smith,23

我想把它传递到SQL表(MSSQL2008)而不调用'Bulk Insert'函数。该表与CSV的结构相同。它将包含3列,CSV中每行包含一行。

有人知道这是否可能吗?

1 个答案:

答案 0 :(得分:0)

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;', ',', ';')