Abhi1 Kanobi Ответов: 2

Передача переменных в URL-адресе через хранимую процедуру


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[spc_getemail]
As
Begin
-- Declare Variable To Hold The Email Address Retrived
DECLARE @Email varchar(255)
DECLARE @Name  varchar(255)
DECLARE @ID    int
--Declare Cursor  to loop through the table data
DECLARE EmailCursor Cursor For
Select ID,email,name from demoemail
-- Open cursor for fetching data in email variable
open EmailCursor 
Fetch Next From EmailCursor into @ID,@Email,@Name
while(@@FETCH_STATUS = 0)
Begin
DECLARE @out_desc varchar(1000),
@out_mesg varchar(10)

EXEC  [dbo].[sp_send_mail] 
'a@a.com',
'a@g.com',
' Newsletter Submission',
'<a href=''http://someurl.com?id=' + CAST(@ID As varchar(20)) + '''>Please click here to fill your missing details',
'htmlbody', 
@output_mesg = @out_mesg output,
@output_desc = @out_desc output
print 'Email id  is ' + @Email
print 'Email id  is ' + @ID
End;
Close EmailCursor
Deallocate EmailCursor
End;


Что я уже пробовал:

Я перепробовал все escape-последовательности в sql для разрешения.

PeejayAdams

Это очень трудно сказать, не видя вашего определения IDCursor и Вашего объявления @ID.

Abhi1 Kanobi

декларация приводится ниже.

Начать
-- Объявите Переменную, Чтобы Сохранить Адрес Электронной Почты Восстановленным
Объявить @Email varchar(255)
Объявить @Name varchar(255)
Объявить @ID int


-- Объявить курсор для циклического перебора табличных данных
Объявить курсор EmailCursor для
Выберите email из demoemail

Объявите курсор NameCursor для
Выберите имя из демо-почты


Объявите курсор IDCursor для
Выберите ID из demoemail


-- Открыть курсор для выборки данных в переменной электронной почты
откройте EmailCursor
Fetch Next From EmailCursor into @Email

открыть NameCursor
Fetch Next from NameCUrsor into @Name

открыть IDCursor
Fetch Next from IDCUrsor into @ID

Richard Deeming

Очевидная проблема заключается в том, что вы упускаете + между различными частями струны:

'<a href=''http://newsletter.qendidate.com?id=' + @ID + '''>Please click here to fill your missing details </a>'

Кроме того, вам не нужны три отдельных курсора; вам просто нужен один курсор, который выбирает три поля.

Abhi1 Kanobi

Он все еще выдает ошибку как " неправильный sysntax near +"

Abhi1 Kanobi

Используйте [orion]
ГО

УСТАНОВИТЕ ANSI_NULLS ON
ГО
УСТАНОВИТЕ QUOTED_IDENTIFIER НА
ГО
Изменить процедуру [dbo].[spc_getemail]
Как
Начать
-- Объявите Переменную, Чтобы Сохранить Адрес Электронной Почты Восстановленным
Объявить @Email varchar(255)
Объявить @Name varchar(255)
Объявить @ID int
-- Объявить курсор для циклического перебора табличных данных
Объявить курсор EmailCursor для
Выберите ID, адрес электронной почты,имя из демо-почты
-- Открыть курсор для выборки данных в переменной электронной почты
откройте EmailCursor
Принести следующий из EmailCursor в @ИД@электронной почты@имя
while (@@FETCH_STATUS = 0)
Начать
Объявить @out_desc varchar(1000),
@out_mesg varchar (10)

EXEC [dbo].[sp_send_mail]
'2@a.com',
'a@a.com',
Представление Бюллетень',
в '<а href="someurl.ком?идентификатор='+удостоверение"в'>Пожалуйста, нажмите здесь, чтобы заполнить недостающие детали ',
'параметр htmlbody',
@output_mesg = выход @out_mesg ,
@output_desc = выход @out_desc
распечатать электронный идентификатор ' + @письмо
распечатать электронный идентификатор ' + @ИД
Конец;
Закрыть EmailCursor
Освободить EmailCursor
Конец;

Richard Deeming

Потому что вы не использовали правильный синтаксис!

Что я выложил:

'<a href=''http://newsletter.qendidate.com?id=' + @ID + '''...

То, что вы использовали:
'<a href=''http://newsletter.qendidate.com?id=' + @ID'''...


Посмотрите внимательно на них обоих и поиграйте в игру "найди разницу".

Abhi1 Kanobi

ладно,
но я использовал его так, как вы указали . пожалуйста, смотрите ниже, ошибка все еще существует

EXEC [dbo].[sp_send_mail]
'a@a.com',
'a@a.com',
"Подчинение",
'< a href="http://someurl.com?id=' + @ID + "' & gt; пожалуйста, нажмите здесь, чтобы заполнить недостающие данные ',
'параметр htmlbody',
@output_mesg = выход @out_mesg ,
@output_desc = выход @out_desc
распечатать электронный идентификатор ' + @письмо
распечатать электронный идентификатор ' + @ИД
Конец;

Richard Deeming

А ошибка есть?

Richard Deeming

Попробуй:

'<a href=''http://someurl.com?id=' + CAST(@ID As varchar(20)) + '''>Please click here to fill your missing details '

Abhi1 Kanobi

ошибка все еще существует, то же самое с"+", а теперь и с @ID

Richard Deeming

А ОШИБКА ЕСТЬ????

Если вам нужна помощь, чтобы исправить ошибку, вы должны сказать нам, что это за ошибка. Мы же не экстрасенсы!

Abhi1 Kanobi

ошибка конкатенации та же, неправильный синтаксис рядом с"+"

неправильный синтаксис рядом с @id, ожидая ' ('или select ..

неправильный синтаксис около 20, ожидая ' ('или select ..

Richard Deeming

Если вы получаете эти сообщения об ошибках, значит, вы не используете код, который я опубликовал.

'<a href=''http://someurl.com?id=' + CAST(@ID As varchar(20)) + '''>Please click here to fill your missing details</a>'

Abhi1 Kanobi

Здравствуйте сэр,
Я использую его именно так как вы указали сэр

Richard Deeming

Ну, это явно не так, потому что если бы Вы были там, то не получили бы тех двух ошибок, которые вы опубликовали.

Не пытайтесь ввести код, так как вы продолжаете делать ошибки. Скопируйте код из моего комментария и вставьте его в свой запрос.

Abhi1 Kanobi

Именно это я и делаю, сэр, копируя код из commnt .
есть ли в любом случае , что я могу показать вам, что я вижу?, эта ошибка сводит меня с ума .:)

Richard Deeming

Сделайте снимок экрана, разместите его на сайте обмена изображениями, например В imgur[^], и разместите ссылку на изображение здесь.

Abhi1 Kanobi

http://imgur.com/6677LfG

Richard Deeming

Подсветка синтаксиса выглядит нормально, так что где-то еще в коде должна быть ошибка.

Abhi1 Kanobi

вы хотите, чтобы я поделился полным кодом?.

Richard Deeming

Да, если вы не видите ошибки, возможно, кто-то другой сможет ее заметить. :)

Abhi1 Kanobi

я думаю, уже загрузил весь код

Richard Deeming

Хорошо, похоже, что вы не можете использовать + когда вы передаете строку в качестве параметра. Вместо этого вам нужно объявить отдельную переменную:

DECLARE @body varchar(max) = '<a href=''http://someurl.com?id=' + CAST(@ID As varchar(20)) + '''>Please click here to fill your missing details</a>';
EXEC dbo.sp_send_mail
    'a@a.com',
    'a@g.com',
    'Newsletter Submission',
    @body,
    'htmlbody',
    ...


Вы также пропускаете Fetch Next From позвоните в пределах цикла, и вам понадобится CAST чтобы распечатать идентификатор:
    print 'Email id is ' + CAST(@ID As varchar(20))
    Fetch Next From EmailCursor into @ID,@Email,@Name
End;

Bryian Tan

Да. Это должно сработать. почему-то exec SP не любит конкатенацию строк в параметрах.

Abhi1 Kanobi

Привет спасибо за Ваш вклад ,
но, увы, сгенерированная ссылка все равно не перенаправляет на нужную мне страницу .

Его перенаправляют на ... https://aydacfu.xyz/?affiliate_id=12& origin=информационный бюллетень.квендидат.

Richard Deeming

Ну, это совсем другой вопрос. Либо ссылка изменяется по вашему обычаю sp_send_mail процедура; или она изменяется вашим почтовым сервером; или что-то не так с вашим сайтом.

Abhi1 Kanobi

Привет спасибо за Ваш вклад ,
но, увы, сгенерированная ссылка все равно не перенаправляет на нужную мне страницу .

Его перенаправляют на ... https://aydacfu.xyz/?affiliate_id=12& origin=информационный бюллетень.квендидат.

2 Ответов

Рейтинг:
15

Abhi1 Kanobi

Я обновил URL-адрес, и теперь id-это braodcasting .

Спасибо всем за вклад

DECLARE @body varchar(max) = 
'<a href=''http://someurl.com/?id=' + CAST(@ID As varchar(20))+'''>Please click here to fill your missing details</a>';

EXEC  [dbo].[sp_send_mail] 
'a@a.com',
@Email,
' Submission',
 @body,
'htmlbody', 


Рейтинг:
0

cjmakwana

Хотя это решение может работать, с архитектурной точки зрения оно не является подходящим решением, поскольку мы вызываем слишком много бизнес-функций, используя только один SP. На мой взгляд, на бизнес-уровне должно быть разделение интересов и должен соблюдаться SRP (принцип единой ответственности). Если этот SP написан ради достижения производительности, то коэффициент производительности должен быть улучшен каким-то другим способом, но не за счет ремонтопригодности кода.