我需要读取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)
答案 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