2

연결된 서버에서 IDENT_CURRENT 값을 가져 오려고합니다. 출력 매개 변수가있는 원격 서버에서 sp_current_identity 저장 프로 시저를 만들었습니다.sp_executesql 내에서 원격 저장 프로 시저 실행

CREATE PROCEDURE [dbo].[sp_current_identity] (@strTableName nvarchar(255), @intRowId int OUTPUT) 
AS 
BEGIN 
select IDENT_CURRENT(@strTableName) 
END 

그 후 나는 두 개의 동의어 인 sp_current_identity와 sometable을 만들었습니다.

sp_executesql을 사용하여 sp_current_identity를 실행해야합니다 (사용자 정의 DataAtapter를 생성하여 LLBLGEN 3.1을 통해 동의어로 작업합니다). 이 코드 (sp_current_identity 지역 저장 프로 시저입니다) 원격 서버에서 실행되는 경우 그것은 잘 작동

declare @p4 int 
set @p4=NULL 
exec sp_executesql N'SET XACT_ABORT ON; INSERT INTO [db].[dbo].[sometable] ([FieldName], [TableName], [UserField]) VALUES (@p1, @p3, @p4) ; 
exec dbo.sp_current_identity @p5, @p2 
;SET XACT_ABORT OFF',N'@p1 varchar(50),@p2 int output,@p3 varchar(50),@p4 varchar(50), @p5 varchar(200)', 
@p1='test24',@[email protected] output,@p3='test24',@p4='test5',@p5='sometable' 
select @p4 

,하지만 코드가 로컬 서버에서 실행되는 예외가 발생합니다 : 다음 예를 참조하십시오. 다음은 오류입니다.

프로 시저 또는 함수 'sp_current_identity'에 '@strTableName'매개 변수가 제공되지 않았습니다.이 매개 변수는 제공되지 않았습니다.

도움 주셔서 감사합니다.

+0

삽입 후 IDENT_CURRENT를 검사하는 것이 잘못 되었기 때문에 코드가 정확하지 않다. 가벼운 동시성 하에서도 스크립트는 다른 세션에 의해 삽입 된 마지막 ID를 반환하기 시작할 것이므로 응용 프로그램이 제대로 작동하지 않을 수 있습니다. 대신에'INSERT INTO ... OUTPUT inserted.idcolumn'을 사용하십시오. –

+0

빠른 답장을 보내 주셔서 감사합니다. 'sometable'은 원격 테이블의 동의어이기 때문에 "INSERT INTO ... OUTPUT inserted.idcolumn"을 사용할 수없는 것으로 보입니다. – Alex

+1

아직도 다른 쪽에서 저장 프로 시저를 만들 수없는 이유는 삽입 및 출력 SCOPE_IDENTITY()를 수행해야합니까? –

답변

3

로컬로 동적 SQL을 실행하는 대신 EXEC remoteserver.database.dbo.sp_executesql 'dynamic SQL';을 실행하는 것으로 생각하십니까? sp_current_identity 프로시 저는 쿼리가 실제로 호출 된 위치가 아니라 쿼리가 실제로 실행되는 위치에 존재해야합니다.

+0

불행히도, 아니요. SQL에서 원격 서버 이름을 사용할 수 없습니다. 동의어를 사용하여 원격 테이블과 저장 프로 시저를 작업합니다. – Alex

+1

하지만 동의어를 사용하고 있기 때문에 이것은 무엇입니까? 이것은 무연 휘발유를 가져가는 자동차를 살 수 없다는 말인가? 내가 낭비하고 싶지 않은 디젤 깡통을 가지고 있기 때문에? –

+0

Aaron, 도와 줘서 고마워. 나는 현재 시스템 설계 때문에 SQL을 작성하는 데 한계가있다. 방금 sp_executesql을 통해 출력 매개 변수가있는 원격 저장 프로 시저를 실행하는 방법이있을 것이라고 생각했습니다. 그건 내 문제를 해결해야합니다. – Alex

0

나는 두 단계로 원격 서버에 대한 동적 호출을 어셈블해야한다는 것을 알게되었습니다. 나는 데이터베이스 ID를 얻으려고했다.

DECLARE @sql nvarchar(4000) 
DECLARE @ParmDefinition nvarchar(500) 
SET @ParmDefinition = N'@retvalOUTside int OUTPUT' 
SET @sql = 'SELECT TOP 1 @retvalOUT = database_id FROM [' + @ServerName + '].master.sys.databases WHERE name = ''''' + @dbname + '''''' 
SET @SPSQL = ' 
DECLARE @DBID INT; 
DECLARE @ParmDefinition nvarchar(500); 
SET @ParmDefinition = N''@retvalOUT int OUTPUT''; 
DECLARE @SQLinside nvarchar(400) =''' + @sql + '''; 
EXEC [' + @ServerName + '].master.dbo' + '.sp_executeSQL @SQLinside, @ParmDefinition, @retvalOUT = @retvalOUTside OUTPUT' 
EXEC sp_executeSQL @SPSQL, @ParmDefinition, @[email protected] OUTPUT 
관련 문제