SQL Server의 함수와 저장 프로 시저


830

함수와 저장 프로 시저를 꽤 오랫동안 배우고 있지만 함수와 저장 프로 시저를 사용해야하는 이유와시기를 모르겠습니다. 그들은 나에게 똑같아 보인다. 어쩌면 나는 그것에 대해 초보자이기 때문이다.

왜 그런지 말해 줄 수 있습니까?





3
속도는 어때? 어느 것이 더 빠른 쿼리를 실행합니까?
AmiNadimi 2019

답변:


709

함수는 계산 된 값이며 영구적 인 환경 변경을 수행 할 수 없습니다 SQL Server(예 : 허용 되지 INSERT않거나 UPDATE설명이 허용 되지 않음 ).

함수가 SQL스칼라 값을 리턴하면 명령문 에서 인라인으로 사용 되거나 결과 세트를 리턴하면 결합 될 수 있습니다.

답변을 요약 한 주석에서 주목할 가치가있는 점. @Sean K Anderson 덕분에 :

함수는 컴퓨터 과학 정의에 따라 값을 반환해야하며 매개 변수 (인수)로받은 데이터를 변경할 수 없습니다. 함수는 아무것도 변경할 수 없으며 적어도 하나의 매개 변수가 있어야하며 값을 반환해야합니다. 저장된 proc는 매개 변수를 가질 필요가 없으며 데이터베이스 오브젝트를 변경할 수 있으며 값을 리턴 할 필요가 없습니다.

SQL저장 프로 시저에서 함수 를 호출하는 방법 과 저장 프로 시저 대신 함수를 사용하는 경우

안녕하세요 친구 여러분, 오늘 우리는 저장 프로 시저 사용시기와 기능 사용시기에 대해 논의 할 것입니다. 간단한 팀에서 일부 값을 계산하고 단일 값을 반환하면 필요하지 않습니다.

https://programmingtechtutorial.blogspot.com/2020/01/when-use-storeprocedure-and-when-use.html


13
기본적으로 DML은 허용되지 않습니까?
david blaine

173
함수는 반드시 값을 반환해야하며 매개 변수 (인수)로받는 데이터를 변경할 수 없다는 점에서 컴퓨터 과학 정의를 따릅니다. 함수는 아무것도 변경할 수 없으며 적어도 하나의 매개 변수가 있어야하며 값을 반환해야합니다. 저장된 proc는 매개 변수를 가질 필요가 없으며 데이터베이스 오브젝트를 변경할 수 있으며 값을 리턴 할 필요가 없습니다.
Sean Anderson

23
실제로 로컬 테이블 변수를 수정하기 위해 함수에 INSERT, UPDATE 및 DELETE 문을 가질 수 있습니다.
Ani

14
@Ani-함수에서 여러 개의 로컬 변수를 인스턴스화하고 수정할 수 있지만 함수 범위 밖에서는 아무것도 수정할 수 없습니다.
MyItchyChin

40
@SeanKAnderson 함수 "적어도 하나 이상의 매개 변수가 있어야합니다"는 사실이 아닙니다.
liang

623

SP와 UDF의 차이점은 다음과 같습니다.

+---------------------------------+----------------------------------------+
| Stored Procedure (SP)           | Function (UDF - User Defined           |
|                                 | Function)                              |
+---------------------------------+----------------------------------------+
| SP can return zero , single or  | Function must return a single value    |
| multiple values.                | (which may be a scalar or a table).    |
+---------------------------------+----------------------------------------+
| We can use transaction in SP.   | We can't use transaction in UDF.       |
+---------------------------------+----------------------------------------+
| SP can have input/output        | Only input parameter.                  |
| parameter.                      |                                        |
+---------------------------------+----------------------------------------+
| We can call function from SP.   | We can't call SP from function.        |
+---------------------------------+----------------------------------------+
| We can't use SP in SELECT/      | We can use UDF in SELECT/ WHERE/       |
| WHERE/ HAVING statement.        | HAVING statement.                      |
+---------------------------------+----------------------------------------+
| We can use exception handling   | We can't use Try-Catch block in UDF.   |
| using Try-Catch block in SP.    |                                        |
+---------------------------------+----------------------------------------+

21
함수는 하나의 값 또는 집합을 반환해야합니다.
Rafareino

8
이것은 3 년 후에 나왔지만 읽기 쉽고 광범위하기 때문에 맨 위에 있어야합니다.
DanteTheSmith

SP는 임시 테이블과 테이블 변수를 모두 사용할 수있는 반면 UDF는 테이블 변수 만 사용할 수 있습니다. 테이블 변수는 인덱스를 사용할 수 없습니다. UDF는 SP 달리 적용 크로스를 호출 할 수 있습니다
루도빅 오베르

190

함수와 저장 프로시 저는 별도의 목적으로 사용됩니다. 최상의 비유는 아니지만 함수는 문자 그대로 모든 프로그래밍 언어에서 사용하는 다른 함수로 볼 수 있지만 저장된 procs는 개별 프로그램이나 배치 스크립트와 비슷합니다.

함수에는 일반적으로 출력이 있으며 선택적으로 입력이 있습니다. 그런 다음 출력을 다른 함수 (DATEDIFF, LEN 등의 SQL Server 내장)에 대한 입력으로 사용하거나 SQL 쿼리에 대한 조건 자로 사용할 수 있습니다 (예 : SELECT a, b, dbo.MyFunction(c) FROM table또는) SELECT a, b, c FROM table WHERE a = dbo.MyFunc(c).

저장된 proc는 SQL 쿼리를 트랜잭션에 묶고 외부 세계와 인터페이스하는 데 사용됩니다. ADO.NET 등과 같은 프레임 워크는 함수를 직접 호출 할 수 없지만 저장된 proc을 직접 호출 할 수 있습니다.

함수에는 숨겨진 위험이 있습니다. 잘못 사용되어 다소 불쾌한 성능 문제가 발생할 수 있습니다.

SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)

MyFunction이 다음과 같이 선언 된 위치 :

CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
   DECLARE @retval INTEGER

   SELECT localValue 
      FROM dbo.localToNationalMapTable
      WHERE nationalValue = @someValue

   RETURN @retval
END

여기서 발생하는 것은 MyFunction 함수가 MyTable 테이블의 모든 행에 대해 호출된다는 것입니다. MyTable에 1000 개의 행이 있으면 데이터베이스에 대한 또 다른 1000 개의 임시 쿼리입니다. 마찬가지로, 열 스펙에 지정된 경우 함수가 호출되면 SELECT에 의해 리턴 된 각 행에 대해 함수가 호출됩니다.

따라서 신중하게 작성 기능이 필요합니다. 함수의 테이블에서 SELECT를 수행하는 경우 상위 스토어드 프로 시저의 JOIN 또는 다른 SQL 구문 (예 : CASE ... WHEN ... ELSE ... 종료).


2
"ADO.NET 등과 같은 프레임 워크 등에서 함수를 직접 호출 할 수 없습니다"에 대해 자세히 설명해 주시겠습니까? 문제없이 ADO.NET 데이터 공급자로 기능을 실행했습니다.
이안 켐

24
일부 SELECT 문을 통해 함수를 호출해야합니다. 함수는 자체적으로 독립적 인 코드 조각으로 호출 될 수 없습니다. SQL 문이 더 이상없는 경우에도 더 큰 SQL 문의 일부로 호출되어야합니다. 보다 SELECT * from dbo.MyTableValuedFunction(). 반면 Sproc은로 설정 SqlCommand.CommandType하여 ADO.NET에서 직접 호출 할 수 있습니다 CommandType.StoredProcedure.
Chris J

60

저장 프로 시저와 사용자 정의 함수의 차이점 :

  • 저장 프로시 저는 Select 문에서 사용할 수 없습니다.
  • 저장 프로시 저는 지연된 이름 확인을 지원합니다.
  • 저장 프로시 저는 일반적으로 비즈니스 로직을 수행하는 데 사용됩니다.
  • 저장 프로시 저는 모든 데이터 유형을 반환 할 수 있습니다.
  • 저장 프로시 저는 사용자 정의 함수보다 많은 수의 입력 매개 변수를 사용할 수 있습니다. 저장 프로시 저는 최대 21,000 개의 입력 매개 변수를 가질 수 있습니다.
  • 저장 프로시 저는 동적 SQL을 실행할 수 있습니다.
  • 저장 프로시 저는 오류 처리를 지원합니다.
  • 비 결정적 기능은 저장 프로 시저에서 사용할 수 있습니다.

  • Select 문에서 사용자 정의 함수를 사용할 수 있습니다.
  • 사용자 정의 함수는 지연 이름 확인을 지원하지 않습니다.
  • 사용자 정의 함수는 일반적으로 계산에 사용됩니다.
  • 사용자 정의 함수는 값을 반환해야합니다.
  • 사용자 정의 함수는 이미지를 반환 할 수 없습니다.
  • 사용자 정의 함수는 저장 프로 시저보다 적은 수의 입력 매개 변수를 허용합니다. UDF는 최대 1,023 개의 입력 매개 변수를 가질 수 있습니다.
  • 임시 테이블은 사용자 정의 함수에서 사용할 수 없습니다.
  • 사용자 정의 함수는 동적 SQL을 실행할 수 없습니다.
  • 사용자 정의 함수는 오류 처리를 지원하지 않습니다. RAISEERROROR @@ERROR은 UDF에서 허용되지 않습니다.
  • 비 결정적 기능은 UDF에서 사용할 수 없습니다. 예를 들어, GETDATE()UDF에는 사용할 수 없습니다.

1
다시 아래에 @curiousBoy를 인용하십시오. (@Ankit에 의해) 다른 미 적립 대답은 (<- 내가 그걸 어떻게했는지 참조;?)) : "당신은 소스 참조를 제공해야이 (에서입니다. blogs.msdn.microsoft.com/pradeepsvs/2014/10 / 08 /… ). 다른 사람들이하는 일을 존중하십시오! "
Tom

7
이 블로그는 2014 년 10 월 8 일 이후 작성되었으며이 답변은 2013 년 5 월 2 일 이후 작성되었습니다. @Tom
Kumar Manish

1
@Code Rider : 아, 사과드립니다! 나는 그것을 알아 차리지 못했다는 것을 믿을 수 없다! 블로그에서 크레딧없이 귀 하나 다른 사람을 복사 했습니까?
Tom

GETDATE()기능에서 사용될 수 있습니다. 에 피벗 비 결정적는 좋은 일이 아니다.
PerformanceDBA

56

다른 SQL 문에서 사용할 값을 계산하고 리턴하려는 경우 사용자 정의 함수를 작성하십시오. 대신 복잡한 SQL 문 세트를 그룹화하는 것이 필요할 때 스토어드 프로 시저를 작성하십시오. 이것들은 결국 두 가지 다른 유스 케이스입니다!


18
다른 유형의 사용자 정의 함수가 있습니다. 스칼라 값은 값만 반환합니다. 다른 유형은 retrun 결과 세트입니다.
AK

44
              STORE PROCEDURE                 FUNCTION (USER DEFINED FUNCTION)    
 * Procedure can return 0, single or   | * Function can return only single value   
   multiple values.                    |
                                       |
 * Procedure can have input, output    | * Function  can have only input 
   parameters.                         |   parameters.         
                                       |
 * Procedure cannot be called from     | * Functions can be called from 
   function.                           |   procedure.
                                       |
 * Procedure allows select as well as  | * Function allows only select statement 
   DML statement in it.                |   in it.
                                       |
 * Exception can be handled by         | * Try-catch block cannot be used in a 
   try-catch block in a procedure.     |   function.
                                       |
 * We can go for transaction management| * We can't go for transaction 
   in procedure.                       |   management in function.
                                       |
 * Procedure cannot be utilized in a   | * Function can be embedded in a select 
   select statement                    |   statement.
                                       |
 * Procedure can affect the state      | * Function can not affect the state 
   of database means it can perform    |   of database means it can not    
   CRUD operation on database.         |   perform CRUD operation on 
                                       |   database. 
                                       |
 * Procedure can use temporary tables. | * Function can not use 
                                       |   temporary tables. 
                                       |
 * Procedure can alter the server      | * Function can not alter the  
   environment parameters.             |   environment parameters.
                                       |   
 * Procedure can use when we want      | * Function can use when we want
   instead is to group a possibly-     |   to compute and return a value
   complex set of SQL statements.      |   for use in other SQL 
                                       |   statements.

1
UDF는 SP와는 달리 CROSS 적용 호출 할 수 있습니다
루도빅 오베르

24

기본 차이

함수는 값을 반환해야하지만 저장 프로 시저에서는 선택 사항입니다 (프로시 저는 0 또는 n 값을 반환 할 수 있음).

함수는 입력 매개 변수 만 가질 수있는 반면, 프로시 저는 입력 / 출력 매개 변수를 가질 수 있습니다.

함수는 필수 인 하나의 입력 매개 변수를 사용하지만 저장 프로시 저는 o에서 n 개의 입력 매개 변수를 사용할 수 있습니다.

함수는 프로 시저에서 호출 할 수 있지만 프로시 저는 함수에서 호출 할 수 없습니다.

사전 차이

프로시 저는 SELECT 및 DML (INSERT / UPDATE / DELETE) 문을 허용하지만 Function은 SELECT 문만 허용합니다.

SELECT 문에는 프로 시저를 사용할 수 없지만 SELECT 문에는 함수를 임베드 할 수 있습니다.

저장 프로시 저는 WHERE / HAVING / SELECT 섹션의 어느 곳에서나 SQL 문에서 사용할 수 없지만 Function은 가능합니다.

테이블을 반환하는 함수는 다른 행 집합으로 취급 될 수 있습니다. 다른 테이블과 함께 JOIN에서 사용할 수 있습니다.

인라인 함수는 매개 변수를 취하는 뷰로 간주 할 수 있으며 JOIN 및 기타 행 세트 조작에서 사용될 수 있습니다.

프로 시저에서 try-catch 블록으로 예외를 처리 할 수있는 반면 try-catch 블록은 함수에서 사용할 수 없습니다.

트랜잭션 관리는 절차로 진행할 수 있지만 기능은 수행 할 수 없습니다.

출처


25
소스 참조를 제공해야합니다. 이것은 dotnet-tricks.com/Tutorial/sqlserver/… 에서 온 것 입니다. 다른 사람들이하는 일을 존중하십시오!
curiousBoy

16
소스 참조를 제공하지 않는 것은 아닙니다. 당신은 그것의 끝에 언급 할 수 있습니다!
curiousBoy

2
레. "함수는 값을 반환해야하지만 저장 프로 시저에서는 선택 사항입니다 ....": "함수 하나의 값만 반환 해야합니다 ( Returns키워드 를 통해 수행 해야하며 스칼라 또는 테이블 유형이어야 함). 하지만, 저장 프로 시저 수 선택적으로 반환한다 : a) (1) Int유형의 결과 코드를 통해 Return성명 및 / 또는 b) 1+ 매개 변수 (포함. Cursor유형)을 통해 Output키워드 및 / 또는 c) 1+ 통해 행 세트 Select제표 경우에만 1 행을 설정합니다. "Insert Into"문의 "execute_statement"인수로 사용될 수 있습니다.
Tom

20

사용자 정의 함수는 SQL Server 프로그래머가 사용할 수있는 중요한 도구입니다. SQL 문에서 인라인으로 사용할 수 있습니다.

SELECT a, lookupValue(b), c FROM customers 

어디 lookupValueUDF가 될 것입니다. 저장 프로 시저를 사용할 때는 이러한 종류의 기능을 사용할 수 없습니다. 동시에 UDF 내에서 특정 작업을 수행 할 수 없습니다. 여기서 기억해야 할 기본 사항은 UDF입니다.

  • 영구적 인 변화를 만들 수 없다
  • 데이터를 변경할 수 없습니다

저장 프로시 저는 이러한 작업을 수행 할 수 있습니다.

나에게 UDF의 인라인 사용법은 UDF의 가장 중요한 사용법입니다.


14

저장 프로시 저는 스크립트로 사용됩니다 . 이들은 일련의 명령을 실행하며 특정 시간에 실행되도록 예약 할 수 있습니다. 일반적으로 INSERT, UPDATE, DELETE 등과 같은 여러 DML 문 또는 심지어 SELECT를 실행합니다.

함수 는 메소드로 사용됩니다. 무언가를 전달하면 결과가 반환됩니다. 작고 빠르다-즉석에서한다. 일반적으로 SELECT 문에서 사용됩니다.


2
이것은 그것들을 생각하는 빠르고, 더러운 두 가지 방법에 대한 좋은 요약입니다.
Eric Bishard

2
실제로 좋은 요약입니다. 다른 답변은이 둘의 이론적 차이점에 중점을두고 있지만 실제로 어느 것을 사용 해야하는지 확실하지 않습니다.
jf328

8

저장 프로 시저 :

  • SQL Server의 소형 프로그램과 같습니다.
  • select 문처럼 간단하거나 데이터베이스의 여러 테이블에서 데이터를 추가, 삭제, 업데이트 및 / 또는 읽는 긴 스크립트처럼 복잡 할 수 있습니다.
  • (루프와 커서를 구현할 수 있습니다. 둘 다 작은 결과 또는 데이터에 대한 행 단위 작업을 수행 할 수 있습니다.)
  • EXEC또는 EXECUTEstatement를 사용하여 호출해야합니다 .
  • 테이블 변수를 반환하지만 OUT매개 변수를 사용할 수 없습니다 .
  • 거래를 지원합니다.

함수:

  • 데이터베이스에 레코드를 업데이트, 삭제 또는 추가하는 데 사용할 수 없습니다.
  • 단순히 단일 값 또는 테이블 값을 반환합니다.
  • 레코드를 선택하는 데만 사용할 수 있습니다. 그러나 다음과 같은 표준 SQL 내에서 매우 쉽게 호출 할 수 있습니다.

    SELECT dbo.functionname('Parameter1')

    또는

    SELECT Name, dbo.Functionname('Parameter1') FROM sysObjects
  • 재사용이 간단한 선택 작업을 위해 함수는 코드를 단순화 할 수 있습니다. JOIN함수에서 절 을 사용하는 것에주의 하십시오. 함수에 JOIN절이 있고 여러 결과를 반환하는 다른 select 문에서 호출하면 JOIN 해당 함수 호출은 결과 집합에 반환 된 줄 에 대해 해당 테이블을 함께 처리합니다 . 따라서 일부 로직을 단순화하는 데 도움이 될 수 있지만 올바르게 사용하지 않으면 성능 병목 현상이 발생할 수 있습니다.

  • OUT매개 변수를 사용하여 값을 리턴합니다 .
  • 거래를 지원하지 않습니다.

8

사용자 정의 기능.

  1. 함수는 값을 반환해야합니다.
  2. Select 문만 허용하며 DML 문을 사용할 수 없습니다.
  3. 입력 매개 변수 만 허용하고 출력 매개 변수는 지원하지 않습니다.
  4. try-catch 블록을 사용할 수 없습니다.
  5. 함수 내에서 트랜잭션이 허용되지 않습니다.
  6. 테이블 변수 만 사용할 수 있으며 임시 테이블은 사용할 수 없습니다.
  7. 저장 프로시 저는 함수에서 호출 할 수 없습니다.
  8. select 문에서 함수를 호출 할 수 있습니다.
  9. UDF는 결합 절에서 결과 세트로 사용될 수 있습니다.

저장 프로 시저

  1. 저장 프로시 저는 값을 반환하거나 반환하지 않을 수 있습니다.
  2. 삽입, 업데이트, 삭제 등과 같은 DML 문뿐만 아니라 select 문도 가질 수 있습니다.
  3. 입력 및 출력 매개 변수를 모두 가질 수 있습니다.
  4. 예외 처리를 위해 try catch 블록을 사용할 수 있습니다.
  5. 저장 프로 시저 내에서 트랜잭션을 사용할 수 있습니다.
  6. 테이블 변수와 임시 테이블을 모두 사용할 수 있습니다.
  7. 저장 프로시 저는 함수를 호출 할 수 있습니다.
  8. Select / Where / Having 등에서 프로 시저를 호출 할 수 없습니다. 실행 / 실행 문을 사용하여 저장 프로 시저를 호출 / 실행할 수 있습니다.
  9. Join 절에서는 프로 시저를 사용할 수 없습니다

6

다음 사항이 도움이 될 수있는 시점을 결정하려면

  1. 저장 프로시 저는 함수가 수행 할 수있는 테이블 변수를 반환 할 수 없습니다.

  2. 스토어드 프로 시저를 사용하여 서버 환경 매개 변수를 변경할 수없는 기능을 사용할 수 있습니다.

건배


6

커서와 같은 SQL Server 기능은 마지막 무기로 사용됩니다! 성능 문제가 있으므로 가능한 테이블 반환 함수를 사용하지 않아야합니다. 성능에 대해 이야기하는 것은 중산층 하드웨어의 서버에서 호스팅되는 1,000,000 개 이상의 레코드가있는 테이블에 대한 것입니다. 그렇지 않으면 기능으로 인한 성능 저하에 대해 걱정할 필요가 없습니다.

  1. 함수 집합을 사용하여 결과 집합을 외부 코드 (예 : ADO.Net)로 반환하지 마십시오
  2. 보기 / 저장된 procs 조합을 가능한 많이 사용하십시오. DTA (Database Tuning Adviser)에서 제공하는 제안 (인덱싱 된 뷰 및 통계와 같은)을 사용하여 미래의 성능 향상 문제를 복구 할 수 있습니다.

자세한 내용은 http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html을 참조하십시오.


1
감사. 하나의 열에 대한 값을 채우기 위해 쿼리 내에서 호출하도록 오늘 함수를 작성했습니다. 실행을 멈추기 전에 3 분 이상 실행했습니다. 그것을 할 수있는 방법을 알아 냈습니다. 15 초 안에 실행이 완료되었습니다. (데이터 세트는 3456 행이었습니다). 큰 성능 차이.
VISQL

편집 : I "ORDER BY"열에 따라 15 초에서 50 초 사이에 실행이 완료됩니다 (데이터 세트는 3456 행). 큰 성능 차이.
VISQL

성능 차이는 결과를 정렬하는 열의 다른 유형에 근본이있을 수 있습니다. SQL Server는 문자 데이터보다 숫자에서 훨씬 잘 작동합니다. 해당 50secs 쿼리에서 DTA를 사용하고 쿼리를 조금 더 빠르게 실행하기위한 통계 / 인덱스 제안이 있는지 확인할 수 있습니다.
Achilles

1
그것이 최후의 수단이어야한다는 충분한 증거가 제공되었는지는 확실하지 않습니다. 기능을 추가 조작 할 수있는 매개 변수화 된보기로 생각할 수 있습니다. 예를 들어, 고객을 주문에 참여 시키려고하지만 미시간에만 해당합니다. 단일 주에 해당하는 고객 만 참여할 customerOrders (@StateCode) 함수를 만듭니다. 그런 다음이 세트에서 Select FirstName, LastName, OrderTotal, StoreName From CustomerOrders ( 'MI') INNER JOIN Stores ON Stores.StoreID = Orders.StoreID WHERE OrderTotal> 100; 임시 복사를해야하므로 SP에 어려움이있을 수 있습니다.
MPavlak

그 테이블에 몇 개의 레코드가 있습니까? 하드웨어가 올바르게 처리하면 무기 선택에 대해 걱정할 필요가 없습니다. 숟가락은 칼을 부러 뜨리기가 어려울 때 일을 할 수 있습니다. 이 경도를 하드웨어라고합니다!
Achilles

3

단일 값을 반환하는 함수로 시작하십시오. 좋은 점은 자주 사용하는 코드를 함수에 넣고 결과 집합의 열로 반환 할 수 있다는 것입니다.

그런 다음 매개 변수화 된 도시 목록에 함수를 사용할 수 있습니다. dbo.GetCitiesIn ( "NY") 조인으로 사용할 수있는 테이블을 반환합니다.

코드를 구성하는 방법입니다. 무언가가 언제 재사용 가능하고 시간 낭비인지 아는 것은 시행 착오와 경험을 통해서만 얻는 것입니다.

또한 함수는 SQL Server에서 좋은 아이디어입니다. 그들은 더 빠르고 강력 할 수 있습니다. 인라인 및 직접 선택. 남용하지 않도록 조심하십시오.


3

다음은 저장 프로 시저보다 함수를 선호하는 실질적인 이유입니다. 다른 저장 프로 시저의 결과가 필요한 저장 프로 시저가있는 경우 insert-exec 문을 사용해야합니다. 이는 임시 테이블을 작성하고 exec명령문을 사용 하여 스토어드 프로 시저의 결과를 임시 테이블 에 삽입 해야 함을 의미 합니다. 지저분합니다. 이것의 한 가지 문제는 insert-execs를 중첩 할 수 없다는 것 입니다.

다른 저장 프로 시저를 호출하는 저장 프로 시저가 고착 된 경우이 오류가 발생할 수 있습니다. 중첩 저장 프로 시저가 단순히 데이터 집합을 반환하면 테이블 반환 함수로 대체 될 수 있으며 더 이상이 오류가 발생하지 않습니다.

( 이것은 데이터베이스에서 비즈니스 로직을 유지해야하는 또 다른 이유입니다 )


2
  • 저장 프로 시저가 아닌 동안 함수가 값을 반환해야합니다.
  • DML 문은 필요하지 않지만 UDF에서만 승인 된 명령문을 선택하십시오.
  • 저장 프로시 저는 모든 문과 DML 문을 허용합니다.
  • UDF는 입력 만 허용하고 출력은 허용하지 않습니다.
  • 저장 프로시 저는 입력과 출력을 모두 허용합니다.
  • 캐치 블록은 UDF에서는 사용할 수 없지만 저장 프로 시저에는 사용할 수 있습니다.
  • UDF의 기능에는 트랜잭션이 허용되지 않지만 스토어드 프로 시저에는 트랜잭션이 허용됩니다.
  • 임시 테이블이 아닌 UDF에서 테이블 변수 만 사용할 수 있습니다.
  • 저장 프로시 저는 테이블 변수와 임시 테이블을 모두 허용합니다.
  • UDF는 함수에서 스토어드 프로 시저를 호출 할 수없는 반면 스토어드 프로시 저는 함수 호출을 허용합니다.
  • 스토어드 프로시 저는 join 절에서 사용할 수 없지만 UDF는 join 절에서 사용됩니다.
  • 저장 프로시 저는 항상 0으로 돌아갈 수 있습니다. 반대로 UDF에는 미리 결정된 지점으로 돌아와야하는 값이 있습니다.

1
  • 프로 시저가 할 수없는 select 문에서 함수를 사용할 수 있습니다.

  • 저장 프로시 저는 입력 및 출력 매개 변수를 모두 사용하지만 함수는 입력 매개 변수 만 사용합니다.

  • 함수는 프로 시저가 할 수있는 text, ntext, image & timestamp 유형의 값을 리턴 할 수 없습니다.

  • 작성 테이블에서 함수를 사용자 정의 데이터 유형으로 사용할 수 있지만 프로시 저는 사용할 수 없습니다.

*** 예 : 생성 table <tablename>(name varchar(10),salary getsal(name))

여기서 getsal은 급여 유형을 리턴하는 사용자 정의 함수이며, 테이블이 작성 될 때 급여 유형에 대한 스토리지가 할당되지 않으며, getsal 함수도 실행되지 않습니다. 그러나이 테이블에서 일부 값을 페치 할 때 getsal 함수가 실행됩니다. 반환 유형이 결과 집합으로 반환됩니다.


1

나는 이것이 매우 오래된 질문이라는 것을 알고 있지만 어떤 대답에서도 언급 된 중요한 측면을 보지 못했습니다 : 쿼리 계획에 인라인.

기능은 ...

  1. 스칼라:

    CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END

  2. 다중 문 테이블 값 :

    CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END

  3. 인라인 테이블 값 :

    CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...

세 번째 종류 (인라인 테이블 반환)는 쿼리 최적화 프로그램에서 본질적으로 (매개 변수화 된)보기로 처리됩니다. 즉, 쿼리에서 함수를 참조하는 것은 함수의 SQL 본문을 복사하여 붙여 넣기 (실제 복사하여 붙여 넣기없이)하는 것과 유사합니다. 다음과 같은 이점이 있습니다.

  • 쿼리 플래너는 다른 하위 쿼리와 마찬가지로 인라인 함수의 실행을 최적화 할 수 있습니다 (예 : 사용되지 않는 열 제거, 술어 푸시 다운, 다른 JOIN 전략 선택 등).
  • 여러 인라인 함수를 결합하면 첫 번째 결과를 다음으로 전달하기 전에 결과를 구체화 할 필요가 없습니다.

위의 기능은 특히 여러 레벨의 기능을 결합 할 때 잠재적으로 상당한 성능 절감을 초래할 수 있습니다.


참고 : SQL Server 2019에서는 일부 형식의 스칼라 함수 인라인 도 소개합니다.


-2

SQL Server에서 함수와 저장 프로시 저는 서로 다른 두 가지 유형의 엔터티입니다.

함수 : SQL Server 데이터베이스에서 함수는 일부 작업을 수행하는 데 사용되며 작업은 결과를 즉시 반환합니다. 기능은 두 가지 유형입니다.

  1. 시스템 정의

  2. 사용자 정의

저장 프로 시저 : SQL Server에서 저장 프로시 저는 서버에 저장되며 0, 단일 및 다중 값을 반환 할 수 있습니다. 저장 프로시 저는 두 가지 유형입니다.

  1. 시스템 저장 프로 시저
  2. 사용자 정의 절차
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.