Мне нужно знать, нужно ли мне добавить столбец сортировки в свой собственный тип таблицы, который я мог бы использовать для сортировки, или если я могу доверять тому, что порядок параметров остается неизменным даже без такого столбца.Является ли порядок сортировки табличных параметров неизменным?
Это мой тип:
CREATE TYPE [dbo].[VwdCodeList] AS TABLE(
[VwdCode] [varchar](50) NOT NULL
)
и это одна из SQL где можно использовать:
/// <summary>
/// Inserts all new WatchListCodes for a given watchlist
/// </summary>
public const string InsertWatchListCodes = @"
INSERT INTO [dbo].[WatchListCodes]
([WatchListID]
,[VwdCode]
,[Sort])
SELECT @WatchListID, VwdCode, ROW_NUMBER()OVER(ORDER BY (SELECT 1))
FROM @VwdCodeList;";
, как вы можете видеть, я использую ROW_NUMBER
, чтобы получить сортировки-колонки стоимость.
Нужно ли также добавить сортировочный столбец в табличный тип или он гарантирован (задокументирован), что он остается тем же? Кажется, это работает.
Это код ADO.NET, где я использую его:
SqlParameter vwdCodeListParameter = insertWatchListCodeCommand.Parameters.Add("@VwdCodeList", SqlDbType.Structured);
vwdCodeListParameter.TypeName = "[dbo].[VwdCodeList]";
vwdCodeListParameter.Value = WatchListSql.GetVwdCodeRecords(newVwdCodes, true);
int inserted = insertWatchListCodeCommand.ExecuteNonQuery();
GetVwdCodeRecords
IEnumerable<SqlDataRecord>
возвращается для IEnumerable<string>
.
Спасибо всем. Если будущему читателю интересно узнать, как я гарантировал порядок сортировки. Я доработанную таблицу типа, как предложено добавить еще один столбец:
CREATE TYPE [dbo].[VwdCodeList] AS TABLE(
[VwdCode] [varchar](50) NOT NULL,
[Sort] [smallint] NOT NULL
)
Вкладыш-SQL еще проще, так как вид колонки передается в систему и не рассчитали:
public const string InsertWatchListCodes = @"
INSERT INTO [dbo].[WatchListCodes]
([WatchListID]
,[VwdCode]
,[Sort])
SELECT @WatchListID, cl.VwdCode, cl.Sort
FROM @VwdCodeList cl;";
Для ради полноты картины, здесь метод, который возвращает IEnumerable<SqlDataRecord>
используется в качестве значения для табличного значения параметра-(пропущенные обработки ошибок):
public static IEnumerable<SqlDataRecord> GetVwdCodeRecords(IEnumerable<string> vwdCodes, bool trimCode = true)
{
short currentSort = 0;
foreach (string vwdCode in vwdCodes)
{
var record = new SqlDataRecord(
new SqlMetaData("VwdCode", SqlDbType.VarChar, 50),
new SqlMetaData("Sort", SqlDbType.SmallInt));
record.SetString(0, trimCode ? vwdCode.Trim() : vwdCode);
record.SetInt16(1, ++currentSort);
yield return record;
}
}
Хорошие шансы, это зависит от определения типа таблицы. Например, определение первичного ключа в вашем типе таблицы имеет неплохую возможность изменить порядок, в котором вы возвращаете свои записи. Я бы взял более безопасный подход к добавлению другого столбца в тип таблицы и настройке его в коде ADO.NET. – dasblinkenlight