應用程式常需傳遞多值參數(如訂單明細)。T-SQL 不支援表值參數或陣列類型,解法:將集合編碼為純量值(nvarchar 或 XML)傳遞給預存程序,程序內用表值函數 (TVF) 轉換為資料列集合再插入 LineItems 表。
// TVF 將 ';' 分隔字串轉為單欄位結果集
public static ISqlReader GetStrings(SqlString str)
{
return (ISqlReader)new MySQLReader(str);
}
public class MySQLReader : ISqlReader
{
private string[] m_strlist;
private int m_iRow = -1;
public MySQLReader(SqlString str)
{
if (!str.IsNull)
m_strlist = str.Value.Split(';');
}
public int FieldCount { get { return 1; } }
public SqlMetaData GetSqlMetaData(int fieldNo)
{
if (fieldNo == 0)
return new SqlMetaData("Value", SqlDbType.NVarChar, 60);
else throw new NotImplementedException();
}
public bool Read()
{
if (m_strlist == null) return false;
m_iRow++;
if (m_iRow == m_strlist.Length) return false;
return true;
}
// Column getters 略
}
核心邏輯:建構子用 String.Split 將輸入字串拆解為陣列;Read 逐列回傳直到結束。