SQL 저장 프로 시저 조건부 where 절이 구문 오류를 반환합니다.

데이비드 클리튼

2 개의 매개 변수를 사용하는 다음 저장 프로 시저가 있습니다. @Class 매개 변수는 11 개의 값 중 하나를 가질 수 있습니다. 값에 따라 where 절은 다른 열을 봅니다.

프로 시저가 정상적으로 컴파일되고 인쇄를 복사하여 새 쿼리 창에 붙여 넣으면 제대로 실행되지만 프로 시저를 실행하면 '브리스톨'근처에 잘못된 구문 오류 메시지가 표시되지만 어떻게해야하는지 알아낼 수 없습니다. 여기와 다른 웹 페이지를 보더라도 수정하십시오. 어떤 도움이라도 대단히 감사하겠습니다.

ALTER PROCEDURE [TTR_HazDriver]
@Depot nvarchar(50),
@Class nvarchar(1)

AS
BEGIN
DECLARE @Where nvarchar(1000)
DECLARE @sSql nvarchar(MAX)
DECLARE @Order nvarchar(1000)

SET @sSql = '
SELECT EM.EmployeeNumber
, EM.EmployeeSurname
, EM.EmployeeInitials
, D.Depot
, EDL.Class1
, EDL.Class2
, EDL.Class3
, EDL.Class4
, EDL.Class5
, EDL.Class6
, EDL.Class7
, EDL.Class8
, EDL.Class9
, CONVERT(VARCHAR(10),EDL.ExpiryDate, 103) ExpiryDate
, EDL.Tanks
, EDL.Package
FROM   EmployeeMaster EM 
LEFT OUTER JOIN PayrollFrequency PF ON EM.FrequencyDesc = PF.DescCode 
INNER JOIN EmployeeDrivingLicence EDL ON EM.EmpCode = EDL.EmpCode 
LEFT OUTER JOIN Depot D ON EM.Depot = D.DescCode'

SET @Where = '
WHERE (D.Depot = ''' + @Depot + ''' OR ''' + @Depot + ''' IS NULL)
AND EM.EmployeeLeft = ''N''
AND PF.FrequencyDesc = ''Weekly'''



SET @Order = '
    ORDER BY D.DepotDepotDescription
    , EDL.ExpiryDate'

IF @Class = '1' 
SET @Where = @Where + ' AND EDL.Class1 = ''Y'''
IF @Class = '2' 
SET @Where = @Where + ' AND EDL.Class2 = ''Y'''
IF @Class = '3' 
SET @Where = @Where + ' AND EDL.Class3 = ''Y'''
IF @Class = '4' 
SET @Where = @Where + ' AND EDL.Class4 = ''Y'''
IF @Class = '5' 
SET @Where = @Where + ' AND EDL.Class5 = ''Y'''
IF @Class = '6' 
SET @Where = @Where + ' AND EDL.Class6 = ''Y'''
IF @Class = '7' 
SET @Where = @Where + ' AND EDL.Class7 = ''Y'''
IF @Class = '8' 
SET @Where = @Where + ' AND EDL.Class8 = ''Y'''
IF @Class = '9' 
SET @Where = @Where + ' AND EDL.Class9 = ''Y'''
IF @Class = 'T' 
SET @Where = @Where + ' AND EDL.Tanks = ''Y'''
IF @Class = 'P' 
SET @Where = @Where + ' AND EDL.Package = ''Y'''


SET @sSql = @sSql + @Where + @Order
PRINT @sSql

EXEC sp_executesql @sSQL, @Depot, @Class
END

print 문은 다음 쿼리를 생성합니다.

SELECT EM.EmployeeNumber
 , EM.EmployeeSurname
 , EM.EmployeeInitials
 , D.Depot
 , EDL.Class1
 , EDL.Class2
 , EDL.Class3
 , EDL.Class4
 , EDL.Class5
 , EDL.Class6
 , EDL.Class7
 , EDL.Class8
 , EDL.Class9
 , CONVERT(VARCHAR(10),EDL.ExpiryDate, 103) ExpiryDate
 , EDL.Tanks
 , EDL.Package
 FROM   EmployeeMaster EM 
 LEFT OUTER JOIN PayrollFrequency PF ON EM.FrequencyDesc = PF.DescCode 
 INNER JOIN EmployeeDrivingLicence EDL ON EM.EmpCode = EDL.EmpCode 
 LEFT OUTER JOIN Depot D ON EM.DepotDepotDescription = D.DescCode
 WHERE (D.DepotDepotDescription = 'Bristol' OR 'Bristol' IS NULL)
 AND PF.FrequencyDesc = 'Weekly'
 AND EDL.Class3 = 'Y'
    ORDER BY D.Depot
    , EDL.ExpiryDate
Max Szczurek

매개 변수 값을 쿼리 변수에 포함하고 있으므로 sp_executesql 호출에 매개 변수를 추가 할 필요가 없으므로 다음과 같이 작동합니다.

EXEC sp_executesql @sSQL

대신에:

EXEC sp_executesql @sSQL, @Depot, @Class

다음은 DDL 문을 사용한 전체 작업 예제입니다. 마지막 줄을 원래 버전으로 바꾸면 구문 오류가 발생합니다.

CREATE TABLE EmployeeMaster (EmployeeNumber INT, EmployeeSurname VARCHAR(25), EmployeeInitials VARCHAR(10), FrequencyDesc VARCHAR(25), EmpCode VARCHAR(25), Depot VARCHAR(25), EmployeeLeft VARCHAR(1))
CREATE TABLE PayrollFrequency (DescCode VARCHAR(25), FrequencyDesc VARCHAR(25))
CREATE TABLE EmployeeDrivingLicence (EmpCode VARCHAR(25), Class1 VARCHAR(1), Package VARCHAR(1), Tanks VARCHAR(1))
ALTER TABLE EmployeeDrivingLicence ADD ExpiryDate DATETIME
CREATE TABLE Depot (Depot VARCHAR(25), DescCode VARCHAR(25), DepotDepotDescription VARCHAR(25))

CREATE PROCEDURE [TTR_HazDriver]
@Depot nvarchar(50),
@Class nvarchar(1)

AS
BEGIN

...

EXEC sp_executesql @sSQL
END
GO

EXEC [TTR_HazDriver] 'test', 'P'

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

저장 프로 시저에 전달 된 매개 변수를 기반으로 where 절에서 조건 확인

분류에서Dev

이 저장 프로 시저를 T-SQL에서 MySQL 구문으로 변환 하시겠습니까?

분류에서Dev

if 조건이있는 mysql 저장 프로 시저가 오류를 제공합니다.

분류에서Dev

IN 조건이있는 저장 프로 시저 구문

분류에서Dev

MYSQL 저장 프로 시저가 where 절을 확인하지 않고 전체 테이블을 반환합니다.

분류에서Dev

저장 프로 시저 동적 WHERE 조건 SQL

분류에서Dev

저장 프로 시저 구문 오류

분류에서Dev

SQL Server 저장 프로 시저가 select 문에 값을 반환합니다.

분류에서Dev

SQL Server 저장 프로 시저의 구문 오류 이스케이프 문자열

분류에서Dev

SqlList <DynamicPoco>는 저장 프로 시저에서 동적 형식 구조를 반환합니다.

분류에서Dev

값이 0 인 where 절이 SQL Server 저장 프로 시저의 위치를 확인하지 않도록하려면 어떻게해야합니까?

분류에서Dev

MySQL 저장 프로시 저는 WHERE 절을 무시하고 모든 행을 반환합니다.

분류에서Dev

실행시 저장 프로 시저가 오류를 발생 시키는데 오류가 표시된 잘못된 구문이 표시되지 않습니다.

분류에서Dev

저장 프로 시저의 Oracle 조건부 WHERE

분류에서Dev

SQL 저장 프로 시저의 where 절에서 날짜 비교

분류에서Dev

SQL Server 저장 프로 시저-Where 절 생성

분류에서Dev

SQL Server 저장 프로 시저 WHERE 절 IF CASE 값 없음

분류에서Dev

조건이있는 SQL Server 저장 프로 시저

분류에서Dev

MySql 저장 프로 시저가 값 오류를 반환합니다.

분류에서Dev

저장 프로 시저 WHERE 절

분류에서Dev

저장 프로 시저를 만드는 MySQL 구문 오류

분류에서Dev

사용자 제어가 SQL Server 저장 프로 시저를 실행하면 DataTable 이벤트 처리기 오류가 반환됩니다.

분류에서Dev

SQL 저장 프로 시저의 오류

분류에서Dev

SQL 명령이 재귀 저장 프로 시저를 호출합니다.

분류에서Dev

MySQL 저장 프로 시저 테이블이 있는지 확인한 다음 구문 오류 변경

분류에서Dev

저장 프로 시저 SQL의 네임 스페이스 오류

분류에서Dev

SQL Server 저장 프로 시저 업데이트 오류

분류에서Dev

모든 경우에 값을 반환하는 MS SQL 조건부 저장 프로 시저

분류에서Dev

저장 프로 시저가 다른 저장 프로 시저의 구조를 반환하지 않도록하는 방법

Related 관련 기사

  1. 1

    저장 프로 시저에 전달 된 매개 변수를 기반으로 where 절에서 조건 확인

  2. 2

    이 저장 프로 시저를 T-SQL에서 MySQL 구문으로 변환 하시겠습니까?

  3. 3

    if 조건이있는 mysql 저장 프로 시저가 오류를 제공합니다.

  4. 4

    IN 조건이있는 저장 프로 시저 구문

  5. 5

    MYSQL 저장 프로 시저가 where 절을 확인하지 않고 전체 테이블을 반환합니다.

  6. 6

    저장 프로 시저 동적 WHERE 조건 SQL

  7. 7

    저장 프로 시저 구문 오류

  8. 8

    SQL Server 저장 프로 시저가 select 문에 값을 반환합니다.

  9. 9

    SQL Server 저장 프로 시저의 구문 오류 이스케이프 문자열

  10. 10

    SqlList <DynamicPoco>는 저장 프로 시저에서 동적 형식 구조를 반환합니다.

  11. 11

    값이 0 인 where 절이 SQL Server 저장 프로 시저의 위치를 확인하지 않도록하려면 어떻게해야합니까?

  12. 12

    MySQL 저장 프로시 저는 WHERE 절을 무시하고 모든 행을 반환합니다.

  13. 13

    실행시 저장 프로 시저가 오류를 발생 시키는데 오류가 표시된 잘못된 구문이 표시되지 않습니다.

  14. 14

    저장 프로 시저의 Oracle 조건부 WHERE

  15. 15

    SQL 저장 프로 시저의 where 절에서 날짜 비교

  16. 16

    SQL Server 저장 프로 시저-Where 절 생성

  17. 17

    SQL Server 저장 프로 시저 WHERE 절 IF CASE 값 없음

  18. 18

    조건이있는 SQL Server 저장 프로 시저

  19. 19

    MySql 저장 프로 시저가 값 오류를 반환합니다.

  20. 20

    저장 프로 시저 WHERE 절

  21. 21

    저장 프로 시저를 만드는 MySQL 구문 오류

  22. 22

    사용자 제어가 SQL Server 저장 프로 시저를 실행하면 DataTable 이벤트 처리기 오류가 반환됩니다.

  23. 23

    SQL 저장 프로 시저의 오류

  24. 24

    SQL 명령이 재귀 저장 프로 시저를 호출합니다.

  25. 25

    MySQL 저장 프로 시저 테이블이 있는지 확인한 다음 구문 오류 변경

  26. 26

    저장 프로 시저 SQL의 네임 스페이스 오류

  27. 27

    SQL Server 저장 프로 시저 업데이트 오류

  28. 28

    모든 경우에 값을 반환하는 MS SQL 조건부 저장 프로 시저

  29. 29

    저장 프로 시저가 다른 저장 프로 시저의 구조를 반환하지 않도록하는 방법

뜨겁다태그

보관