2013-01-10 4 views
0

안녕하십니까, 이전 질문과 똑같은 사람 ... 커서/SQL에 관해서 정말 나쁘다 아래의 저장 프로 시저/커서를 사용하고 있습니다. 나는이 오류 얻을 그것을 실행하려고 할 때 내가 만든 것을 .. 제대로 컴파일 문제가 온다 :잘못된 개체 이름 'DQM.dbo.ST_0043_BLANK_CONSENT_SAP_SIEBEL'

메시지 208, 수준 16, 상태 1, 줄 1 잘못된 개체 이름 '을 DQM.dbo.ST_0043_BLANK_CONSENT_SAP_SIEBEL '.

(영향을받는 0 행 (들)) 메시지 208, 수준 16, 상태 1, 줄 1 잘못된 개체 이름 'DQM.dbo.ST_0044_CONSENT_SIEBEL_SAP_DIFF'.

(영향을받는 0 행 (들)) 메시지 208, 수준 16, 상태 1, 줄 1 잘못된 개체 이름 'DQM.dbo.ST_0045_CONSENT_SIEBEL_BANNER_DIFF'.

이제 모든 개체를 선택할 때 내가 선택한 행이 반환된다는 사실을 알고 있습니다. 어떤 도움을 주시면 감사하겠습니다.

USE [Adhoc_datafix] 
GO 
/****** Object: StoredProcedure [dbo].[CostTest_02] Script Date: 01/10/2013 15:43:32 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:  <Author,,Name> 
-- Create date: <Create Date,,> 
-- Description: <Description,,> 
-- ============================================= 
ALTER PROCEDURE [dbo].[CostTest_02] 
AS 
BEGIN 

DECLARE @Issue_id int; 
DECLARE @Master_id int; 
DECLARE @Issue_table varchar(255); 
DECLARE @price real; 
DECLARE @rowcount bigint; 
DECLARE @sql varchar(3000) 


DECLARE cost_cursor cursor FOR 
SELECT [Issue Id], [Master Issue Id], [Issue Table], [Price] 
from Adhoc_datafix..[IssueTable] 
FOR UPDATE OF [Issue Id]; 

OPEN cost_cursor; 
FETCH NEXT FROM cost_cursor into @Issue_ID, @Master_id, @Issue_table, @Price 

WHILE @@FETCH_STATUS = 0 
BEGIN 


SELECT @sql = 'Select count(*) from DQM.' + quotename(@Issue_table) 
EXEC(@sql) 
set @Rowcount = @@rowcount 


UPDATE ADHOC_DATAFIX..[Issue Cost] 
set [Issue Id] = @Issue_ID , 
    [Master Issue Id] = @Master_ID , 
    [Row Count] = @Rowcount, 
    [Cost] = CAST(@Rowcount * @price as money) 

--WHERE CURRENT OF cost_cursor; 
FETCH NEXT FROM cost_cursor into @Issue_ID, @Master_id, @Issue_table, @Price 
END 

close cost_cursor; 

DEALLOCATE cost_cursor; 
END 

답변

1
문제는 스키마와 함께 테이블 이름을 인용 QUOTENAME()을 사용하는 것 같다

:

select quotename('dbo.ST_0045_CONSENT_SIEBEL_BANNER_DIFF') 
-- returns [dbo.ST_0045_CONSENT_SIEBEL_BANNER_DIFF] 

그래서 SQL 서버 당신이 DQM[dbo.ST_0045_CONSENT_SIEBEL_BANNER_DIFF]라는 테이블을 쿼리하려고하는 생각을 스키마 :

select * from DQM.[dbo.ST_0045_CONSENT_SIEBEL_BANNER_DIFF] 

하지만 실제로는 [ST_0045_CONSENT_SIEBEL_BANNER_DIFF]이라는 테이블을 쿼리하려고합니다. dbo 스키마

select * from DQM.dbo.[ST_0045_CONSENT_SIEBEL_BANNER_DIFF] 

는이 문제를 해결, 중 DQM@Issue_Table 문자열과 하드 코드로의 시작에서 dbo. 접두사를 제거하거나 원하는 경우 다른 스키마는 스키마와 테이블을 얻을 수 PARSENAME()를 사용하여 지원하기

SELECT @sql = 'Select count(*) from DQM.' + quotename(parsename(@Issue_table, 2)) + N'.' + quotename(parsename(@Issue_table, 1)) 

을 그리고 당신은 건설 쿼리가 정말 경우 give yourself an easy wayPRINT 또는 SELECT에 대한 일반적인 제안, 동적 SQL 작업을 언제로 최종 문자열은 당신이 볼 수 있도록 : 별도의 이름을 맞다.

+0

+1 PARSENAME() 함수에 대해. tnx –

+0

고마워 이것이 유용했습니다! 그리고 이것은 보안에 대해 너무 걱정하지 않습니다. 이것은 보고서를 작성하는 데 사용할 내부적 인 것입니다. – Callum