如何查询varbinary列中包含的csv文件?

时间:2019-04-16 05:31:23

标签: tsql

我需要读取varbinary(max)列中包含的csv文件,并将其加载到最终表中。

我正在使用Microsoft SQL Server 2016(SP1-CU14)(KB4488535)-13.0.4560.0(X64)2019年3月12日02:50:13版权所有(c)Microsoft Corporation Developer Edition(64位)

到目前为止,我有2个表参与该过程,第一个表是文件所在的位置:

CREATE TABLE FileRepository
(
Id bigint IDENTITY PRIMARY KEY,
FileName varchar(20),
LoadedFile varbinary(Max)
)

第二个是需要插入csv文件中的数据的地方:

CREATE TABLE [dbo].[MyTestTable](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NULL,
[Description] [varchar](50) NULL,
[AddedColumn] [varchar](100) NULL,
PRIMARY KEY CLUSTERED 
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY =     OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

我已使用以下查询加载了文件:

INSERT INTO FileRepository(FileName, LoadedFile) 
SELECT 'MyCsvFile' AS FileName, 
* FROM OPENROWSET(BULK N'D:\convertcsv.csv', SINGLE_BLOB) AS Document;

我尝试使用以下方式选择它:

SELECT CONVERT(nvarchar(MAX),LoadedFile)
FROM dbo.FileRepository fr`

结果不是我所期望的,它只显示随机字符。

我需要做的是这样的:

INSERT INTO MyTestTable
SELECT *
FROM (Select LoadedFile FROM FileRepository)

1 个答案:

答案 0 :(得分:0)

如果您的数据不是Unicode,请使用varchar而不是nvarchar

换句话说,尝试此操作以查看文件的文本:

SELECT CONVERT(varchar(MAX),LoadedFile)
FROM dbo.FileRepository fr`

要解析CSV中的行(而不是列),您可以执行以下操作:

CREATE TABLE #CSVData (RowData VARCHAR(1000))
BULK INSERT #CSVData FROM 'D:\convertcsv.csv'
SELECT * FROM #CSVData

要也解析列,可以使用STRING_SPLIT

SELECT * FROM #CSVData CROSS APPLY STRING_SPLIT(RowData,',') s

然后是一个PIVOT

SELECT p.RowNum, [1] AS FirstColumn, [2] AS SecondColumn, [3] AS ThirdColumn
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum, * 
    FROM #CSVData
) d
CROSS APPLY (
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS ColNum, * 
    FROM STRING_SPLIT(RowData,',')
) s
PIVOT (MAX(value) FOR ColNum IN ([1],[2],[3])) p
ORDER BY p.RowNum