2014-06-30 6 views
0

고객이 우리에게 제공 한 정보를 기반으로 데이터베이스 목록에있는 의사 목록과 일치하는 저장 프로 시저를 작성하려고합니다. 현재 우리는 주어진 식별자를 기반으로 수동으로 MS Access를 사용하지만,이 프로세스는 지루하고 시간이 오래 걸리기 때문에 자동화를 원합니다.제공된 필드만을 사용하는 T-SQL 일치 프로세스

잠재적으로 일치시킬 수있는 모든 열을 포함하는 임시 테이블을 만든 다음 필드를 조인 조건으로 사용하여 일련의 일치하는 쿼리를 실행하여 식별자를 다시 전달합니다. 문제는 거기에 대한 15 가지 식별자가 잠재적으로있을 수 있다는 사실에있다

UPDATE Temp 
SET Temp.RECID = Phy.RECID 
FROM TempTable Temp 
INNER JOIN Physicians Phy 
ON Phy.Name = Temp.Name 
AND Phy.NPI = Temp.NPI 
AND Phy.MedicaidNum = Temp.MedicaidNum 
AND Phy.DOB = Temp.DOB 

UPDATE Temp 
SET Temp.RECID = Phy.RECID 
FROM TempTable Temp 
INNER JOIN Physicians Phy 
ON Phy.Name = Temp.Name 
AND Phy.NPI = Temp.NPI 
AND Phy.MedicaidNum = Temp.MedicaidNum 
WHERE Temp.RECID IS NULL 

...etc 

:

는 예를 들어, 사용 가능한 일치하는 필드 이름, NPI, MedicaidNum 및 DOB 그래서 다음처럼 작성할 수 있습니다 제공되며 클라이언트는 보통 레코드 세트당 3 ~ 4 개만 제공합니다. 따라서 Null 값이 고려 될 때까지, 제공되는 필드가 6 개 밖에없는 경우 수백 개의 쿼리가 작성되어 일치해야합니다.

실제로 데이터 세트에 제공된 열을 나타내는 변수 (또는 변수)를 전달한 다음 동적 결합 문 및/또는 where 절을 작성하는 방법이있을 수 있다고 생각하지만, 이것이 T-SQL에서 작동하는지 알 수 없습니다. 내가 쓸 필요가 쿼리의 수를 제한, 만 오히려 나는이 일치하고 필드, 특정 사람의 수에 대해 걱정할 필요가

DECLARE @Field1 
DECLARE @Field2 
.... 
UPDATE Temp 
SET Temp.RECID = Phy.RECID 
FROM TempTable Temp 
INNER JOIN Physicians Phy 
ON [email protected] = [email protected] 
AND [email protected] = [email protected] 

이 방법 :처럼 뭔가. 아마도이 문제에 대한 더 나은 접근 방법이 있을까요?

답변

0

이 방법을 사용할 수 있지만이 방법은 SQL 삽입에 매우 취약하다는 경고를받습니다. 이런 식으로하는 법을 설명하는 것입니다. 나는 당신이 그걸로하고 싶은 것을 당신에게 맡깁니다. 당신이 그것을 실행하지 않으려면 당신은 SQL을 볼 수있는 단지 있도록 디버그 모드 플래그를 추가 한

CREATE PROC DynamicUpdateSQLFromFieldList @Field1 VARCHAR(50) = NULL, 
              @Field2 VARCHAR(50) = NULL, 
              @Field3 VARCHAR(50) = NULL, 
              @RunMe BIT = 0 
AS 
BEGIN 

DECLARE @SQL AS VARCHAR(1000); 

    SELECT @SQL = 'UPDATE Temp 
        SET Temp.RECID = Phy.RECID 
        FROM TempTable Temp 
        INNER JOIN Physicians Phy ON ' + 
        COALESCE('Phy.' + @Field1 + ' = Temp.' + @Field1 + ' AND ', '') + 
        COALESCE('Phy.' + @Field2 + ' = Temp.' + @Field2 + ' AND ', '') + 
        COALESCE('Phy.' + @Field3 + ' = Temp.' + @Field3, '') + ';'; 

    IF @RunMe = 0    
     SELECT @SQL AS SQL; 
    ELSE 
     EXEC(@SQL) 

END 

:이 코드의 경우, 나는 시저는 세 개의 필드을했다. 따라서, 예를 들어, 실행하는 경우 :

EXEC DynamicUpdateSQLFromFieldList @field1='col1', @field2='col2', @field3='col3' 

또는

EXEC DynamicUpdateSQLFromFieldList @field1='col1', @field2='col2', @field3='col3', @RunMe=0 

가 생성되는 SQL이 될 것입니다 :

UPDATE Temp 
SET Temp.RECID = Phy.RECID 
FROM TempTable Temp INNER JOIN Physicians Phy 
ON Phy.col1 = Temp.col1 AND 
    Phy.col2 = Temp.col2 AND 
    Phy.col3 = Temp.col3; 

이 라인을 실행하는 경우 :

EXEC DynamicUpdateSQLFromFieldList @field1='col1', @field2='col2', @field3='col3', @RunMe=1 

을 업데이트를 수행합니다. 보다 안전하기를 원한다면 들어오는 필드 이름을 sys 테이블에 대해 화이트리스트를 작성하여 코드를 실행하기 전에 컬럼이 각 테이블에 실제로 존재하는지 확인할 수 있습니다.