2014-04-12 2 views
4

나는 스케쥴에 대한 기본적인 쿼리를 실행하는 SQL 에이전트 작업을 가지고있다. 표시된 쿼리를 기반으로 정보를 업데이트합니다.SQL 에이전트 작업이 계속 실패하는 이유는 무엇입니까?

USE DB 
DECLARE @startDate AS DATETIME 
DECLARE @endDate AS DATETIME 
DECLARE @rcount AS VARCHAR(10) 
SET @startDate = CAST(CONVERT(VARCHAR(10),GETDATE(),112) AS DATETIME) 
SET @endDate = CAST(CONVERT(VARCHAR(10),GETDATE(),112) AS DATETIME) 
--********************************************************* 
-- *Run Query 
--********************************************************* 
UPDATE Table1 
SET Table1.field1 = 'ZPR' + Left(Table1.field1,6), 
    Table1.field2 = '0', 
    Table1.field3 = '0' 
WHERE Table1.GUID IN (SELECT GUID FROM Table1 T2 
    WHERE T2.Date >= @startDate 
     AND T2.Date <= @endDate 
     AND T2.complete = 0) 
    AND Table1.co IN (SELECT co FROM VIEW('ZERO')) 
SELECT @rcount = CAST(@@ROWCOUNT AS VARCHAR(10)) + ' ' + 'row(s) affected by UPDATE'; 
--********************************************************* 
--* Print Results 
--********************************************************* 
DECLARE @eSubject varchar(250) 
DECLARE @emailTo varchar(250) 
SET @eSubject = 'Number of rows updated' 
SET @emailTo = '[email protected]' 
EXEC msdb.dbo.sp_send_dbmail @[email protected], 
    @subject = @eSubject, 
    @body = @rcount, 
    @body_format = 'HTML'; 

업데이트가 완료되지 않은 경우 작업이 완벽하게 실행되지만있을 때마다 실패합니다. 이 작업을 수행 한 사용자에게는 읽기 및 쓰기 권한이 있습니다. 오류는 "문자열 또는 이진 데이터가 잘릴 수 있습니다 [sql220001] [오류 8152]"입니다. 나는 왜 그것이 계속 실패하고 어떤 도움이 굉장 할 것인지 확신하지 못한다!

****************** UPDATE가 **********

내가 여기 미친거야. 예약 된 작업으로는 실패하지만 다른 사용자의 경우에는 곧은 쿼리로 완벽하게 실행됩니다. 필드는 같습니다

Table1.field1에 상관없이 내가 시도하거나 SQL 작업을하는 일 10 Table1.field2 = 1 Table1.field3의 비트 길이 = 1

의 비트 길이의 = PK 길이 같은 오류로 실패하지만 그것은 내가 그 자체로 쿼리를 실행할 수 있다는 것을 내게 알려주고 있으며 완벽하게 작동합니다.

+0

Table1.field의 정의는 무엇입니까? 그것은 'ZPR'+ 왼쪽 (Table1.field, 7) – automatic

+0

의 결과를 잡아두기에 충분하지 않은 것 같은데요. varchar (10) – BSanders

답변

4

@rcount를 varchar(50)으로 변경해보십시오. I 생각하면이 문제입니다.

편집 : 내 첫 번째 제안은, 문제를 해결할 테이블에 트리거를 찾지 않았기 때문에

. 또한 varchar (25) 필드에 50자를 넣으려고하는 트리거가 실행중인 경우에도 오류가 발생할 수 있습니다.

임의의 set 명령 (또는 @var = [여기에 데이터 삽입])을 선택하기 전에이 오류를 해결하려면 LEFT([insert data here], #) (#은 해당 필드의 최대 길이 임)을 수행하십시오.

+0

당신은 저를 때려칩니다 – HLGEM

+0

나는 그 조정을 만들었지 만 여전히 같은 문제가 있습니다. – BSanders

+0

@MattH @@ rowcount는 평균 1 ~ 2 행입니다. 무거운 날에는 5 ~ 10 행이 가장 많습니다. 이 데이터베이스에는 트리거가 전혀없고 LEFT (필드, #)를 사용하면 작업 완료에 아무런 영향을주지 않는 것 같습니다. – BSanders

1

SQL을 혼동 시키거나 문제를 일으킬 수있는 약간의 조정을했습니다. Field3은 사실 숫자 (int 등)라고 가정합니다. 또한보기의 출력을 확인 ('제로')는 숫자 또는 잘라야의 원인이되지 않습니다

USE database 
DECLARE @startDate AS DATE 
DECLARE @endDate AS DATE 
DECLARE @rcount AS VARCHAR(MAX) 
SET @startDate = GETDATE() 
SET @endDate = GETDATE() 
--********************************************************* 
--* Query 
--********************************************************* 
UPDATE Table1 
SET Table1.field = 'ZPR' + Left(isnull(Table1.field,''), 7) 
WHERE Table1.field2 IN (SELECT left(isnull(field,''),10) FROM Table2 T2 
    WHERE T2.Date >= @startDate 
     AND T2.Date <= @endDate 
     AND T2.field3 = 0) 
    AND Table1.field3 IN (SELECT field FROM VIEW('ZERO')) 
SELECT @rcount = CAST(@@ROWCOUNT AS NVARCHAR(10)) + ' ' + 'row(s) affected by UPDATE'; 
--********************************************************* 
--* Print Results 
--********************************************************* 
DECLARE @eSubject varchar(250) 
DECLARE @emailTo varchar(250) 
SET @eSubject = 'here is your email' 
SET @emailTo = '[email protected]' 
EXEC msdb.dbo.sp_send_dbmail @[email protected], 
    @subject = @eSubject, 
    @body = @rcount, 
    @body_format = 'HTML'; 
+0

변경 사항을 제안한 필드는 모두 PK가 아닌 null입니다. 나는 아직도 변화를 시도하고 일은 여전히 ​​실패한다. – BSanders

+0

스키마 문제 일 수 있습니다. dbo를 추가하십시오. 모든 테이블 참조 앞에 올바른 스키마 테이블이 있는지 확인하십시오. 나는 거기에왔다. –

4

어쩌면 문제의 원인이 표에 설정된 일부 트리거가? 있다면 그 코드도 확인해야합니다.

+0

나는 그것을 들여다 보았다. – BSanders

2

쿼리를 Disect하십시오. 매번 실행될 하나의 명령문을 추가하여 정확히을 알고 있는지 확인하십시오. 작업에서 사용할 자격 증명을 사용하여 실행해야합니다.

먼저

USE DB 
DECLARE @startDate AS DATETIME 
DECLARE @endDate AS DATETIME 
DECLARE @rcount AS VARCHAR(10) 
SET @startDate = CAST(CONVERT(VARCHAR(10),GETDATE(),112) AS DATETIME) 
SET @endDate = CAST(CONVERT(VARCHAR(10),GETDATE(),112) AS DATETIME) 

그런 다음 등

USE DB 
DECLARE @startDate AS DATETIME 
DECLARE @endDate AS DATETIME 
DECLARE @rcount AS VARCHAR(10) 
SET @startDate = CAST(CONVERT(VARCHAR(10),GETDATE(),112) AS DATETIME) 
SET @endDate = CAST(CONVERT(VARCHAR(10),GETDATE(),112) AS DATETIME) 
--********************************************************* 
-- *Run Query 
--********************************************************* 
UPDATE Table1 
SET Table1.field1 = 'ZPR' + Left(Table1.field1,6), 
    Table1.field2 = '0', 
    Table1.field3 = '0' 
WHERE Table1.GUID IN (SELECT GUID FROM Table1 T2 
    WHERE T2.Date >= @startDate 
     AND T2.Date <= @endDate 
     AND T2.complete = 0) 
    AND Table1.co IN (SELECT co FROM VIEW('ZERO')) 

당신은 예외가 발생하는 부분을 정확히 알고있을 때까지.

나는 UPDATE Table1 문이라고 가정합니다. 그 해부를 시작하십시오. field1, field1, field2 등만 업데이트하면됩니다. subselect에서와 유사하게 - 모든 절을 제거하고 중단 될 때까지 한 번에 하나씩 추가하십시오.

내 생각에 - 당신과 작업 실행 자격 증명이 다른 기본 스키마를 가지고 있습니다. 옵티마이 저는 사용자와 작업에 대해 서로 다른 개체 집합을 사용하고 있습니다. 내 생각 엔 당신의 Table1.field1은 작업의 Table1.field1과 다른 길이입니다. 이 수정 사항은 개체 참조에 스키마 (예 : UPDATE dbo.Table1)의 접두사를 붙이는 것입니다. 이것은 에있는 모든 성명에서 가장 좋습니다.

제쳐두고 field2와 field3은 bit로 정의되어 있지만 char (1)로 설정하고 있습니다. 따옴표를 제거하고 암시 적 유형 변환을 저장하십시오. WHERE T2.Date >= @startDate AND T2.Date <= @endDateWHERE T2.Date BETWEEN @startDate AND @endDate으로 더 좋을 것입니다.

3

변수 @rcount의 최대 크기는 10입니다. 예 : VARCHAR(10). 당신이 당신의 쇼 SQL의 끝에서 알 수 그러나

당신은 :

SELECT @rcount = CAST(@@ROWCOUNT AS VARCHAR(10)) + ' ' + 'row(s) affected by UPDATE'; 

이 두 배 이상 최대 크기입니다. @rcount을 큰 숫자 VARCHAR으로 늘려보십시오. -RosSQL

2

0 또는 cast(0 as bit) 대신 '0'field2field3 설정을 시도 했습니까?

2

직장에서이 성명서를 주석으로 처리하고 이것이 작동하는지 확인하십시오. 편집에서 설명하는 것부터 정의와 할당은 괜찮습니다.

SELECT @rcount = CAST(@@ROWCOUNT AS VARCHAR(10)) + ' ' + 'row(s) affected by UPDATE'; 
관련 문제