2016-10-25 3 views
2

동적 SQL을 생성하여 함수의 값을 변수에 할당하려고합니다. 내가동적 SQL에서 함수가 반환 한 값 할당

Select @[email protected]_Dept 
from dbo.WorkHistory(@today,@EID) 

기능은 날짜를 반환과 같은 SQL 뭔가를 생성하기 위해 노력하고 내가 @StartDate에 할당해야합니다 (@EID_dept은 함수에 의해 반환 된 컬럼의 이름이됩니다). @EID_Dept는 @EID와 @dept를 연결하여 생성됩니다. 내가 수동으로 내 코드는 다음과 같습니다

Select @StartDate = amaan_IT 
from dbo.WorkHistory('2016-10-10', amaan) 

대로 나타납니다 SQL을 작성하는 경우

는 :

DECLARE @EID varchar(5), @StartDate VARCHAR(MAX), 
     @today DATETIME, @dept VARCHAR(10), @EID_dept varchar(20); 

Select @today = SYSDATETIME() 
Select @dept = dept from dbo.Dept(@EID) 
Select @EID_Dept = CONCAT(@EID, @dept) 

DECLARE @SQL Varchar(max); 
SET @SQL = N'Select @StartDate = @EID_Dept 
      from dbo.PeriodHistory(@today, @EID)'; 

EXEC Sp_executesql 
    @SQL, 
    N'@StartDate VARCHAR(MAX) out,@EID_dept varchar(max),@today datetime,@EID Varchar', 
    @StartDate out, 
    @[email protected]_Dept, 
    @[email protected] 
+4

왜 동적 SQL을 사용하고 있습니까? 이 일을 더 어렵게하는 것 외에는 아무 것도하지 않습니다. –

+0

변수를 사용하여 객체 이름을 할당 할 수 없으므로 SET @SQL = CONCAT (N'SELECT @StartDate = ', @EID_Dept,'FROM dbo.PeriodHistory (@Today, @EID); ')를 사용해야합니다. 이것은 이상적인 것으로는 보이지 않지만, 나는 이것이 최선의 방법이라고 확신하지 못합니다. – GarethD

+0

EID가 변경 될 것이므로 함수에서 데이터를 가져 오기 위해 EID n Dept를 연결해야합니다. EID를 사용하여 Dept를 찾아서 연결해야합니다. –

답변

1

나는 쿼리 조금 변경되었습니다. 이 잘 작동 희망 :

내가 @SQL에 대한 nvarchar(max)을 사용
DECLARE @EID nvarchar(5), 
     @StartDate nvarchar(MAX), 
     @today datetime = SYSDATETIME(), 
     @dept nvarchar(10), 
     @EID_dept nvarchar(20), 
     @SQL nvarchar(max), 
     @params nvarchar(max) = N'@StartDate nvarchar(MAX) out, @today datetime, @EID nvarchar(5)' 

Select @dept = dept from dbo.Dept(@EID) 
Select @EID_Dept = CONCAT(@EID, @dept) 

SET @SQL = N'Select @StartDate = ' + QUOTENAME(@EID_dept) + ' from dbo.PeriodHistory(@today, @EID);'; 

EXEC sp_executesql @SQL, 
        @params, 
        @StartDate = @StartDate out, 
        @today = @today, 
        @EID = @EID 

SELECT @StartDate 

(당신이 varchar를 사용하지만 N를 추가 할 때 변수에 할당 값). sp_executesql

은 Transact-SQL 문 또는 일괄 처리를 포함하는 유니 코드 문자열입니다 nvarchar 부분 문 에서 기다리고 있습니다.

변수는 모두 @params입니다.

@EID_dept을 기반으로 다른 열을 가져와야하므로 QUOTENAME을 추가하고 SQL 문을 직접 작성하는 데이 변수를 사용했습니다. 변수로 열 이름을 보낼 수 없습니다.