함수와 저장 프로 시저를 꽤 오랫동안 배우고 있지만 함수와 저장 프로 시저를 사용해야하는 이유와시기를 모르겠습니다. 그들은 나에게 똑같아 보인다. 어쩌면 나는 그것에 대해 초보자이기 때문이다.
왜 그런지 말해 줄 수 있습니까?
함수와 저장 프로 시저를 꽤 오랫동안 배우고 있지만 함수와 저장 프로 시저를 사용해야하는 이유와시기를 모르겠습니다. 그들은 나에게 똑같아 보인다. 어쩌면 나는 그것에 대해 초보자이기 때문이다.
왜 그런지 말해 줄 수 있습니까?
답변:
함수는 계산 된 값이며 영구적 인 환경 변경을 수행 할 수 없습니다 SQL Server
(예 : 허용 되지 INSERT
않거나 UPDATE
설명이 허용 되지 않음 ).
함수가 SQL
스칼라 값을 리턴하면 명령문 에서 인라인으로 사용 되거나 결과 세트를 리턴하면 결합 될 수 있습니다.
답변을 요약 한 주석에서 주목할 가치가있는 점. @Sean K Anderson 덕분에 :
함수는 컴퓨터 과학 정의에 따라 값을 반환해야하며 매개 변수 (인수)로받은 데이터를 변경할 수 없습니다. 함수는 아무것도 변경할 수 없으며 적어도 하나의 매개 변수가 있어야하며 값을 반환해야합니다. 저장된 proc는 매개 변수를 가질 필요가 없으며 데이터베이스 오브젝트를 변경할 수 있으며 값을 리턴 할 필요가 없습니다.
SQL
저장 프로 시저에서 함수 를 호출하는 방법 과 저장 프로 시저 대신 함수를 사용하는 경우
안녕하세요 친구 여러분, 오늘 우리는 저장 프로 시저 사용시기와 기능 사용시기에 대해 논의 할 것입니다. 간단한 팀에서 일부 값을 계산하고 단일 값을 반환하면 필요하지 않습니다.
https://programmingtechtutorial.blogspot.com/2020/01/when-use-storeprocedure-and-when-use.html
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. | |
+---------------------------------+----------------------------------------+
함수와 저장 프로시 저는 별도의 목적으로 사용됩니다. 최상의 비유는 아니지만 함수는 문자 그대로 모든 프로그래밍 언어에서 사용하는 다른 함수로 볼 수 있지만 저장된 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 ... 종료).
SELECT * from dbo.MyTableValuedFunction()
. 반면 Sproc은로 설정 SqlCommand.CommandType
하여 ADO.NET에서 직접 호출 할 수 있습니다 CommandType.StoredProcedure
.
저장 프로 시저와 사용자 정의 함수의 차이점 :
RAISEERROR
OR @@ERROR
은 UDF에서 허용되지 않습니다.GETDATE()
UDF에는 사용할 수 없습니다.GETDATE()
기능에서 사용될 수 있습니다. 에 피벗 비 결정적는 좋은 일이 아니다.
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.
기본 차이
함수는 값을 반환해야하지만 저장 프로 시저에서는 선택 사항입니다 (프로시 저는 0 또는 n 값을 반환 할 수 있음).
함수는 입력 매개 변수 만 가질 수있는 반면, 프로시 저는 입력 / 출력 매개 변수를 가질 수 있습니다.
함수는 필수 인 하나의 입력 매개 변수를 사용하지만 저장 프로시 저는 o에서 n 개의 입력 매개 변수를 사용할 수 있습니다.
함수는 프로 시저에서 호출 할 수 있지만 프로시 저는 함수에서 호출 할 수 없습니다.
사전 차이
프로시 저는 SELECT 및 DML (INSERT / UPDATE / DELETE) 문을 허용하지만 Function은 SELECT 문만 허용합니다.
SELECT 문에는 프로 시저를 사용할 수 없지만 SELECT 문에는 함수를 임베드 할 수 있습니다.
저장 프로시 저는 WHERE / HAVING / SELECT 섹션의 어느 곳에서나 SQL 문에서 사용할 수 없지만 Function은 가능합니다.
테이블을 반환하는 함수는 다른 행 집합으로 취급 될 수 있습니다. 다른 테이블과 함께 JOIN에서 사용할 수 있습니다.
인라인 함수는 매개 변수를 취하는 뷰로 간주 할 수 있으며 JOIN 및 기타 행 세트 조작에서 사용될 수 있습니다.
프로 시저에서 try-catch 블록으로 예외를 처리 할 수있는 반면 try-catch 블록은 함수에서 사용할 수 없습니다.
트랜잭션 관리는 절차로 진행할 수 있지만 기능은 수행 할 수 없습니다.
Returns
키워드 를 통해 수행 해야하며 스칼라 또는 테이블 유형이어야 함). 하지만, 저장 프로 시저 수 선택적으로 반환한다 : a) (1) Int
유형의 결과 코드를 통해 Return
성명 및 / 또는 b) 1+ 매개 변수 (포함. Cursor
유형)을 통해 Output
키워드 및 / 또는 c) 1+ 통해 행 세트 Select
제표 경우에만 1 행을 설정합니다. "Insert Into"문의 "execute_statement"인수로 사용될 수 있습니다.
사용자 정의 함수는 SQL Server 프로그래머가 사용할 수있는 중요한 도구입니다. SQL 문에서 인라인으로 사용할 수 있습니다.
SELECT a, lookupValue(b), c FROM customers
어디 lookupValue
UDF가 될 것입니다. 저장 프로 시저를 사용할 때는 이러한 종류의 기능을 사용할 수 없습니다. 동시에 UDF 내에서 특정 작업을 수행 할 수 없습니다. 여기서 기억해야 할 기본 사항은 UDF입니다.
저장 프로시 저는 이러한 작업을 수행 할 수 있습니다.
나에게 UDF의 인라인 사용법은 UDF의 가장 중요한 사용법입니다.
저장 프로시 저는 스크립트로 사용됩니다 . 이들은 일련의 명령을 실행하며 특정 시간에 실행되도록 예약 할 수 있습니다. 일반적으로 INSERT, UPDATE, DELETE 등과 같은 여러 DML 문 또는 심지어 SELECT를 실행합니다.
함수 는 메소드로 사용됩니다. 무언가를 전달하면 결과가 반환됩니다. 작고 빠르다-즉석에서한다. 일반적으로 SELECT 문에서 사용됩니다.
저장 프로 시저 :
EXEC
또는 EXECUTE
statement를 사용하여 호출해야합니다 .OUT
매개 변수를 사용할 수 없습니다 .함수:
레코드를 선택하는 데만 사용할 수 있습니다. 그러나 다음과 같은 표준 SQL 내에서 매우 쉽게 호출 할 수 있습니다.
SELECT dbo.functionname('Parameter1')
또는
SELECT Name, dbo.Functionname('Parameter1') FROM sysObjects
재사용이 간단한 선택 작업을 위해 함수는 코드를 단순화 할 수 있습니다. JOIN
함수에서 절 을 사용하는 것에주의 하십시오. 함수에 JOIN
절이 있고 여러 결과를 반환하는 다른 select 문에서 호출하면 JOIN
해당 함수 호출은 결과 집합에 반환 된 각 줄 에 대해 해당 테이블을 함께 처리합니다 . 따라서 일부 로직을 단순화하는 데 도움이 될 수 있지만 올바르게 사용하지 않으면 성능 병목 현상이 발생할 수 있습니다.
OUT
매개 변수를 사용하여 값을 리턴합니다 .사용자 정의 기능.
저장 프로 시저
커서와 같은 SQL Server 기능은 마지막 무기로 사용됩니다! 성능 문제가 있으므로 가능한 테이블 반환 함수를 사용하지 않아야합니다. 성능에 대해 이야기하는 것은 중산층 하드웨어의 서버에서 호스팅되는 1,000,000 개 이상의 레코드가있는 테이블에 대한 것입니다. 그렇지 않으면 기능으로 인한 성능 저하에 대해 걱정할 필요가 없습니다.
자세한 내용은 http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html을 참조하십시오.
단일 값을 반환하는 함수로 시작하십시오. 좋은 점은 자주 사용하는 코드를 함수에 넣고 결과 집합의 열로 반환 할 수 있다는 것입니다.
그런 다음 매개 변수화 된 도시 목록에 함수를 사용할 수 있습니다. dbo.GetCitiesIn ( "NY") 조인으로 사용할 수있는 테이블을 반환합니다.
코드를 구성하는 방법입니다. 무언가가 언제 재사용 가능하고 시간 낭비인지 아는 것은 시행 착오와 경험을 통해서만 얻는 것입니다.
또한 함수는 SQL Server에서 좋은 아이디어입니다. 그들은 더 빠르고 강력 할 수 있습니다. 인라인 및 직접 선택. 남용하지 않도록 조심하십시오.
다음은 저장 프로 시저보다 함수를 선호하는 실질적인 이유입니다. 다른 저장 프로 시저의 결과가 필요한 저장 프로 시저가있는 경우 insert-exec 문을 사용해야합니다. 이는 임시 테이블을 작성하고 exec
명령문을 사용 하여 스토어드 프로 시저의 결과를 임시 테이블 에 삽입 해야 함을 의미 합니다. 지저분합니다. 이것의 한 가지 문제는 insert-execs를 중첩 할 수 없다는 것 입니다.
다른 저장 프로 시저를 호출하는 저장 프로 시저가 고착 된 경우이 오류가 발생할 수 있습니다. 중첩 저장 프로 시저가 단순히 데이터 집합을 반환하면 테이블 반환 함수로 대체 될 수 있으며 더 이상이 오류가 발생하지 않습니다.
( 이것은 데이터베이스에서 비즈니스 로직을 유지해야하는 또 다른 이유입니다 )
프로 시저가 할 수없는 select 문에서 함수를 사용할 수 있습니다.
저장 프로시 저는 입력 및 출력 매개 변수를 모두 사용하지만 함수는 입력 매개 변수 만 사용합니다.
함수는 프로 시저가 할 수있는 text, ntext, image & timestamp 유형의 값을 리턴 할 수 없습니다.
작성 테이블에서 함수를 사용자 정의 데이터 유형으로 사용할 수 있지만 프로시 저는 사용할 수 없습니다.
*** 예 : 생성 table <tablename>(name varchar(10),salary getsal(name))
여기서 getsal은 급여 유형을 리턴하는 사용자 정의 함수이며, 테이블이 작성 될 때 급여 유형에 대한 스토리지가 할당되지 않으며, getsal 함수도 실행되지 않습니다. 그러나이 테이블에서 일부 값을 페치 할 때 getsal 함수가 실행됩니다. 반환 유형이 결과 집합으로 반환됩니다.
나는 이것이 매우 오래된 질문이라는 것을 알고 있지만 어떤 대답에서도 언급 된 중요한 측면을 보지 못했습니다 : 쿼리 계획에 인라인.
기능은 ...
스칼라:
CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END
다중 문 테이블 값 :
CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END
인라인 테이블 값 :
CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...
세 번째 종류 (인라인 테이블 반환)는 쿼리 최적화 프로그램에서 본질적으로 (매개 변수화 된)보기로 처리됩니다. 즉, 쿼리에서 함수를 참조하는 것은 함수의 SQL 본문을 복사하여 붙여 넣기 (실제 복사하여 붙여 넣기없이)하는 것과 유사합니다. 다음과 같은 이점이 있습니다.
위의 기능은 특히 여러 레벨의 기능을 결합 할 때 잠재적으로 상당한 성능 절감을 초래할 수 있습니다.
참고 : SQL Server 2019에서는 일부 형식의 스칼라 함수 인라인 도 소개합니다.