Here is a quick solution, more generic than using a specific format file for the import. The first part is a CSV splitter function which is based on Jeff Moden's DelimitedSplit8K, then a simple format file for importing the file line by line. The last bit is the actual import.dbo.DELIMITED_CSV_SPLIT

CREATE FUNCTION dbo.DELIMITED_CSV_SPLIT(/********************************************************************* Using Jeff Moden's DelimitedSplit8K as a base with the addition of a Text Qualifier parameter, @pTxtQualifier CHAR(1) = '"' *********************************************************************/ @pString VARCHAR(8000) ,@pDelimiter CHAR(1) ,@pTxtQualifier CHAR(1) ) RETURNS TABLE WITH SCHEMABINDING AS RETURN/********************************************************************* cteTally, inline Tally table returning a number sequence equivalent to the length of the input string. *********************************************************************/WITH E1(N) AS ( SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1), E2(N) AS (SELECT 1 FROM E1 a, E1 b), E4(N) AS (SELECT 1 FROM E2 a, E2 b), cteTally(N) AS ( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4 ORDER BY 1 OFFSET 0 ROWS FETCH FIRST CAST(LEN(@pString) AS BIGINT) ROWS ONLY)/******************************************************************** Retrieve the position (N) and the character code (chrCode) for all delimiters (@pDelimiter) and text qualifiers (@pTxtQualifier)********************************************************************/,ctePrimer(N,chrCode) AS ( SELECT t.N ,UNICODE(SUBSTRING(@pString,t.N,1)) AS chrCode FROM cteTally t WHERE SUBSTRING(@pString,t.N,1) COLLATE Latin1_General_BIN = @pDelimiter COLLATE Latin1_General_BIN OR SUBSTRING(@pString,t.N,1) COLLATE Latin1_General_BIN = @pTxtQualifier COLLATE Latin1_General_BIN)/******************************************************************** The cteStart encloses the string in virtual delimiters using Union All at the beginning and the end. The main body sets the IsDelim and IsTxQf flags. ********************************************************************/,cteStart(N,IsDelim,IsTQA) AS ( SELECT 0 AS N ,1 AS IsDelim ,0 AS IsTxQfUNION ALL SELECT t.N ,(1 - SIGN(ABS(t.chrCode - UNICODE(@pDelimiter)))) AS IsDelim ,(1 - SIGN(ABS(t.chrCode - UNICODE(@pTxtQualifier)))) AS IsTxQf FROM ctePrimer t UNION ALL SELECT LEN(@pString) + 1 AS N ,1 AS IsDelim ,0 AS IsTxQf)/******************************************************************** cteWorkSet: Position (N), Delimiter flag (IsDelim), Text Qualifier flag (IsTQA) and the running total of the number of appearances of Text Qualifiers. The delimiters which are inside Text Qualifiers are cancelled out by multiplying the IsDelim flag with the result of ( 1 + the running total of IsTQA ) mod 2.********************************************************************/,cteWorkSet(N,IsDelim,IsTQA) AS ( SELECT cST.N ,cST.IsDelim * ((1+ SUM(cST.IsTQA) OVER (PARTITION BY (SELECT NULL) ORDER BY cST.N ROWS UNBOUNDED PRECEDING)) % 2) AS IsDelim ,((SUM(cST.IsTQA) OVER (PARTITION BY (SELECT NULL) ORDER BY cST.N ROWS UNBOUNDED PRECEDING)) % 2) AS IsTQA FROM cteStart cST),/******************************************************************** cteWSTQ: Using LEAD and LAG to retrieve the offsets for the Text Qualifiers and filtering the results by IsDelim = 1 or IsTQA = 1. The set now holds all the information needed for correctly splitting the text.********************************************************************/cteWSTQ(P_START,IsDelim,NEXT_IsTQA,LAG_IsTQA) AS( SELECT cWS.N AS P_START ,cWS.IsDelim AS IsDelim ,LEAD(cWS.IsTQA,1,0) OVER (ORDER BY cWS.N) AS NEXT_IsTQA ,LAG(cWS.IsTQA,1,0) OVER (ORDER BY cWS.N) AS LAG_IsTQA FROM cteWorkSet cWS WHERE cWS.IsDelim = 1 OR cWS.IsTQA = 1)/******************************************************************** cteWSLEN: Calculate the start and the length of each field********************************************************************/,cteWSLEN(P_START,P_LEN) AS( SELECT (X.P_START + X.NEXT_IsTQA + SIGN(X.P_START)) AS P_START ,(LEAD(X.P_START,1,0) OVER (ORDER BY X.P_START) - ((X.P_START + X.NEXT_IsTQA) + SIGN(X.P_START) + LEAD(X.LAG_IsTQA,1,0) OVER (ORDER BY X.P_START))) AS P_LEN FROM cteWSTQ X WHERE X.IsDelim = 1)/******************************************************************** Splitting the string using the output of the cteWSLEN, filtering it by the length being non-negative value. The NULLIF returns NULL if the field is empty.********************************************************************/

Attached to this post is a simple SSIS Package * that will load your file to (a slightly modified version of) your POMaster table. I think you will need some transforms to resolve some of your data points to system keys, e.g. the Purchase Order # in your file is alpha-numeric and in your table PONum is declared as an INT, but you'll get the idea. The intent was to show you how to setup an SSIS Flat File Connection Manager to parse a delimited file with text qualifiers and embedded delimiters.

* the forum would not allow me to attach a file with a .dtsx extension, so I named it with a .txt extension, just drop the .txt on save.

__________________________________________________________________________________________________There are no special teachers of virtue, because virtue is taught by the whole community. --Plato