2016-10-05 11 views
2

여기서는 DBA가 변수 수준에서 열 이름 만 변경해야하는 동적 쿼리를 만듭니다.이 이유는 여러 DB가 있기 때문입니다. 끔찍하게 만들어졌으며 동일한 데이터를 가지고 있더라도 열 이름이 서로 바뀝니다 (둘 사이에 정규화가 없음).변수를 통해 열 이름을 할당해야합니다. SQL

나는 약 400 줄을 가지고 있으며 내가 피하려고하는 것은 다른 DBA에게 로직을 전달하고 스크립트를 통해 모든 컬럼 이름을 대체해야한다는 것입니다.하지만 대신에 그냥 해당 DB에서 일치하는 열 이름을 논리에 할당하십시오. 가능한지 확실하지 않습니다.

은 예입니다

Declare @ColumnA 
Declare @ColumnB 
set @ColumnA = 'UserID' 
set @ColumnB = 'Salary' 

select @ColumnA,@ColumnB from Table 

이 어떻게 이런 종류의 기능을 달성 할 수 있습니까?

+0

이것은 동적 SQL 없이는 가능하지 않으며 400 행 쿼리를 동적 SQL로 변환하지 않는 것이 좋습니다. Ctrl + H는 훨씬 쉬워진다. – ZLK

+0

'User'가'int' 변수에 어떻게 저장 될지 예상합니다. : D – Andrew

+0

하하 당신 말이 맞아요, 그냥 요점을 만들려고했지만, 열 이름, 아니 데이터를 볼 수있는 쿼리가 필요합니다 .. –

답변

3

당신은 그와 같은 동적 SQL을 사용할 수 있습니다

DECLARE @ColumnA nvarchar(max), 
     @ColumnB nvarchar(max), 
     @table nvarchar(max) 
     @sql nvarchar(max) 

SELECT @ColumnA = N'UserID', 
     @ColumnB = N'Salary', 
     @table = N'Table' 

SELECT @sql = N'SELECT ' +QUOTENAME(@ColumnA)+','+QUOTENAME(@ColumnB)+ ' FROM '+QUOTENAME(@table) +';' 

EXEC sp_executesql @sql 

이러한 상황에서 QUOTENAME를 사용하는 것이 좋습니다, 당신은 주사에서 저장됩니다, 또는 공백 열 이름 내부.

QUOTENAME - 입력 문자열을 유효한 SQL Server 구분 식별자로 만들기 위해 구분 기호가 추가 된 유니 코드 문자열을 반환합니다. nvarchar(258)을 반환하십시오. 따라서 UserID[UserID]이되었습니다.

1

단일 변수 만 있으면 필요한 열을 쉼표로 구분하여 전달하면됩니다. 그런 다음 예상 된 결과에 대해 아래의 동적 스크립트를 사용하십시오.

DECLARE @Columns nvarchar(max), 
     @sql nvarchar(max) 

SELECT @Columns = N'UserID,Salary' 

SELECT @sql = N'SELECT ' [email protected]+ ' FROM YourTable' 

EXEC sp_executesql @sql 
0

동적 쿼리를 만들었습니다. 변수에 대해 열과 테이블 이름을 지정할 수 있습니다.

  Declare @ColumnA Varchar(50) 
      Declare @ColumnB Varchar(50) 
      Declare @tablename Varchar(50) 

      set @ColumnA = 'UserID' 
      set @ColumnB = 'Salary' 
      set @tablename = '#table' 

      declare @Query nvarchar(max) 

      set @Query='select '[email protected]+','[email protected]+' 
        FROM '[email protected]+' (NOLOCK)' 

      -- print @Query -- to see desired query. 

      execute SP_executesql @Query 

우려되는 점이 있으면 알려 주시기 바랍니다.