2013-10-17 74 views
0

我要插入一個CSV文件導入SQL的要求,但我不允許使用大容量插入功能...如何轉換CSV到一個SQL表,而「批量插入」

CSV文件包含千行,每個包含3個領域即

約翰·史密斯,23

而且我想這傳遞到一個SQL表(MSSQL2008),而不調用「批量插入」功能。該表與CSV I.e具有相同的結構,它將包含CSV列中每行的3列和一行。

有誰知道這是否可能?

+2

出於好奇,爲什麼是'BULK INSERT'禁止? – Dai

+1

另外,請看SSMS中的「導入數據」工具。它可以從CSV文件中讀取。 – Dai

+0

Wahat是你的堆棧限制嗎? – jcwrequests

回答

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