Perché cursore mostra errore
-
10-07-2019 - |
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.
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