2009-04-22 3 views
0

테이블 이름이 지정된 함수에서 뷰 이름을 매개 변수로 전달하고 동적 SQL을 작성하고 sp_executesql()을 실행하여 뷰에서 일부 데이터를 가져 오려고합니다. 함수를 실행하려고하면 오류가 발생합니다. 함수와 확장 저장 프로 시저 만 함수 내에서 실행할 수 있습니다.테이블 값 함수의 동적 뷰 이름

DBMS : 2005

대안은 SQL 서버?

set @SQLString = 
     N'select @Desc = Description from ' 
    + @TableName 
    + ' where Code = @Code;' 

execute sp_executesql @SQLString, 
    N'@Code nvarchar(500), 
     @Desc nvarchar(500) OUTPUT', 
     @Code = @Code, 
     @[email protected] OUTPUT; 

답변

1

글쎄, 확장 저장 프로 시저에서 동적 SQL을 래핑 할 수 있습니다. 그게 효과가 있지만, 나는 그것을 (강력하게) 권고하고 싶습니다.

SQL Server에서는 위에서 정의한 확장 저장 프로 시저를 제외하고는 사용자 정의 함수가 결정적이어야합니다. 즉, 함수 결과가 입력 매개 변수에서 일정하게 예측 가능해야합니다. 저장 프로 시저는 임의의 위치에서 데이터에 액세스 할 수 있으므로 임의의 숫자 등을 사용하므로 SQL Server는 함수 내에서 저장 프로 시저를 사용할 수 없습니다.

성능 요구 사항 및 스키마 설정 방법에 따라 데이터로 테이블 변수를 미리 채우거나 스키마를 수정하는 등의 다른 방법을 사용할 수 있습니다.

0

이 같은 xp_cmdshell을

뭔가 같은 확장 시저를 호출하여 루프백 쿼리를 수행하려는 경우가 아니면, 당신의 요구에 맞게 수정없이

CREATE FUNCTION fnBla(@id int) 
RETURNS int 
AS 
BEGIN 
DECLARE @SQL varchar(500) 
SELECT @SQL='osql -S' [email protected]@servername +' -E -q "exec tempdb..prLog ''fnBla''"' 
EXEC master..xp_cmdshell @SQL 
RETURN @id 
END 

당신이 알고있는 나는이 작업을 수행 할 것이다 너무 이 방법은 루프백 쿼리를 생성하고 가장 안전한 코드를 실행하지 않기 때문에 함수 대신 proc을 사용할 수없는 이유가 무엇입니까?

+0

당신을 혼란 시키려고하지 않았습니다. (심지어 그것을하는 것을 기억하지 마십시오. 반드시 클릭해야합니다.) 지금 잠겨 있습니다. 미안합니다. – RMD