13

SQL Server 2008 저장 프로 시저 (유지 관리 스크립트)를 작성하는 것이 좋습니다.T-SQL : 저장 프로 시저 내에서 "개인"함수를 만드는 방법

내가 오류 처리, 확인 rowcounts, 인쇄 출력 메시지를 많이했던 착한 아이되고, 그렇게함으로써

그러나이 일에, 필자 자신이 또 다시 이런 식으로 뭔가를 쓰기 발견 : 이 같은

SELECT @RowsAffected = @@ROWCOUNT 
IF @RowsAffected > 0 
BEGIN 
    PRINT CAST(@RowsAffected, NVARCHAR(2)) + 'rows updated.' 
END 

또는 디버그 메시지 :

PRINT 'User ' + CAST(@UserId AS NVARCHAR(5)) + ' modified successfully' 

내가 개인과 같은 저장 프로 시저 내부의 '서브 루틴'의 종류를 (만들 수있는 방법이 있나요 메서드) 매개 변수로 뭔가를 받아 들일 수 (그다지하지만) 및 일부 논리합니까?

CheckRowCounts 

또는이 :

나는 같은 것을 할 수 있어야합니다 (행 개수, 인쇄 메시지 등을 확인)

PrintUserUpatedMessage(@UserId) 

다음 위의 논리를 수행 할

그리고 분명히 UDF를 만들 수 있지만,이 논리는이 저장 프로 시저의 실행 수명 동안 만 필요하기 때문에 작성/삭제해야합니다.

다시 병 이상 같은 코드를 작성 피곤하고 가져 오기, 그리고 난 오류가 발생하는 경우 필자가 사용하는 모든 다른 영역 =)

누구든지 도와 드릴까요 변화?

내가 스칼라 UDF 함수를 만드는 결국 있도록

좋아 EDIT (유일한 방법은 같다).

그러나 Fredrik에 대한 올바른 대답은 내가 구현할 계획이 없다는 것입니다. 올바른 대답과 창의적인 답변입니다.

모든 조언/도움에 감사드립니다.

답변

15

내가 처음에는 다른 SP를 만들려고했는데 작동하지 않았지만 약간의 실험을하고 나면이 같은 것으로 갈 수 있다고 생각합니다 (동적 SQL이 마음에 들지 않는다면) :

CREATE PROCEDURE sp_myTest_v1_0(@firstName NVARCHAR(255)) AS 
BEGIN 
    -- declare private method 
    DECLARE @privateMethod NVARCHAR(255), @privateMethodSig NVARCHAR(255) 
    SELECT @privateMethod = 
     'DECLARE @x INT' + CHAR(10) + 
     'WHILE ISNULL(@x,0) < 10 BEGIN' + CHAR(10) + 
      'PRINT @param1 + CAST(@x AS VARCHAR)' + CHAR(10) + 
      'SET @x = ISNULL(@x,0)+1' + CHAR(10) + 
     'END', @privateMethodSig = '@param1 NVARCHAR(255)' 

    -- call privateMethod 
    EXEC sp_executesql @privateMethod, @privateMethodSig, @param1 = @firstName 
END 
GO 
+1

+1 상자 밖의 생각! =) – RPM1984

+1

이것은 실제로 두려운 것이 아닙니다. +1 –

0

tsql에서 실제로 그런 것은 아닙니다. 당신이 말했듯이, 가장 가까운 것은 스칼라 udf이고, 당신은 그 생각의 팬인 것처럼 보이지 않습니다. 나는 그와 같은 도우미 함수를 만들어 데이터베이스에 남겨 두는 것과 관련된 문제를 보지 못합니다. 틀림없이 좋은 메시지로부터 이익을 얻을 수있는 다른 절차가 있습니다.

+0

나는 도움이되는 해를 끼치 지 않는다는 것에 동의한다 (나는 splitstring, propercase 등과 같이 많음). 그러나 이와 같은 (트랜잭션, 행 개수 등의 정보를 출력하는) 것은 다소 과도한 것으로 보입니다. 그럼에도 불구하고, 나는 그 최후의 수단이라고 말했지만, 이드는 아무도 다른 생각이 있는지를 안다고 생각했다. – RPM1984

관련 문제