2014-05-22 3 views
0

난 내가 쿼리 실행 동적 SQLSQL Server 저장 프로 시저의 동적 선택

내 저장된 프로 시저에 의해 확인하고자하는 다음과 같은 형식

create PROCEDURE [dbo].[test proc] 
@identifier varchar(20), 
@issuerName varchar(max), 
@max_records int=1000 
AS 
BEGIN 
declare @select nvarchar(30) 

SELECT @identifier as '@identifier' 
    , (
     SELECT 
     MoodysOrgID as '@MoodysOrgID' 
     ,ReportDate as '@ReportDate' 
     ,m.UpdateTime as '@UpdateTime' 
     ,m.FileCreationDate as '@FileCreationDate' 
     from mfm_financial_ratios m 
     inner join mfm_financial_ratios_coa c on c.AcctNo = m.AcctNo 
     where ReportDate in (select distinct top (@max_records) reportdate from mfm_financial_ratios where MoodysOrgID = m.MoodysOrgID) 
     and m.MoodysOrgID=(select top 1 IssuerID_Moodys as id from loans where [email protected] or [email protected] 
          and [email protected] and IssuerID_Moodys is not null) 
     order by ReportDate desc 
     FOR XML PATH('FinRatios'), TYPE 
    ) 
    FOR XML PATH('FinRatiosHistory') 

END 

만에 저장된 프로 시저 보이는 한

같은
create PROCEDURE [dbo].[test proc] 
    @identifier varchar(20), 
    @issuerName varchar(max), 
    @max_records int=1000 
    AS 
    BEGIN 
    declare @select nvarchar(30) 

set @select = N'SELECT @identifier as '@identifier' 
     , (
      SELECT 
      MoodysOrgID as '@MoodysOrgID' 
      ,ReportDate as '@ReportDate' 
      ,m.UpdateTime as '@UpdateTime' 
      ,m.FileCreationDate as '@FileCreationDate' 
      from mfm_financial_ratios m 
      inner join mfm_financial_ratios_coa c on c.AcctNo = m.AcctNo 
      where ReportDate in (select distinct top (@max_records) reportdate from mfm_financial_ratios where MoodysOrgID = m.MoodysOrgID) 
      and m.MoodysOrgID=(select top 1 IssuerID_Moodys as id from loans where [email protected] or [email protected] 
           and [email protected] and IssuerID_Moodys is not null) 
      order by ReportDate desc 
      FOR XML PATH('FinRatios'), TYPE 
     ) 
     FOR XML PATH('FinRatiosHistory')' 
exec @select 

    END 

다음 저장된 프로 시저가 사용 된 쉼표 때문에 문제가 발생합니다. 누군가 올바른 방법을 알려줄 수 있습니까?

+0

당신은 두 가지 문제가 큰 따옴표로 탈출한다 ... 첫째, 당신이 필요 각각의 작은 따옴표 (''')를 작은 따옴표 ('''' ')로 변경하여 동적 쿼리의 따옴표를 이스케이프 처리하십시오. 다음 문제는 동적 SQL 내의 변수가 범위를 벗어 났으며'sp_ExecuteSQL'을 사용하여 전달해야합니다. 그러나 동적 SQL에 의해 * 이것을 원할 이유는 없습니다. 왜이 일을하려고하는지 물어봐도 될까요? –

+0

나는 여러 샘플을 다른 샘플로 저장하지 않으므로 다른 이유로 여러 부분으로 질의를 수행 할 수있다. – user3290807

답변

0

문제는 쉼표가 아닙니다. 대부분 두 가지 문제가 있습니다. 하나는 따옴표를 올바르게 이스케이프 처리하지 않는 것입니다. 그리고 두 가지, 변수를 올바르게 연결하지 않았습니다. 첫 번째 선택 라인에서는이 작업을 수행 할 수 없습니다 :

변수을 연결의 경우 : 여기에 모두의 예입니다

SELECT @identifier as '@identifier' 

를 SQL이 @identifier 그런 식으로 무엇을 해야할지하지 않기 때문에. 당신은 변수 이런 식으로 연결할한다 : 또한

SELECT @identifier as ' + @identifier + '.. everything else goes here 

을, 당신은 이런 먼저 VARCHAR을 캐스팅해야하는 int 변수이기 때문에, max_records을 연결해야합니다 때 :

select distinct top (' + cast(@max_records as varchar(10) + ') .... 

때마다이 (@max_records와 같은) 문자열의 중간에있는 변수를 사용하고 있는데, SQL을 연결하기 위해서 SQL을 변수로 사용하기 위해서는 문자열이 아닌이 있어야합니다. max_records, @issuerName 등으로하지 않았습니다.

따옴표를 이스케이프하는 경우 : 선택한 문자열을 예기치 않게 종료하지 않으려면 작은 따옴표를 이스케이프 처리해야합니다. 여기 예를 들어 :

FOR XML PATH('FinRatiosHistory')' 

당신은 (당신이 그것을 얻을하지 않는 경우 작은 따옴표의 SQL을 탈출 구글)

FOR XML PATH(''FinRatiosHistory'')' 
관련 문제