복붙노트

[SQL] 함수 (SQL 서버) 내에서 동적 SQL을 실행할 때 오류를 얻기?

SQL

함수 (SQL 서버) 내에서 동적 SQL을 실행할 때 오류를 얻기?

나는 동적 SQL을 실행하고 값을 반환하는 함수를 만들 수 있습니다. 나는 "오직 기능을 일부 확장 저장 프로 시저는 함수 내에서 실행할 수 있습니다."무엇입니까 오류로.

함수:

Create Function fn_GetPrePopValue(@paramterValue nvarchar(100))
returns int as
begin
declare @value nvarchar(500);

Set @SQLString  = 'Select Grant_Nr From Grant_Master where grant_id=' + @paramterValue

exec   sp_executesql
       @query = @SQLString,       
       @value = @value output

return @value   
end 

실행 :

Select dbo.fn_GetPrePopValue('10002618') from Questions Where QuestionID=114

과:

Select fn_GetPrePopValue('10002618') from Questions Where QuestionID=114

함수가 제대로 호출 또는 기능이 잘못되고 있습니까?

해결법

  1. ==============================

    1.당신은 어느 쪽을 호출 할 수 없습니다, 함수에서 동적 SQL을 사용할 수 없습니다 저장 프로 시저.

    당신은 어느 쪽을 호출 할 수 없습니다, 함수에서 동적 SQL을 사용할 수 없습니다 저장 프로 시저.

    Create proc GetPrePopValue(@paramterValue nvarchar(100))
    as
    begin
    declare @value nvarchar(500),
            @SQLString nvarchar(4000)
    
    Set @SQLString = 'Select @value = Grant_Nr From Grant_Master where grant_id = @paramterValue'
    
    exec sp_executesql @SQLString, N'@paramterValue nvarchar(100)', 
           @paramterValue, 
           @value = @value output
    
    return @value   
    end 
    
  2. ==============================

    2.기능은 사용자가 실수로 끔찍한 성능을 제공 무언가를 만들기없이 쿼리에서 사용할 수 그래서, 그들이 사용 할 수있는 제한됩니다. 동적 쿼리를 사용하여 그 쿼리 계획의 일부가 될 수있는에서 기능을 유지하는 것 또한 각 실행에 대한 쿼리 계획을 일으키지 것처럼, 그런 것들 중 하나입니다.

    기능은 사용자가 실수로 끔찍한 성능을 제공 무언가를 만들기없이 쿼리에서 사용할 수 그래서, 그들이 사용 할 수있는 제한됩니다. 동적 쿼리를 사용하여 그 쿼리 계획의 일부가 될 수있는에서 기능을 유지하는 것 또한 각 실행에 대한 쿼리 계획을 일으키지 것처럼, 그런 것들 중 하나입니다.

    당신은 값을 반환,이 경우 모두에서 동적 쿼리가 필요하지 않습니다 :

    Create Function fn_GetPrePopValue(@paramterValue nvarchar(100))
    returns int as
    begin
    
    return (select Grant_Nr From Grant_Master where grant_id = @paramterValue)
    
    end 
    
  3. ==============================

    3.난 당신이 함수에서 동적 SQL을 사용할 수 있습니다 생각도 난 당신이 귀하의 경우에 필요가 있다고 생각하지 않습니다. 외모는 가까운이 뭔가를 원하는 좋아 :

    난 당신이 함수에서 동적 SQL을 사용할 수 있습니다 생각도 난 당신이 귀하의 경우에 필요가 있다고 생각하지 않습니다. 외모는 가까운이 뭔가를 원하는 좋아 :

    Create Function dbo.fn_GetPrePopValue(@paramterValue nvarchar(100))
    returns int as
    begin
      declare @value int
      declare @SQLString varchar(MAX)
    
      Select @value=Grant_Nr From Grant_Master where grant_id=@paramterValue
    
      return @value
    end 
    

    SQL 바이올린 데모

    또한, 당신이 필드가 올바른지있어 확인하기 위해 데이터 유형을 확인하십시오. 이드하는 VARCHAR 전달하고 다른 필드 int를 반환 이상하게 보인다. 어느 쪽이든, 이것은 당신이 올바른 방향으로 가야 도움이 될 것입니다.

  4. from https://stackoverflow.com/questions/15180561/getting-an-error-when-executing-a-dynamic-sql-within-a-function-sql-server by cc-by-sa and MIT license