2012-07-05 2 views
0

DB가 있다고 가정 해 봅시다. 이 데이터베이스를 Utils라고 부르 자. Utils에는 2 가지 기능이 있습니다. 좋아, 내가 db MyDatabase에서 현재 일한다고 말할 수있다. 테이블의 일부 필드를 계산해야합니다. 이것은 어떻게 현재 그것을 할 수 있습니다 : 내 select 문이 다음과 같은열의 함수를 두 번 실행

SELECT *, 
    column1= UTILS.dbo.Function1(ID) 
    column2 =UTILS.dbo.Function1(Name 
    column3 =UTILS.dbo.Function1(Address) 
INTO ##temp_table1 
FROM MyDatabase.dbo.Customers 


SELECT *, 
    column1= UTILS.dbo.Function2(ID) 
    column2 =UTILS.dbo.Function2(Name 
    column3 =UTILS.dbo.Function2(Address) 
INTO ##temp_table2 
FROM MyDatabase.dbo.Customers 

문제처럼 보이는 것은 그냥 3 열 calcualted 할 필요가 없다는 것입니다. 그래서 나는 정말로 select 문을 두 번 반복하고 싶지 않습니다. 왜냐하면 변경이 발생하면 오류가 발생하기 쉬운 두 장소에서 그것을 변경해야하고, 스크립트를 매우 길게 읽고 읽기가 어렵 기 때문입니다. . 내가 sp_rename를 사용하는 데이터베이스를 변경해야하기 때문에

내 솔루션

USE Utils; GO;  
    DECLARE @strSQL VARCHAR(MAX) 
    SET @strSQL = '  
     SELECT *, 
       column1= UTILS.dbo.temp_function(ID) 
       column2 =UTILS.dbo.temp_function(Name 
       column3 =UTILS.dbo.temp_function(Address) ' 

    exec sp_rename 'UTILS.dbo.Function1' ,'temp_function' 
    exec (@strSQL + 'into temp_table1 FROM Customers') 
    exec sp_rename 'temp_function' ,'UTILS.dbo.Function1' 

    exec sp_rename 'UTILS.dbo.Function2' ,'temp_function' 
    exec (@strSQL + 'into temp_table2 FROM Customers') 
    exec sp_rename 'temp_function' ,'UTILS.dbo.Function2' 

하지만이 솔루션처럼 해달라고. 그것은 또한 나에게주의를 준다. MSDN은 이에 대해 조언합니다.

이 문제를 극복하는 좋은 방법은 무엇입니까?

+0

나에게 보인다. 데이터베이스와 객체 이름에 대해 "강력한 입력"을 유지하는 것은 유지하기가 매우 쉬운 100 개의 추가 코드 행보다 훨씬 낫습니다. –

+0

EF 또는 LINQ to SQL과 같은 자동 gen'ed 클래스 세트가있는 응용 프로그램 계층이 아니라 DB에서 수행해야하는 경우 sys 스키마를 사용하는 것이 가장 쉬운 방법이라고 생각합니다. 전체 솔루션을 작성하지 않고 sys.columns를 sys.tables에 조인하는 쿼리를 반복하는 커서를 작성하고 결과를 얻기 위해 exec() 할 수있는 문자열을 작성합니다. –

답변

0

당신은 쉽게 다음과 같이 솔루션을 변경하여 sp_rename을 사용하지 않도록 할 수 있습니다 약간의 빛 복사/붙여 넣기 작업을 할 때마다 쿼리 한 변화를 필요 같은

USE Utils; GO;  
DECLARE @strBaseSQL VARCHAR(MAX) 
     ,@strSQL VARCHAR(MAX) 

SET @strBaseSQL = '  
    SELECT *, 
      column1= UTILS.dbo.temp_function(ID) 
      column2 =UTILS.dbo.temp_function(Name 
      column3 =UTILS.dbo.temp_function(Address) ' 

SELECT @strSQL = REPLACE(@strBaseSQL, 'UTILS.dbo.temp_function', 'UTILS.dbo.function1') 
EXEC (@strSQL + 'into temp_table1 FROM Customers') 

SELECT @strSQL = REPLACE(@strBaseSQL, 'UTILS.dbo.temp_function', 'UTILS.dbo.function2') 
EXEC (@strSQL + 'into temp_table2 FROM Customers')