1

저장 프로 시저에 통합하려고하는 CTE가 다소 복잡합니다. SQL Server Management Studio에서 곧바로 작동 할 때 작동합니다. 저장 프로 시저에 내 CTE를 통합하려고 할 때여러 CTE를 사용하는 구문 오류

Msg 102, Level 15, State 1, Procedure spMyCrazyProc, Line 56

Incorrect syntax near ','.

내가 구문을 잘못 무슨 짓을 : 내 저장 프로 시저를 만들려고 할 때 오류가 발생합니다?

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[spMyCrazyProc]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) 
drop procedure [dbo].[spMyCrazyProc] 
GO 

SET ANSI_NULLS ON 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE dbo.spMyCrazyProc 
    @CompanyId Int, 
    @EmployeeIds varchar(MAX) 
AS 


;with SelectedEmployees as ( 
    select * from vwEmployee e 
     where e.CompanyId = @CompanyId 
      and (@EmployeeIds is null or @EmployeeIds='' or exists(select ce.SelectedEmployeeId from #myTmpTable ce where ce.SelectedEmployeeId=e.EmployeeId) 
), MyStuffA as ( 
    select * from SelectedEmployees 
) 
select * from MyStuffA 

GO 
+1

(제쳐두고, 코드가 저장 프로 시저 본문 외부에서 작동하는 방식은 없습니다. 또한 동일한 오류가 발생합니다. 비슷한 오류 (그냥 더 이상 쉼표를 가리키고) 단지 하나의 CTE가 있다면. 난 당신이 텍스트를 오른쪽으로 화면에서 강제로 때문에 구문 오류를 놓친 용의자. 나는 그 방법을 내 왼쪽 들여 쓰기와 캐리지 리턴은 친구입니다. 화면에서 스크롤하여 화면을 스크롤하도록 강요하는 의식의 흐름은 누구에게 도움이되지 않습니다. –

+0

또한 300 개 이상의 행이 있습니까? 정말? 저는 꽤 복잡한 쿼리를 다루었습니다. 나는 당신보다 훨씬 더 자유로운 캐리지 리턴을 가지고 있습니다. 마지막으로 100 줄 넘는 T-SQL을 다룰 때 기억하지 못합니다. –

+0

그래 ... 나는 그 길이만큼 좋아하지 않았다. 우리의 SSRS 구현은 모든 로직을 일반적인 코드가 아닌 SQL로 가져와야했습니다. 많은 노동 조합, 사건, 심지어는 교차 신청도 있습니다. – REW

답변

4

현명한 코딩 규칙을 사용하고 가독성 (들여 쓰기, 캐리지 리턴)을 생각하면이 간단한 오류가 훨씬 더 명확하게 나타납니다. 500 자의 문자 폭을 가진 코드가 제거되었습니다 :

+0

CTE 앞에있는 ';'는 프로 시저 정의의 일부인 경우 프로 시저의 'AS'바로 뒤에 있습니까? –

+1

@a_horse_with_no_name 코드를 복사 할 사람과 코드를 붙여 넣을 위치를 알 수 없기 때문에 항상 사용하는 경향이 있습니다. 그러나 예,'AS' 다음에 유효합니다. 예를 들면 다음과 같습니다 :'CREATE PROCEDURE dbo.blat AS; SELECT 1;'(개인적으로 항상 BEGIN과 SET NOCOUNT ON; '및 프로 시저의 다른 코드 앞에). 세미콜론은 명령문 종결 자이므로 항상 유효합니다 (실제로는 명령문을 종료하지 않아도되는 경우 제외). 예를 들어';;;;;/* comment */;;; SELECT 1 ;;;; SELECT 2 ;;;;;는 잘 작동합니다 ... –

+0

행은 158 자이 아니라 500 자입니다 : P Thanks 너의 도움으로! – REW