【问题标题】:Send csv data to stored procedure and insert into #temp table将 csv 数据发送到存储过程并插入到#temp 表中
【发布时间】:2016-09-21 10:32:45
【问题描述】:

我知道这很脏,但是有没有办法以这种确切的格式发送 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

【问题讨论】:

  • 有一种方法,但您必须格外小心输入。至少你知道它很脏……
  • 对于最后一列,如果字段值中有引号会发生什么?是不是翻倍了? 1,2,"Joe ""尴尬的人""Bloggs"
  • @Martin - 我刚刚把它做成了 csv-ish。这只是一个例子。我有权阻止“。
  • @ZoharPeled 您引用的可能重复项不适用于我的场景。

标签: sql-server tsql stored-procedures sql-server-2014


【解决方案1】:

你可以用 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)

输出:

Number1 Number2 String
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"

【讨论】:

    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    相关资源
    最近更新 更多