문자열을 일부 구분 기호로 분리하고 테이블에 이러한 값을 반환하는 작은 sql 함수를 사용합니다.ORDER BY (SELECT NULL)
ALTER FUNCTION [shark].[SplitStrings]
(
@List VARCHAR(MAX),
@Delimiter VARCHAR(255)
)
RETURNS TABLE
AS
RETURN (SELECT [Item], ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS [Id] FROM
(SELECT Item = x.i.value('(./text())[1]', 'varchar(max)')
FROM (SELECT [XML] = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>') + '</i>').query('.')
) AS a CROSS APPLY [XML].nodes('i') AS x(i)) AS y
WHERE Item IS NOT NULL
);
문제는 이것이 문자열의 요소 순서를 변경할 수 있는지 여부입니다.
Ex.
SELECT * FROM [shark].[SplitStrings] ('1,2,3,4,5', ',')
수있는이
1
5
3
4
2
대신
1
2
3
4
5
의 복귀?
추가 정보 : 몇 달 동안 정상적으로 작업 한 후에 구성 요소 중 하나에서 버그를 발견했으며이 버그가 발생할 수있는 유일한 원인은 언급 된 절차입니다. 어떤 식 으로든 65000 개의 요소가 포함 된 문자열 배열의 순서가 변경되었습니다 (구분 기호가있는 문자열의 총 길이는 65000 * 11). 동일한 SQL Server에서 동일한 오류를 재현하려고했지만 행운을 보지 않았습니다. 귀하의 의견과 답변은이 sproc을 유죄로 만들었습니다.
'ORDER BY' 절이있는 것은 모든 행에'ROW_NUMBER() '값을 할당하는 것을 정의하는 것입니다. 그러나 모든 행에 해당 절에서 동일한 값이 지정되므로 할당 된 행 번호는 절대 보장되지 않습니다. 그리고 결과가 반환되는 순서에 영향을주는 보장은 없습니다 *. –
@Damien_The_Unbeliever에 동의합니다. 논리적 순서가 없으면 순서가 잘못 될 수 있습니다.몇 년 동안 데이터를 원하는 순서로 반환 한 쿼리가 있었고 SQL Server 업그레이드 후에는 명시 적 순서가 없기 때문에 다른 순서로 데이터를 제공하기 시작했습니다. 정확한 행 번호 매기기를 제공하기 위해 유사한 루프 인 함수를 만들었습니다. 효율적이지는 않지만 정확합니다. – UnhandledExcepSean
XQuery *는 요소를 순서대로 처리하므로이 기능을보다 강력하게 만들고 싶다면 거기에 카운터를 구현하십시오 (XQuery에는 기본 노드 계산 기능이 있지만 SQL Server에서는이를 구현하지 않습니다). XML 노드에는 순서가 있습니다. 'ROW_NUMBER()'는 그렇지 않습니다. 실제로, 최적화 프로그램이 순조롭게 진행되는 것을 관찰 할 수 있는지 여부는 모르겠다. 가능하다면, 큰 세트 일 수도 있고, 병렬 계획이 선택되었지만 문자열이 너무 작아서 트리거하지 못할 수도있다. 그. –