2010-12-08 5 views
0

주어진 8 자리 숫자 형식 데이터베이스의 '자식 번호'가있는 테이블을 반환하는 프로 시저를 만들려고합니다. 예를 들어 54000000이라는 숫자의 자녀는 54100000, 54009900 54000001 등이됩니다.sql 함수의 문제

제 아이디어는 숫자의 '부모'부분 만 포함하는 변수 테이블 (ParentPartTable)을 선언하는 것입니다. 예를 들어 두 개 이상의 숫자를 전달할 수 있으므로 단일 값이 아닙니다. 그것은 '54'가 포함 된 다음과 같이 할 것입니다 위 :

INSERT INTO @ReturnTable 
SELECT n.Symbol, n.Id 
FROM NumbersTable n 
JOIN @ParentPartTable p 
ON n.Symbol LIKE p.SYMBOL + '%'; 

불행하게도이 나던 작동하는 것입니다. 어떤 생각이 잘못 될 수 있습니까?

+0

데이터가 적절하다고 생각하는 경우. 나는 전에 이런 기법을 사용 했었다고 확신한다. –

+0

'n.Symbol'의 데이터 유형은 무엇입니까? – thomaspaulb

+0

NCHAR (8) – matt99

답변

1

이것은 작동합니다.

DECLARE @ParentPartTable TABLE 
(
SYMBOL VARCHAR(8) /*Don't use CHAR(8) here!*/ 
) 

INSERT INTO @ParentPartTable VALUES ('54'); 

WITH NumbersTable AS 
(
SELECT '54000000' AS Symbol, 1 AS Id 
) 

SELECT n.Symbol, n.Id 
FROM NumbersTable n 
JOIN @ParentPartTable p 
ON n.Symbol LIKE p.SYMBOL + '%'; 

char(8)을 사용하지 않습니까? 그것으로 후행 공백을 막을 수 있습니다.

+0

예, 분명히 같은 것을하는 nchar을 사용했습니다. 감사합니다 – matt99

+0

@ matt99 - 테이블 변수에? 이 경우 귀하가 수락 한 답변으로는 문제가 해결되지 않습니다. 'nchar'에서'varchar'로 캐스팅하면 문제의 원인이 된 후미 공백이 제거되지 않습니다. –

+0

처음에는 테이블 변수의 형식을 nvarchar로 변경했지만 여전히 작동하지 않았습니다.이를 varchar로 변경하고 once.If에서 제안 된 캐스팅 파벨을 사용했습니다. UTF-8 형식으로 쿼리를 저장하면 이해할 수 있습니다. varchar로 변수 유형을 변경하면 nvarchar를 피할 수 있습니다. (캐스팅을 제거한 이후로 계속 작동하는 것처럼 보입니다.) – matt99

0

기호이 두 테이블에서 모두 숫자라고 가정하면 LIKE 절에서 ti를 varchar로 변환해야합니다.
ON n.Symbol LIKE cast(p.SYMBOL as varchar) + '%';이 작동해야합니다.

+0

실제로 작동합니다. 감사합니다. 문제가이 필드의 유형과 맞았다면 당신 말이 맞습니다. – matt99