Sql server 将csv数据发送到存储过程并插入#temp表

Sql server 将csv数据发送到存储过程并插入#temp表,sql-server,tsql,stored-procedures,sql-server-2014,Sql Server,Tsql,Stored Procedures,Sql Server 2014,我知道这是肮脏的,但有没有一种方法可以以这种精确的格式发送csv数据(回车分开): 1,2,"Bla1" 3,4,"Bla2" 到存储过程,并将其插入#temp表 骨架: IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'USP_Test') DROP PROCEDURE USP_Test GO SET ANSI_NULLS ON GO SET QUOTED_

我知道这是肮脏的,但有没有一种方法可以以这种精确的格式发送csv数据(回车分开):

1,2,"Bla1"
3,4,"Bla2"
到存储过程,并将其插入#temp表

骨架:

IF EXISTS (SELECT *
           FROM sys.objects
           WHERE type = 'P' AND name = 'USP_Test')
    DROP PROCEDURE USP_Test
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE USP_Test
    @CsvData NVARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    CREATE TABLE #Temp
        (
            Number1 FLOAT,
            Number2 FLOAT, 
            String NVARCHAR(255)
        )

    -- insert @CsvData into #Temp
END

我喜欢这种情况下的表值参数,但我只能控制是否发送
nvarchar

您可以使用XML,但是如果输入数据很大,可能会出现性能问题

DECLARE @CsvData nvarchar(max) = 
'1,2,"Bla1"
3,4,"Bla2"
5,6,"Bla3"
7,8,"Bla4"
9,10,"Bla5"
11,12,"Bla6"
13,14,"Bla7"
15,16,"Bla8"
16,18,"Bla9"'

DECLARE @xml xml

SELECT @xml = CAST('<row>' + REPLACE('<s>' + REPLACE(@CsvData,',','</s><s>')+'</s>',CHAR(13)+CHAR(10),'</s></row><row><s>') + '</row>' as xml)


SELECT  t.v.value('s[1]','float') as Number1,
        t.v.value('s[2]','float') as Number2,
        t.v.value('s[3]','nvarchar(255)') as String 
FROM @xml.nodes('/row') as t(v)

可以使用XML实现,但如果输入数据很大,则可能会出现性能问题

DECLARE @CsvData nvarchar(max) = 
'1,2,"Bla1"
3,4,"Bla2"
5,6,"Bla3"
7,8,"Bla4"
9,10,"Bla5"
11,12,"Bla6"
13,14,"Bla7"
15,16,"Bla8"
16,18,"Bla9"'

DECLARE @xml xml

SELECT @xml = CAST('<row>' + REPLACE('<s>' + REPLACE(@CsvData,',','</s><s>')+'</s>',CHAR(13)+CHAR(10),'</s></row><row><s>') + '</row>' as xml)


SELECT  t.v.value('s[1]','float') as Number1,
        t.v.value('s[2]','float') as Number2,
        t.v.value('s[3]','nvarchar(255)') as String 
FROM @xml.nodes('/row') as t(v)

有一种方法可以复制,但必须格外小心输入。至少你知道它是脏的…对于最后一列,如果字段值中有引号会发生什么?是双倍的吗?1,2,“乔”“笨拙的一个”“布洛格斯”@Martin-我刚做了一个。这只是一个例子。我有权阻止“@ZoharPeled您引用的可能的重复在我的场景中不适用。可能的重复是有办法的,但您必须格外小心输入。至少您知道它是脏的…对于最后一列,如果字段值中有引号会发生什么?它会加倍吗?1,2,“Joe”笨拙的一个“Bloggs”@Martin-我刚刚把它做成了csv-ish。这只是一个例子。我有权阻止“@ZoharPeled”你引用的可能的重复在我的场景中不适用。