6

ソート列を私のカスタムテーブルタイプに追加する必要があるかどうかを知る必要があります。このテーブルタイプをソートに使うことができます。あるいは、そのような列がなくてもパラメータの順序が同じであると信じることができます。テーブル値パラメータのソート順は同じであることが保証されていますか?

これは私のタイプである:

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; 
    } 
} 
+0

可能性は、表の種類によって異なります。たとえば、テーブル型にプライマリキーを定義すると、レコードを取得する順序を変更する機会が増えます。テーブルタイプに別の列を追加してADO.NETコードに設定するという、より安全なアプローチを取っていきます。 – dasblinkenlight

答えて

3

結果セットに暗黙のソート順はありません。 保証ソート順を達成するために

唯一の方法は、最も外側のクエリにORDER BYです。

は私が

は1 specialty with ROW_NUMBER() OVER(ORDER BY ...) Read "General Remarks"あります...あなたはすでにこれを知っていたと確信しています。しかし、これは危険です。

  • ソート順は、ORDER BYで一意のソート基準を使用している場合のみです。 SELECT 1を使用していますが、ソート順は保証されません。これにより、数百回のテストが行​​われ、突然破損することがあります。
  • これ以降の操作では、この並べ替え順序が破棄される可能性があります。ちょうどあなたが働いている機能を持っていることを想像してください。そして数ヶ月後に、この機能を複雑なクエリで使用します。

私はこれをXMLの中に確かな順序で作成するために使用します。これは、XML内には、暗黙の順序が指定されているためです...

1

はい、列を追加する必要があります。 SQLはセットベースの言語であり、セットは本質的に順序付けられていません(ただし、SQLはこれについて少し漏洩している場合があります)。

あなたがORDER BYを使用したいとあなたは結果を保証したい場合は、それはそれが一意の順序を定義するようなテーブル内データに基づいて十分な表現に基づいていることを確認する必要があります。ここでは、定数で注文しています(ORDER BY 1を試してみると警告が表示されます)。実際にどのような順序付けが実際に適用されるかは保証されていません。

+0

ありがとうございます。しかし、テーブル値のパラメータに使用されるカスタムテーブル型は、SQL Serverによって異なる扱いを受けることはできませんでしたか?そのため、実際には挿入順序を同じに保つことが保証されます。それは役に立つだろう。私は注文が正常に保証されておらず、テーブルには「固有の」注文がないことを知っています。しかし、パラメータとして非常に短い寿命を持ち、異なって振る舞う可能性のあるテーブルタイプです。しかし、私は平凡なテーブルに違いはないと思う。 –

+1

@TimSchmelter - テーブルタイプが導入された時点で、経験豊富なSQL開発者はすべて、固有の順序がないテーブルの操作に慣れていました。したがって、これらの新しいオブジェクトに対して追加の保証や開発努力を提供することが正当なものになるのはなぜですか?彼らがこの驚くべき新しい振る舞いをしていれば、その機能の一部としてドキュメントに強調表示されることを期待しています。 –

1

あなたは...

以下

によって明示的な順序を行う場合を除き、同じ順序が保証されていませんが、いくつかのテストが...

create type numbes as table 
(
num int primary key 
) 


DECLARE @nums AS numbes; 

insert into @nums 
select row_number() over(order by(select 1)) 
from 
master.sys.objects 


select Top 100* from @nums 

と実行計画を示している。..

enter image description here

それでコードの下に..

ROW_NUMBER()OVER(ORDER BY (SELECT 1)) 
FROM @VwdCodeList;"; 

明示的な注文を明記しない限り、毎回同じ注文を受け取ることはできません。

+0

ありがとうございます。しかし、テーブル値のパラメータに使用されるカスタムテーブル型は、SQL Serverによって異なる扱いを受けることはできませんでしたか?そのため、広告掲載オーダーはそのまま維持されます。それは役に立つだろう。私は注文が正常に保証されておらず、テーブルには「固有の」注文がないことを知っています。しかし、パラメータとして非常に短い寿命を持ち、異なって振る舞う可能性のあるテーブルタイプです。あなたの例では、プレーンなテーブルから選択しています。 –

+0

私はあまりにもテーブル値のパラメータについては、読み込み専用なので、同じ考えだと思っています。しかし、あなたが注文するまでは、結果セットは保証されません。 – TheGameiswar

+0

https:// blogs .msdn.microsoft.com/conor_cunningham_msft/2008/08/27/no-seatbelt-expect-order-without-order-by/ – TheGameiswar