programing

함수에서 저장 프로시저 실행

newstyles 2023. 7. 3. 22:37

함수에서 저장 프로시저 실행

이 문제가 해결되지 않은 것으로 알고 있으며 SQL Server에서 이 문제를 해결하지 못하는 이유도 알고 있습니다.

그러나 확장 저장 프로시저를 사용하는 것 외에 이에 대한 해결 방법이 있습니까?

그리고 제발 제 기능을 수술로 바꾸라고 하지 마세요...

그래서 제가 정말로 묻고 싶은 것은: 함수 내에서 저장 프로시저를 실행할 수 있는 방법이 있는가 하는 것입니다.

편집:

증명된 요점: 그것을 피할 방법이 있지만, 그것은 너무 잘못되어 나는 그것을 하지 않을 것입니다.저장 프로시저로 변경하여 다른 곳에서 실행할 것입니다.

편집: 저는 이것을 먹어본 적이 없어서 장담할 수 없습니다!그리고 당신은 이미 이런 짓을 해서는 안 된다는 것을 알고 있으니 제발 하지 마세요. 하지만...

여기를 확인해 보십시오: 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

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

저장 프로시저는.

저장 프로시저라고 하는 기능이 있으면 그 기능은 부작용을 일으킬 수 있습니다.


죄송합니다. 함수에서 저장 프로시저를 호출할 수 없습니다.

OPENQUERY 및 xp_cmdshell을 사용하는 것 외에도 SQLCLR(SQL Server의 "CLR 통합" 기능)을 사용하는 것이 또 다른 옵션입니다.SQLCLR 옵션은 다른 두 가지 방법보다 안전할 뿐만 아니라 다음과 같은 세션 기반 개체나 설정에 액세스할 수 있도록 현재 세션의 저장 프로시저를 호출할 수 있다는 잠재적인 이점도 있습니다.

  • 임시 테이블
  • 임시 저장 프로시저
  • CONTEX_INFO

연결 문자열로 "http connection = true;"를 사용하여 이 작업을 수행할 수 있습니다.T-SQL User-Defined Functions에 대한 다른 모든 제한이 적용됩니다(즉, 부작용이 있을 수 없음).

일반 연결을 사용하는 경우(즉, 컨텍스트 연결을 사용하지 않는 경우) OPENQUERY 및 xp_cmdshell 메서드를 사용하는 경우와 마찬가지로 독립적인 호출로 작동합니다.

그러나 하나 이상의 행에 영향을 주는 문에서 저장 프로시저를 호출하는 함수를 사용할 경우(사용하는 세 가지 방법 중 어떤 것을 사용하든 상관없이), 동작은 행당 한 번 실행될 수 없습니다.@MartinSmith가 @MatBailie의 답변에 대한 코멘트에서 언급했듯이, Query Optimizer는 함수의 실행 시기나 횟수를 보장하지 않습니다.하지만 만약 당신이 그것을 사용한다면.SET @Variable = function();진술서 또는SELECT * FROM function();쿼리, 그러면 괜찮을 것입니다.

.NET / C# SQLCLR 사용자 정의 함수를 사용하여 저장 프로시저를 실행하는 예는 다음 문서에 나와 있습니다(제가 작성했습니다).

SQLCLR 레벨 2로 가는 계단: 샘플 저장 절차 및 기능

다음은 가능한 다른 해결 방법입니다.

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실용적으로 사용하기에는 너무 많은 의미가 있습니다.

저는 이 문제에 대한 해결책을 찾았습니다.저장 프로시저에서 "rendered" sql을 사용하여 Function 또는 View를 구축하여 정상적으로 실행할 수 있습니다.

1.다른 저장 프로시저 만들기

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

2. 함수에서 실행할 동적 SQL을 빌드합니다(예: 루프 및 유니언을 사용할 수 있고, 다른 저장 프로시저에서 읽을 수 있으며, 조건부 SQL에 대한 if 문 및 매개 변수를 사용할 수 있습니다).

SET @innerSql = 'your sql'

3. @innerSql을 create function 문으로 래핑하고 생성된 함수로 전달될 수 있도록 @innerSql에서 사용한 외부 매개 변수를 정의합니다.

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


EXEC(@outerSql)

이것은 단지 의사 코드일 뿐이지만, 이 솔루션은 연결된 서버 제한, 매개 변수, 동적 SQL 함수, 동적 서버/데이터베이스/테이블 이름, 루프 등과 같은 많은 문제를 해결합니다.

필요에 따라 조정해야 합니다(예: 함수의 반환 변경).

언급URL : https://stackoverflow.com/questions/6344880/execute-stored-procedure-from-a-function