6

필자는 사용자 정의 테이블 유형에 정렬 열을 추가해야 하는지를 알아야하는데,이 사용자 정의 테이블 유형을 사용하여 정렬 할 수 있거나 매개 변수의 순서가 같은 열이없는 경우에도 그대로 유지할 수 있다고 믿을 수 있습니다. 테이블 반환 매개 변수의 정렬 순서가 동일하게 유지됩니까?

내 유형 :

CREATE TYPE [dbo].[VwdCodeList] AS TABLE(
    [VwdCode] [varchar](50) NOT NULL 
) 

이는 SQL 중 하나입니다 사용할 수 있습니다 : 당신은 내가 정렬 열을 얻을 수 ROW_NUMBER를 사용하고 볼 수

/// <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;"; 

값.

sort-column을 테이블 유형에 추가해야합니까, 아니면 동일한 것으로 유지 (문서화)되어 있습니까? 작동하는 것 같습니다.

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>에 대한 :

내가 그것을 사용하는 ADO.NET 코드입니다.


감사합니다. 미래의 독자가 정렬 순서를 어떻게 보장했는지 알고 싶다면. 다른 열을 추가하여 제안 나는 테이블 형을 변형 한 것 :

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;"; 

들어 일반적

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

: 완전성을 위하여, 여기 IEnumerable<SqlDataRecord> 테이블 값 파라미터 (오류 처리 생략)에 대한 값으로서 사용 반환 방법 결과 집합에 암시 적 정렬 순서가 없습니다.

유일한 방법은 가장 바깥 쪽 쿼리에 ORDER BY보장 정렬 순서를 달성했다.

나는

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-order-by-order-by- – TheGameiswar

관련 문제