Domanda

funziona su SQL Server 2000. voglio Notifiche e-mail automatiche usando Pianificazione lavori SQL Server.Se eseguo la sintassi del cursore qui sotto nell'analizzatore di query di quanto non ottenga alcun errore. Ma quando imposto questa sintassi su SqlServer agent- > Jobs quindi è creare errore.

-- Script generated on 29-Oct-09 11:57 AM
-- By: sa
-- Server: (LOCAL)

BEGIN TRANSACTION            
  DECLARE @JobID BINARY(16)  
  DECLARE @ReturnCode INT    
  SELECT @ReturnCode = 0     
IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'[Uncategorized (Local)]') < 1 
  EXECUTE msdb.dbo.sp_add_category @name = N'[Uncategorized (Local)]'

  -- Delete the job with the same name (if it exists)
  SELECT @JobID = job_id     
  FROM   msdb.dbo.sysjobs    
  WHERE (name = N'Check4')       
  IF (@JobID IS NOT NULL)    
  BEGIN  
  -- Check if the job is a multi-server job  
  IF (EXISTS (SELECT  * 
              FROM    msdb.dbo.sysjobservers 
              WHERE   (job_id = @JobID) AND (server_id <> 0))) 
  BEGIN 
    -- There is, so abort the script 
    RAISERROR (N'Unable to import job ''Check4'' since there is already a multi-server job with this name.', 16, 1) 
    GOTO QuitWithRollback  
  END 
  ELSE 
    -- Delete the [local] job 
    EXECUTE msdb.dbo.sp_delete_job @job_name = N'Check4' 
    SELECT @JobID = NULL
  END 

BEGIN 

  -- Add the job
  EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT , @job_name = N'Check4', @owner_login_name = N'sa', @description = N'No description available.', @category_name = N'[Uncategorized (Local)]', @enabled = 1, @notify_level_email = 0, @notify_level_page = 0, @notify_level_netsend = 0, @notify_level_eventlog = 2, @delete_level= 0
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 

  -- Add the job steps
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id = 1, @step_name = N'Step4', @command = N'DECLARE 
@out_desc VARCHAR(1000),
@out_mesg VARCHAR(10)

DECLARE @name VARCHAR(20),
@birthdate datetime,
@email NVARCHAR(50) 



DECLARE @body NVARCHAR(1000)

DECLARE C1 CURSOR READ_ONLY
FOR
SELECT [Name],[BirthDate],[Email]
FROM Customers3

OPEN C1
FETCH NEXT FROM C1 INTO 
@name, @birthdate, @email
WHILE @@FETCH_STATUS = 0
BEGIN


Declare @a int
SELECT @a=count(*) FROM Customers   where name like ''%s%''

    IF DATEPART(DAY,@birthdate) = DATEPART(DAY,GETDATE())
    AND DATEPART(MONTH,@birthdate) = DATEPART(MONTH,GETDATE())
        AND DATEPART(hour,@birthdate) = DATEPART(hour,GETDATE())
        AND DATEPART(minute,@birthdate) = DATEPART(minute,GETDATE())
    BEGIN
        SET @body = ''<b>HappyBirthday '' + @name + ''</b><br />Many happy returns of the day''+@a+''''
        + ''<br /><br />Customer Relationship Department''
        EXEC sp_send_mail 
        ''nahid10@gmail.com'', --- add your Email Address here
        ''n7n10u'',       ----add your Password here
        @email,
        ''Birthday Wishes'', 
        @body,
        ''htmlbody'', @output_mesg = @out_mesg output, @output_desc = @out_desc output

        PRINT @out_mesg
        PRINT @out_desc
    END 
    FETCH NEXT FROM C1 INTO 
    @name, @birthdate, @email
END
CLOSE C1
DEALLOCATE C1
', @database_name = N'CustomerDetails', @server = N'', @database_user_name = N'', @subsystem = N'TSQL', @cmdexec_success_code = 0, @flags = 0, @retry_attempts = 0, @retry_interval = 1, @output_file_name = N'', @on_success_step_id = 0, @on_success_action = 1, @on_fail_step_id = 0, @on_fail_action = 2
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID, @start_step_id = 1 

  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 

  -- Add the job schedules
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID, @name = N'Schedule4', @enabled = 1, @freq_type = 8, @active_start_date = 20091029, @active_start_time = 115200, @freq_interval = 16, @freq_subday_type = 4, @freq_subday_interval = 5, @freq_relative_interval = 0, @freq_recurrence_factor = 1, @active_end_date = 99991231, @active_end_time = 145959
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 

  -- Add the Target Servers
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID, @server_name = N'(local)' 
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 

END
COMMIT TRANSACTION          
GOTO   EndSave              
QuitWithRollback:
  IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 
EndSave: 

desidera inviare gli auguri di buon compleanno e anche informare quanti utenti hanno il giorno della nascita oggi.

È stato utile?

Soluzione

Senza un messaggio di errore è difficile diagnosticare il problema.

Onestamente, il codice è un casino. Ecco un primo taglio del testo interno. Ho corretto il cursore, il tuo linguaggio di iterazione e il tuo filtro per la data di nascita. Non so cosa stai cercando di fare w / @a, ma è sbagliato.

DECLARE 
  @out_desc VARCHAR(1000)
, @out_mesg VARCHAR(10)
, @name VARCHAR(20)
, @birthdate datetime
, @email NVARCHAR(50)
, @body NVARCHAR(1000)

-- Use a cursor variable for easier scoping:
DECLARE @C1 CURSOR

-- Since Birthdate = Today should be very selective, we
-- use the STATIC keyword to materialize the results in tempdb 
-- before iteration.
SET @C1 = CURSOR STATIC FOR
  SELECT [Name],[BirthDate],[Email]
  FROM Customers3
  WHERE BirthDate = DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)


-- Since we used the STATIC keywork, calling OPEN will execute the SELECT statement above
-- and materialize the results in tempdb. The cursor will then iterate over the materialized
-- results in tempdb, rather than Customers3.
OPEN @C1

-- this is a better idiom for cursor iteration: one FETCH NEXT, rather then two
-- and therefore fewer places you need to touch the code to make changes
WHILE 1=1 BEGIN
  FETCH NEXT FROM @C1 INTO @name, @birthdate, @email
  IF @@FETCH_STATUS <> 0 BREAK

  -- this is wrong, whatever you are trying to do.
  Declare @a int
  SELECT @a=count(*) FROM Customers   where name like '%s%'

  -- moved to the cursor WHERE clause. Why were you filtering on hour and minute?
  -- IF DATEPART(DAY,@birthdate) = DATEPART(DAY,GETDATE())
  -- AND DATEPART(MONTH,@birthdate) = DATEPART(MONTH,GETDATE())
  --     AND DATEPART(hour,@birthdate) = DATEPART(hour,GETDATE())
  --     AND DATEPART(minute,@birthdate) = DATEPART(minute,GETDATE())
  --  BEGIN

    -- to concatenant an INT, you must first convert it to a varchar
    SET @body = '<b>HappyBirthday ' + @name + '</b><br />Many happy returns of the day'+CONVERT(VARCAR(30),@a)+''
    + '<br /><br />Customer Relationship Department'

    EXEC sp_send_mail 
    'nahid10@gmail.com', --- add your Email Address here
    'n7n10u',       ----add your Password here
    @email,
    'Birthday Wishes', 
    @body,
    'htmlbody', @output_mesg = @out_mesg output, @output_desc = @out_desc output

    PRINT @out_mesg
    PRINT @out_desc

END
CLOSE @C1
DEALLOCATE @C1
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top