2015-01-16 4 views
0

다른 하나를 호출하는 하나의 저장 프로 시저가 두 개 있습니다. 컴파일시 오류가 없지만 SearchProcedure을 실행하면 outputprocedure이 호출되지 않습니다. 호출되지 않는 이유. SearchProcedure은 지금까지 잘 작동했습니다. 문제의 원인을 알려주십시오.저장 프로 시저가 SQL에서 호출되지 않음

내가 알고있는 OutputProcedure은 Select 문을 사용해 보았습니다.

Exec SearchProcedure @firstname ='Simran', @middlename='kaur', @lastname = 'Khurana', @City='Delhi' 

절차 : 다음

호출 : 여기

코드이다 SearchProcedure에서

CREATE Procedure OutputProcedure 
( 
@LastNameFromUser nvarchar(20) = null, 
@LastNameFromTable nvarchar(20), 
@MiddleNameFromUser nvarchar(20) = null, 
@MiddleNameFromTable nvarchar(20) = null, 
@CityFromUser nvarchar(20) = null, 
    @CityFromTable nvarchar(20) = null, 
@Percentage int out 
) 
AS 
BEGIN 
select 'OUTPUTPROCEDURECALLED' 
declare @maxvalue int 
DECLARE @variableTable TABLE (
    idx int identity(1,1), 
    matchvalue nvarchar(15)) 

    INSERT INTO @variableTable(matchvalue) values ('MiddleName') 
    INSERT INTO @variableTable(matchvalue) values ('LastName') 
    INSERT INTO @variableTable(matchvalue) values ('City') 

    SELECT * FROM @variableTable 
DECLARE @counter int 
declare @sql nvarchar(100) 
declare @sql2 nvarchar(25), @finalResult nvarchar(100) 
declare @sql3 nvarchar(300), @tempresultStore nvarchar(20), @temp int, @temp2 int, @average int 


SET @counter = 1 
SELECT @maxvalue = (SELECT MAX(idx) FROM @variableTable) 

select @maxvalue as 'MAXVALUE' 
WHILE(@counter <= @maxvalue) 
BEGIN 
    DECLARE @colVar nvarchar(15) 

    SELECT @colVar = matchvalue FROM @variableTable WHERE idx = @counter 
    set @sql = 'declare' +' ' + '@Temp'+ @colVar 
    exec @sql 
    select @sql as 'SQLFORDECLARATIONS' 

    set @temp = CHARINDEX(' ',@sql) 
    select @temp as 'resultofcharindex' 
    set @temp2 = @temp + 1 
    SELECT @temp2 AS 'AFTERADDING1' 
    set @tempresultStore = Right(@sql, @temp2) 
    SELECT @tempresultStore AS 'FINALCUTPART' 
set @sql3 = 'SET ' + @sql2 + '= set ' + ' ' + @tempresultStore + '=' + 'dbo.[Match' + @colVar + '](' + @colVar + 'FromUser' + ',' + @colVar + 'FromTable' + ',' + 0 + ')' 
EXEC @sql3 
select @sql3 as 'check sql query formed' 

set @finalResult = @finalResult + @sql2 
select @finalResult as 'SUM' 
    SET @counter = @counter + 1 
    select @counter as 'COUNTERVALUE' 
    END 
    set @Percentage = @finalResult/@maxvalue 
    SELECT @Percentage AS 'FINALRESULT' 
RETURN 
END 





create procedure SearchProcedure 
(
@firstname nvarchar(20), 
@middlename nvarchar(20) = null, 
@lastname nvarchar(20), 
@DOB Date = null, 
@SSN nvarchar(30)= null, 
@ZIP nvarchar(10)= null, 
@StateOfResidence nvarchar(2)= null, 
@City nvarchar(20)= null, 
@StreetName nvarchar(20)= null, 
@StreetType nvarchar(20)= null, 
@BuildingNumber int= null, 
@Aptnumber nvarchar(10)= null 
) 
As 
DECLARE @sSQL NVARCHAR(2000), @Where NVARCHAR(1000) = ' ' 
declare @Percent int, 
@FN nvarchar(20), 
@MN nvarchar(20) = null, 
@LN nvarchar(20), 
@DateOfB Date = null, 
@SSNumber nvarchar(30)= null, 
@ZIPCode nvarchar(10)= null, 
@StateOfRes nvarchar(2)= null, 
@CityOfRes nvarchar(20)= null, 
@StreetNameRes nvarchar(20)= null, 
@StreetTypeRes nvarchar(20)= null, 
@BuildingNumberRes int= null, 
@AptnumberRes nvarchar(10)= null 
set @Percent = 0 
create table #results 
(
firstname nvarchar(20) not null, 
middlename nvarchar(20), 
lastname nvarchar(20)not null, 
PercentageMatch int not null, 
DOB Date, 
SSN nvarchar(30), 
ZIP nvarchar(10), 
[State] nvarchar(2), 
City nvarchar(20), 
StreetName nvarchar(20), 
StreetType nvarchar(20), 
BuildingNumber int, 
Aptnumber nvarchar(10) 
) 

declare c Cursor local static Read_only 
for 
SELECT * from dbo.Patients where firstname = @FN 


open c 

fetch next from c into @FN, 
@MN, 
@LN, 
@DateOfB, 
@SSNumber, 
@ZIPCode, 
@StateOfRes, 
@CityOfRes, 
@StreetNameRes, 
@StreetTypeRes, 
@BuildingNumberRes, 
@AptnumberRes 

while @@FETCH_STATUS = 0 BEGIN 

/*set @Percent = dbo.[MatchLastName](@lastname, @LN, @Percent) 
set @Percent = dbo.[MatchMiddleName](@middlename, @MN, @Percent) 
set @Percent = dbo.[MatchCity](@City, @CityOfRes, @Percent)*/ 
Exec [dbo].[OutputProcedure] @lastname, @LN, @middlename, @MN,@City, @CityOfRes, @Percent output 
Insert into #results values 
(@FN,@MN,@LN,@Percent, @DateOfB,@SSNumber, @ZIPCode,@StateOfRes,@CityOfRes,@StreetNameRes,@StreetTypeRes,@BuildingNumberRes,@AptnumberRes) 
fetch next from c into @FN, 
@MN, 
@LN, 
@DateOfB, 
@SSNumber, 
@ZIPCode, 
@StateOfRes, 
@CityOfRes, 
@StreetNameRes, 
@StreetTypeRes, 
@BuildingNumberRes, 
@AptnumberRes 
end 

select * from #results order by PercentageMatch desc 
IF OBJECT_ID('tempdb..#results') IS NOT NULL DROP TABLE #results 
go 
+0

루프 내에서'PRINT @FN; '을 시도 했습니까? 거기에 출력물을 얻었습니까? 내 첫 번째 추측은 커서가'firstname = @ FN'에 대해 0 행을 처리하고 있다는 것입니다. –

+0

오, 안돼. 내가 특별히 언급 한 것처럼 검색 프로 시저가 제대로 작동하지 않을 때 outputProcedure를 호출하는 대신에 직접적으로 작업을 수행했습니다. –

+1

응답자가 아래에 주목 한 값을 입력하지 않았기 때문에 의미가 없습니다. '@ FN'. 따라서 코드가 다르면 (@FN = @ firstname'을 지정했거나 커서 선언이 다르게 보였을 때) 아마 잘 동작했을 것입니다. –

답변

1

FN을 가변 설정 코드가 누락;

declare c Cursor local static Read_only 
for 
SELECT * from dbo.Patients where firstname = @FN 

어디서나 @fn이 설정되어 있지 않습니다. 커서에 행이없는 경우 루프가 실행되지 않으므로 두 번째 프로 시저가 호출되지 않습니다.

+0

커서가'where firstname = @ firstname'이어야합니다. –

+0

제 잘못입니다. 당신이 정말 맞습니다. 너무 많이 고마워. 변수 이름을 망쳐 놓고 완전히 잊었습니다. :) –

관련 문제