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
매개 변수 값을 쿼리 변수에 포함하고 있으므로 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] 삭제
몇 마디 만하겠습니다