2008-10-10 3 views
1

MS SQL 서버에서 저장 프로 시저의 출력과이 절차는 여러 데이터베이스와 여러 다른 서버에 사용되는 ... 나는 다음과 같은 저장 프로 시저를 만든

CREATE PROCEDURE [dbo].[UDSPRBHPRIMBUSTYPESTARTUP] 
(
    @CODE CHAR(5) 
    , @DESC VARCHAR(255) OUTPUT 
) 
AS 
DECLARE @SERVERNAME nvarchar(30) 
DECLARE @DBASE nvarchar(30) 
DECLARE @SQL nvarchar(2000) 

SET @SERVERNAME = 
    Convert(nvarchar, 
    (SELECT spData FROM dbSpecificData WHERE spLookup = 'CMSSERVER')) 
SET @DBASE = 
    Convert(nvarchar, 
    (SELECT spData FROM dbSpecificData WHERE spLookup = 'CMSDBNAME')) 

SET @SQL = 
    'SELECT clnt_cat_desc FROM ' + @SERVERNAME + 
    '.' + @DBASE + '.dbo.hbl_clnt_cat WHERE inactive = ''N'' 
    AND clnt_cat_code = ''' + @CODE + '''' 

EXECUTE sp_executeSQL @SQL 

RETURN 

을 변수 초기화를 동적으로 작성된 것입니다 유지 관리를 단순화하는 SQL. 프로시 저는 프로 시저가 가리키는 서버와 다른 서버에서도 실행됩니다.

나는 테이블의 값으로이 절차의 출력을 사용하려면 ...

DECLARE @clid BIGINT 
DECLARE @fileid BIGINT 
DECLARE @myCode CHAR(5) 
DECLARE @myDesc VARCHAR(255) 
DECLARE @@tempDesc VARCHAR(255) 

SET @clid = 1831400022 
SET @fileid = 2072551358 
SET @myCode = 
    (SELECT _clientPrimBusinessType FROM udbhextclient WHERE clid = @clid) 

SET @myDesc = 
    EXEC UDSPRBHPRIMBUSTYPESTARTUP @CODE = @myCode, @DESC = @@tempDesc OUTPUT 
---------------------------------------------------------------------------- 
SELECT 
    a.clid 
    , b.fileid 
    , c.usrfullname AS ClientPartner 
    , e.usrfullname AS ClientFeeEarner 
    , @myDesc AS ClientPrimaryBusinessType 
FROM 
    dbclient a 
    INNER JOIN 
    dbFile b 
    ON 
    a.clid = b.clid 
    INNER JOIN 
    dbuser c 
    ON 
    a.feeusrid = c.usrid 
    INNER JOIN 
    udbhextclient d 
    ON 
    a.clid = d.clid 
    INNER JOIN 
    dbuser e 
    ON 
    d._ClientFeeEarner = e.usrid 
WHERE 
    a.clid = @clid 
    AND b.fileid = @fileid 

나는이 잘못된 구문을 알고,하지만 당신은 의지하지 않고 내가 이것을 달성하기 위해 노력하고 무엇을 볼 수 있습니다

임시 테이블에 저장하는 것은 각 서버마다 3 ~ 5 개의 데이터베이스가있는 30 개 서버의 유지 관리를 의미합니다.

Smink은 -

Running Smink's Solution

+2

와우! 이 이름은 어떻게 발음합니까? UDSPRBHPRIMBUSTYPESTARTUP – jop

+0

소프트웨어 패키지에는 많은 업데이트가 있습니다. 업데이트 프로세스는 명명 규칙을 따르지 않는 한 모든 것을 삭제합니다 ... UD - 사용자 정의, SPR - 저장 프로 C, BH - Boodle Hatfield (고용주), PRIM - 기본 BUS - 비즈니스 유형 - 유형 STARTUP - 시작 일부 문자는 최대 문자 길이가 15 –

+0

입니다. 아래에서 답변을 완료하십시오. 보세요. –

답변

7
라인 변경

:

SET @myDesc = 
    EXEC UDSPRBHPRIMBUSTYPESTARTUP @CODE = @myCode, @DESC = @@tempDesc OUTPUT 

EXEC UDSPRBHPRIMBUSTYPESTARTUP @CODE = @myCode, @DESC = @tempDesc OUTPUT 

에를 그리고 당신은 저장 프로 시저 @DESC를 할당 놓쳤다. 다음 선택에

SET @SQL = 
    'SELECT @DESC = clnt_cat_desc FROM ' + @SERVERNAME + 
    '.' + @DBASE + '.dbo.hbl_clnt_cat WHERE inactive = ''N'' 
    AND clnt_cat_code = ''' + @CODE + '''' 

EXECUTE sp_executeSQL @SQL, N'@DESC varchar(255) output', @DESC output 

그런 다음 사용해야을 @tempDesc :

SET @SQL = 
    'SELECT clnt_cat_desc 
    FROM ' + QUOTENAME(@SERVERNAME) + '.' + QUOTENAME(@DBASE) + '.dbo.hbl_clnt_cat 
    WHERE inactive = ''N'' 
     AND clnt_cat_code = @CODE' 

EXECUTE sp_executeSQL @SQL, N'@CODE CHAR(5)', @CODE 

:

SELECT 
    a.clid 
    , b.fileid 
    , c.usrfullname AS ClientPartner 
    , e.usrfullname AS ClientFeeEarner 
    , @tempDesc AS ClientPrimaryBusinessType 

또한 저장 프로 시저 주위 SQL 주입을 허용 (업데이트 :. 고정 SQL 주입 문제)

+0

결과를 반환하지만 아래의