我有一个名为Config的列,其数据如下,它是一个长字符串
AutoFill = 1 Backgrouns = True StoreAddress1 = '1601 River Road East' StoreAddress2 = '' StoreCity = 'Kitchener' StoreProv = 'ON' StorePostal = 'N2A 3Y4' StorePhone = '(844) 607-6362'
我必须提取其中的“ 1601 River Road East”并将其放在不同的表中作为地址行1,将Kitchener用作该表中的城市,将ON作为该表中的Province,将N2A 3Y4作为邮政编码>
在这个长字符串中,StoreAddress1 StoreAddress2 StoreCity这个词也总是会出现在其他行中
我使用Microsoft SQL Server 2016 我知道我必须使用patindex和子字符串,但是无法进行查询
答案 0 :(得分:0)
如果是我,我将使用Visual Studio c#而不是T-SQL来更改它们,因此您可以进行一些错误检查。类似于以下内容。
var cn = new System.Data.SqlClient.SqlConnection("your connection");
cn.Open();
var cmd = new System.Data.SqlClient.SqlCommand("Select YourLongField From YourTable", cn);
var dt = new System.Data.DataTable();
dt.Load(cmd.ExecuteReader());
cmd.Dispose();
for (int i = 0; i < dt.Rows.Count; i++)
{
var split = dt.Rows[i]["YourLongField"].ToString().Split(' ');
//Error check here before inserting a new record
var cmdInsertNew = new System.Data.SqlClient.SqlCommand("Insert Into YourNiceNewTable (Address1, Address2, StoreCity, StoreProv, StorePostal, StorePhone) Values (@Address1, @Address2, @StoreCity, @StoreProv, @StorePostal, @StorePhone)", cn);
cmdInsertNew.Parameters.AddWithValue("@Address1", split[2]);
cmdInsertNew.Parameters.AddWithValue("@Address2", split[3]);
cmdInsertNew.Parameters.AddWithValue("@StoreCity", split[4]);
cmdInsertNew.Parameters.AddWithValue("@StoreProv", split[5]);
cmdInsertNew.Parameters.AddWithValue("@StorePostal", split[6]);
cmdInsertNew.Parameters.AddWithValue("@StorePhone", split[7]);
cmdInsertNew.ExecuteNonQuery();
cmdInsertNew.Dispose();
}
cn.Dispose();
答案 1 :(得分:0)
这很丑陋,但是,嘿。。。我必须在这里使用DelimitedSplit8k_LEAD
,因为第二个拆分的顺序位置很重要。无论如何,这都会执行“作业”,但是会在值周围留下单引号。这取决于您以后解决。
WITH Pivoted AS(
SELECT V.UndelimitedList,
DSc.ItemNumber,
MAX(CASE DSv.ItemNumber WHEN 1 THEN DSv.Item END) AS ColumnName,
MAX(CASE DSv.ItemNumber WHEN 2 THEN DSv.Item END) AS ItemValue
FROM (VALUES('AutoFill = 1 Backgrouns = True StoreAddress1 = ''1601 River Road East'' StoreAddress2 = '''' StoreCity = ''Kitchener'' StoreProv = ''ON'' StorePostal = ''N2A 3Y4'' StorePhone = ''(844) 607-6362'''))V(UndelimitedList)
CROSS APPLY(VALUES(REPLACE(REPLACE(V.UndelimitedList,' ','|'),' = ','~'))) CL(DelimitedList) --Assumes no values will have a double space, and all are separated by double space
--Also assumes that a Pipe (|) and Tilda (~) will never appear in your data
CROSS APPLY dbo.DelimitedSplit8K_LEAD(CL.DelimitedList,'|') DSc
CROSS APPLY dbo.DelimitedSplit8K_LEAD(DSc.Item,'~') DSv
GROUP BY V.UndelimitedList,
DSc.ItemNumber
HAVING MAX(CASE DSv.ItemNumber WHEN 1 THEN DSv.Item END) != '')
SELECT MAX(CASE P.ColumnName WHEN 'AutoFill' THEN NULLIF(P.ItemValue,'''''') END) AS AutoFill,
MAX(CASE P.ColumnName WHEN 'Backgrouns' THEN NULLIF(P.ItemValue,'''''') END) AS Backgrouns,
MAX(CASE P.ColumnName WHEN 'StoreAddress1' THEN NULLIF(P.ItemValue,'''''') END) AS StoreAddress1,
MAX(CASE P.ColumnName WHEN 'StoreAddress2' THEN NULLIF(P.ItemValue,'''''') END) AS StoreAddress2,
MAX(CASE P.ColumnName WHEN 'StoreCity' THEN NULLIF(P.ItemValue,'''''') END) AS StoreCity,
MAX(CASE P.ColumnName WHEN 'StoreProv' THEN NULLIF(P.ItemValue,'''''') END) AS StoreProv,
MAX(CASE P.ColumnName WHEN 'StorePostal' THEN NULLIF(P.ItemValue,'''''') END) AS StorePostal,
MAX(CASE P.ColumnName WHEN 'StorePhone' THEN NULLIF(P.ItemValue,'''''') END) AS StorePhone
FROM Pivoted P
GROUP BY P.UndelimitedList;