복붙노트

[SQL] 펑션에서 저장 프로 시저를 실행합니다

SQL

펑션에서 저장 프로 시저를 실행합니다

나는이 죽음에 요청 받았다 알고, SQL 서버는 당신이 그것을하지 않는 이유를 나는 알고있다.

하지만이에 대한 해결 방법은 확장 저장 프로 시저를 사용하는 것보다 다른, 거기?

그리고 프로 시저에 내 기능을 변환 말하지 말아주세요 ...

그래서 정말 부탁 해요 것은 : 함수 내에서 저장 프로 시저를 실행하는 방법은 없나요?

편집하다:

주위에 방법이 있지만, 나는 그것을 할 것이다 잘못 그래서는 다음과 같습니다 포인트 입증. 내가 저장 프로 시저로 변경하고 다른 곳을 실행할거야.

해결법

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

    1.편집 : 내가 그것을 위해 보증 할 수 나는이 시도하지 않은! 그리고 당신은 이미 당신이이 일을하지 말아야 알고, 그래서 그것을하지 마십시오. 그러나...

    편집 : 내가 그것을 위해 보증 할 수 나는이 시도하지 않은! 그리고 당신은 이미 당신이이 일을하지 말아야 알고, 그래서 그것을하지 마십시오. 그러나...

    여기 찾고보십시오 : http://sqlblog.com/blogs/denis_gobo/archive/2008/05/08/6703.aspx

    중요한 비트는 내가 당신의 목적을 위해 조정할 시도이 비트입니다 :

    DECLARE @SQL varchar(500)
    
    SELECT @SQL = 'osql -S' +@@servername +' -E -q "exec dbName..sprocName "'
    
    EXEC master..xp_cmdshell @SQL
    
  2. ==============================

    2.기능은 테이블 내용을 변경하는 등의 부작용을 할 수 없습니다.

    기능은 테이블 내용을 변경하는 등의 부작용을 할 수 없습니다.

    저장 프로 시저입니다.

    함수가 저장 프로 시저를 호출하는 경우, 함수는 부작용을 가질 수 될 것입니다.

    그래서 미안하지만, 당신은 함수에서 저장 프로 시저를 호출 할 수 없습니다.

  3. ==============================

    3.또 다른 옵션은, OPENQUERY 및 xp_cmdshell을을 사용하는 것 외에도, SQLCLR (SQL 서버의 "CLR 통합"기능)를 사용하는 것입니다. 뿐만 아니라 그 다른 두 가지 방법보다 SQLCLR 옵션 더 안전하지만, 같은, 어떤 세션 기반 개체 또는 설정에 액세스 할 수있을 것 같은 것을 현재 세션에서 저장 프로 시저를 호출 할 수있는 잠재적 혜택도 있습니다 :

    또 다른 옵션은, OPENQUERY 및 xp_cmdshell을을 사용하는 것 외에도, SQLCLR (SQL 서버의 "CLR 통합"기능)를 사용하는 것입니다. 뿐만 아니라 그 다른 두 가지 방법보다 SQLCLR 옵션 더 안전하지만, 같은, 어떤 세션 기반 개체 또는 설정에 액세스 할 수있을 것 같은 것을 현재 세션에서 저장 프로 시저를 호출 할 수있는 잠재적 혜택도 있습니다 :

    이를 이용함으로써 달성 될 수있다 "컨텍스트 연결 해당 = 「 ConnectionString에있다. 그냥 T-SQL 사용자 정의 함수에 배치 다른 모든 제한 (즉, 어떤 부작용이있을 수 없습니다) 적용됩니다 것을 명심하십시오.

    당신이 (즉, 문맥 연결을 사용하지 않는) 일반 연결을 사용하는 경우, 그것은 OPENQUERY와 xp_cmdshell을 방법을 사용하는 경우가 않습니다처럼 독립적 인 통화로 작동합니다.

    그러나 저장 프로 시저를 호출하는 기능을 사용할 경우 1 개 이상의 행에 영향을 미치는 문에 (에 관계없이 사용하는 3 개주의 방법 중 어느 것이), 다음 동작이 한 번 실행 할 것으로 예상 할 수 없다는 점에 유의하시기 바랍니다 행 당. @MartinSmith이 MatBailie의 대답 @의 댓글에서 언급 한 바와 같이, 쿼리 최적화 프로그램은 타이밍 또는 함수의 실행의 수 중 하나를 보증하지 않습니다. 하지만 당신은) (A SET @variable에 = 기능을 사용하는 경우, 진술 또는 함수 FROM SELECT * (); 쿼리, 그것은 확인을해야합니다.

    저장 프로 시저 (I이 쓴) 다음 문서에 도시되고 실행 닷넷 / C # SQLCLR 유저 정의 함수를 사용하는 예 :

    SQLCLR 레벨의 계단 2 : 샘플 저장 프로 시저 및 함수

  4. ==============================

    4.여기에 또 다른 가능한 해결 방법은 다음과 같습니다

    여기에 또 다른 가능한 해결 방법은 다음과 같습니다

    if exists (select * from master..sysservers where srvname = 'loopback')
        exec sp_dropserver 'loopback'
    go
    exec sp_addlinkedserver @server = N'loopback', @srvproduct = N'', @provider = N'SQLOLEDB', @datasrc = @@servername
    go
    
    create function testit()
        returns int
    as
    begin
        declare @res int;
        select @res=count(*) from openquery(loopback, 'exec sp_who');
        return @res
    end
    go
    
    select dbo.testit()
    

    그것은 xp_cmdshell을 정도로 무서운 아니다뿐만 아니라 실제 사용에 너무 많은 의미를 가지고있다.

  5. ==============================

    5.나는이 문제에 대한 해결책을 알아 낸. 우리는 다음 정상적으로 실행할 수있는 저장 프로 시저 "렌더링"SQL과 기능 또는보기를 구축 할 수 있습니다.

    나는이 문제에 대한 해결책을 알아 낸. 우리는 다음 정상적으로 실행할 수있는 저장 프로 시저 "렌더링"SQL과 기능 또는보기를 구축 할 수 있습니다.

    다른 SPROC를 1.Create

    CREATE PROCEDURE [dbo].[usp_FunctionBuilder]
    DECLARE @outerSql VARCHAR(MAX)
    DECLARE @innerSql VARCHAR(MAX)
    

    당신이 당신의 함수에서 실행하고자하는 동적 SQL을 2.Build (예 : 루프와 노동 조합을 사용할 수 있습니다, 다른 SPROC에서 읽을 수 사용하는 경우 조건부 SQL, 등 제표 및 매개 변수)

    SET @innerSql = 'your sql'
    

    3.Wrap은의 @innerSql 기능 문을 작성하고 그들이 생성 된 함수에 전달 될 수 있도록 당신이 @innerSql에 사용되는 것으로, 외부의 매개 변수를 정의합니다.

    SET @outerSql = 'CREATE FUNCTION [dbo].[fn_GeneratedFunction] ( @Param varchar(10))
    RETURNS TABLE
    AS
    RETURN
    ' + @innerSql;
    
    
    EXEC(@outerSql)
    

    이것은 단지 의사 만의 해결책을 해결해 인 등 연결된 서버 제한, 매개 변수, 함수에서 동적 SQL 동적 서버 / 데이터베이스 / 테이블 이름, 루프, 등 많은 문제

    당신은 당신의 필요에 맞게 조정할 필요가있을 것이다 (예 : 함수에서 리턴 변경)

  6. from https://stackoverflow.com/questions/6344880/execute-stored-procedure-from-a-function by cc-by-sa and MIT license