ソート列を私のカスタムテーブルタイプに追加する必要があるかどうかを知る必要があります。このテーブルタイプをソートに使うことができます。あるいは、そのような列がなくてもパラメータの順序が同じであると信じることができます。テーブル値パラメータのソート順は同じであることが保証されていますか?
これは私のタイプである:
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
を使用している見ることができるように値。
ソート列もテーブルタイプに追加する必要がありますか、それとも同じであることを保証(文書化)していますか?それは動作するようです。
SqlParameter vwdCodeListParameter = insertWatchListCodeCommand.Parameters.Add("@VwdCodeList", SqlDbType.Structured);
vwdCodeListParameter.TypeName = "[dbo].[VwdCodeList]";
vwdCodeListParameter.Value = WatchListSql.GetVwdCodeRecords(newVwdCodes, true);
int inserted = insertWatchListCodeCommand.ExecuteNonQuery();
GetVwdCodeRecords
戻りIEnumerable<string>
ためIEnumerable<SqlDataRecord>
:
これは私がそれを使用するADO.NETコードです。
ありがとうございます。将来の読者がソート順をどうやって保証しているか知りたいと思ったら。別の列を追加することにより示唆されるように、私は、テーブル型をmodifedました:
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